ports/benchmarks/rawio/files/patch-ad
Stefan Eßer 081930c498 Fix rawio for sequential read/write tests:
Revision 1.3 of patch-ad worked around the problem, that only one writer
is allowed to allow a partition through GEOM. The fix was not complete,
leading to the file position not been incremented during reads and writes,
thus not testing sequential performance, but performance of cached reads
and writes, in general.

This fix makes rawio report reasonable sequential performance again,
but I'm still very suspicious with regard to randomized start positions
working. The results do not show the expected variation of sequential
read/write performance. I have not had time to look into this any deeper,
though, and thus decidied to not delay the commit any further ...
2006-10-09 17:19:54 +00:00

270 lines
8.2 KiB
Text

--- rawio.c.orig Mon Nov 27 04:28:19 2000
+++ rawio.c Tue Jun 20 23:03:20 2006
@@ -58,6 +58,9 @@
#endif
#ifdef BSD4_4
#include <sys/disklabel.h>
+#if __FreeBSD__ >= 5
+#include <sys/disk.h>
+#endif
#endif
#include "randoms.h"
@@ -99,6 +102,7 @@
char *buf; /* and what we're using, for alignment */
int file;
size_t length;
+u_int sectorsize;
int count;
enum operation
@@ -331,13 +335,7 @@
maxchunk = (size_t) atoi (arg);
if (maxchunk < (size_t) 512)
{
- if (maxchunk <= (size_t) 0)
- {
- fprintf (stderr, "I/O transfer max must be at least 1 sector\n");
- usage ();
- }
- else
- maxchunk *= (size_t) 512;
+ maxchunk *= (size_t) 512;
}
if (maxchunk > (size_t) MAXPHYS)
{
@@ -423,7 +421,7 @@
printf ("No arg to n flag\n");
break;
}
- filesize = sizespec (argv [++i]);
+ filesize = sizespec (arg);
break;
case 'S':
@@ -500,11 +498,6 @@
buf = (char *) (((int) &physbuf [MAXPHYS]) & ~ (alignment - 1)); /* where to put the aligned buffer */
if (op == 0) /* no ops specified, */
op = RandomRead | SequentialRead; /* default to the read tests */
- if (maxchunk & 0x1ff)
- {
- fprintf (stderr, "Invalid transfer size, must be multiple of 512: %d\n", maxchunk);
- usage ();
- }
if (device == NULL)
{
fprintf (stderr, "No file name specified\n");
@@ -565,6 +558,27 @@
fprintf (stderr, "No file size specified\n");
usage ();
}
+#ifndef DIOCGSECTORSIZE
+ sectorsize = DEV_BSIZE;
+#else
+ if (ioctl (file, DIOCGSECTORSIZE, &sectorsize) == -1) /* failed to find native sector size */
+ {
+ if (verbose)
+ fprintf (stderr, "Can't get sector size of %s: %s\n", device, strerror (errno));
+ sectorsize = DEV_BSIZE;
+ }
+
+#endif
+ if (maxchunk <= sectorsize)
+ {
+ fprintf (stderr, "I/O transfer max must be at least 1 sector\n");
+ usage ();
+ }
+ if (maxchunk & (sectorsize - 1))
+ {
+ fprintf (stderr, "Invalid transfer size, must be multiple of %d: %d\n", sectorsize, maxchunk);
+ usage ();
+ }
if (id == NULL) /* no ID specified, */
{
id = strrchr (device, '/'); /* find the basename */
@@ -580,7 +594,11 @@
childinfo = mmap (NULL,
nproc * sizeof (struct childinfo),
PROT_READ | PROT_WRITE,
+#ifdef MAP_INHERIT
MAP_INHERIT | MAP_SHARED | MAP_ANON,
+#else
+ MAP_SHARED | MAP_ANON,
+#endif
-1,
(off_t) 0 );
#else
@@ -835,14 +853,6 @@
childinfo [proc].writes = 0;
childinfo [proc].bytes_written = 0;
- /* Get our own file handle */
- close(file); /* need our own FD */
- if ((file = open (device, openflags, 0)) < 0)
- {
- fprintf (stderr, "Child %d: Can't open %s: %s\n", proc, device, strerror (errno));
- exit (1);
- }
-
/* Don't jump the gun */
sigemptyset (&allsigs);
if (sigaction (SIGUSR1, &ignore, NULL) < 0)
@@ -863,20 +873,13 @@
length = maxchunk;
else
length = (myrandom (proc + nproc * i * 2)
- % (maxchunk * 2) + 512) & ~0x1ff; /* length of this transfer */
- offset = ((((off_t) (myrandom2 (proc + nproc * i)) * DEV_BSIZE)
- % (filesize - SKIPSTART - length)) & ~0x1ff) + SKIPSTART;
- if ((pos = lseek (file, offset, SEEK_SET)) != offset)
- fprintf (stderr,
- "Child %d can't seek to %" Quad "x (%" Quad "x): %s\n",
- proc,
- offset,
- pos,
- strerror (errno));
- else if ((iocount = read (file, buf, length)) != length)
+ % (maxchunk * 2) + sectorsize) & ~(sectorsize - 1); /* length of this transfer */
+ offset = (((((off_t) myrandom2 (proc + nproc * i)) * sectorsize)
+ % (filesize - SKIPSTART - length)) & ~((off_t)sectorsize - 1)) + SKIPSTART;
+ if ((iocount = pread (file, buf, length, pos = offset)) != length)
{
int Errno = errno;
- pos = lseek (file, 0, SEEK_CUR);
+ pos = offset + (iocount > 0 ? iocount : 0);
fprintf (stderr,
"offset %" Quad "d, filesize %" Quad "d\n",
@@ -915,9 +918,9 @@
if (fixedoffset)
offset = SKIPSTART; /* start at the beginning */
else /* random start */
- offset = ((((off_t) (myrandom (proc + nproc)) * DEV_BSIZE)
+ offset = (((((off_t) myrandom (proc + nproc)) * sectorsize)
% (filesize - SKIPSTART /* decide where to start */
- - (maxrecs * length))) & ~0x1ff) + SKIPSTART;
+ - (maxrecs * length))) & ~((off_t)sectorsize - 1)) + SKIPSTART;
if ((offset + maxrecs * length) > filesize) /* XXX */
{
printf ("Overrun: offset %" Quad "d, end %" Quad "d, file size %" Quad "d\n",
@@ -928,18 +931,12 @@
}
if ((verbose > 2) && ! fixedoffset)
printf ("Child %d reading from %" Quad "d\n", proc, offset);
- if (lseek (file, offset, SEEK_SET) < 0)
- fprintf (stderr,
- "Child %d can't seek to %" Quad "x: %s\n",
- proc,
- offset,
- strerror (errno));
for (i = 1; i <= maxrecs; i++)
{
- if ((iocount = read (file, buf, length)) != length)
+ if ((iocount = pread (file, buf, length, offset)) != length)
{
int Errno = errno;
- off_t pos = lseek (file, (off_t) 0, SEEK_CUR);
+ off_t pos = offset + (iocount > 0 ? iocount : 0);
fprintf (stderr,
"offset %" Quad "d, filesize %" Quad "d\n",
@@ -965,6 +962,7 @@
{
childinfo [proc].reads++;
childinfo [proc].bytes_read += iocount;
+ offset += iocount;
}
}
break;
@@ -976,30 +974,28 @@
length = maxchunk;
else
length = (myrandom (proc + nproc * i * 2)
- % (maxchunk * 2) + 512) & ~0x1ff; /* length of this transfer */
- offset = ((((off_t) (myrandom2 (proc + nproc * i)) * DEV_BSIZE)
- % (filesize - SKIPSTART - length)) & ~0x1ff) + SKIPSTART;
- if (lseek (file, offset, SEEK_SET) < 0)
- fprintf (stderr, "Child %d can't seek: %s", proc, strerror (errno));
- else
+ % (maxchunk * 2) + sectorsize) & ~(sectorsize - 1); /* length of this transfer */
+ offset = (((((off_t) myrandom2 (proc + nproc * i)) * sectorsize)
+ % (filesize - SKIPSTART - length)) & ~((off_t)sectorsize - 1)) + SKIPSTART;
+ if (1)
{
if ((RWfrac == 100)
|| ((myrandom (proc + nproc * i * 2 + 1) % 100) < RWfrac) )
{
- iocount = write (file, buf, length);
+ iocount = pwrite (file, buf, length, offset);
childinfo [proc].writes++;
childinfo [proc].bytes_written += iocount;
}
else
{
- iocount = read (file, buf, length);
+ iocount = pread (file, buf, length, offset);
childinfo [proc].reads++;
childinfo [proc].bytes_read += iocount;
}
if (iocount != length)
{
int Errno = errno;
- off_t pos = lseek (file, (off_t) 0, SEEK_CUR);
+ off_t pos = offset + (iocount > 0 ? iocount : 0);
fprintf (stderr,
"offset %" Quad "d, filesize %" Quad "d\n", offset,
@@ -1032,36 +1028,30 @@
if (fixedoffset)
offset = SKIPSTART; /* start at the beginning */
else /* random start */
- offset = ((((off_t) (myrandom (proc + nproc)) * DEV_BSIZE)
+ offset = (((((off_t) myrandom (proc + nproc)) * sectorsize)
% (filesize - SKIPSTART /* decide where to start */
- - (maxrecs * length))) & ~0x1ff) + SKIPSTART;
- if (lseek (file, offset, SEEK_SET) < 0)
- fprintf (stderr,
- "Child %d can't seek to %" Quad "x: %s\n",
- proc,
- offset,
- strerror (errno));
- else if ((verbose > 2) && ! fixedoffset)
+ - (maxrecs * length))) & ~((off_t)sectorsize - 1)) + SKIPSTART;
+ if ((verbose > 2) && ! fixedoffset)
printf ("Child %d writing to %" Quad "d\n", proc, offset);
for (i = 1; i <= maxrecs; i++)
{
if ((SWfrac == 100)
|| ((myrandom (proc + nproc * i * 2 + 1) % 100) < SWfrac) )
{
- iocount = write (file, buf, length);
+ iocount = pwrite (file, buf, length, offset);
childinfo [proc].writes++;
childinfo [proc].bytes_written += iocount;
}
else
{
- iocount = read (file, buf, length);
+ iocount = pread (file, buf, length, offset);
childinfo [proc].reads++;
childinfo [proc].bytes_read += iocount;
}
if (iocount != length)
{
int Errno = errno;
- off_t pos = lseek (file, (off_t) 0, SEEK_CUR);
+ off_t pos = offset + (iocount > 0 ? iocount : 0);
fprintf (stderr,
"offset %" Quad "d, filesize %" Quad "d\n",
@@ -1082,6 +1072,10 @@
iocount,
length );
exit (1);
+ }
+ else
+ {
+ offset += iocount;
}
}
break;