OK, last one in the series: user level test programs that stress
the kernel I/O stack.  Pretty dull stuff.

- Ken



diff -Nur zero/aio_null.c blknull_test/aio_null.c
--- zero/aio_null.c     1969-12-31 16:00:00.000000000 -0800
+++ blknull_test/aio_null.c     2005-03-08 00:46:17.000000000 -0800
@@ -0,0 +1,76 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sched.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <linux/ioctl.h>
+#include <libaio.h>
+
+#define MAXAIO         1024
+
+char   buf[4096] __attribute__((aligned(4096)));
+
+io_context_t   io_ctx;
+struct iocb    iocbpool[MAXAIO];
+struct io_event        ioevent[MAXAIO];
+
+void aio_setup(int n)
+{
+       int res = io_queue_init(n, &io_ctx);
+       if (res != 0) {
+               printf("io_queue_setup(%d) returned %d (%s)\n",
+                       n, res, strerror(-res));
+               exit(0);
+       }
+}
+
+main(int argc, char* argv[])
+{
+       int     fd, i, status, batch;
+       struct iocb* iocbbatch[MAXAIO];
+       int     devidx;
+       off_t   offset;
+       unsigned long start, end;
+
+       batch = argc < 2 ? 100: atoi(argv[1]);
+       if (batch >= MAXAIO)
+               batch = MAXAIO;
+
+       aio_setup(MAXAIO);
+       fd = open("/dev/raw/raw1", O_RDONLY);
+
+       if (fd == -1) {
+               perror("error opening\n");
+               exit (0);
+       }
+       for (i=0; i<batch; i++) {
+               iocbbatch[i] = iocbpool+i;
+               io_prep_pread(iocbbatch[i], fd, buf, 4096, 0);
+       }
+
+       while (1) {
+               struct timespec ts={30,0};
+               int bufidx;
+               int reap;
+
+               status = io_submit(io_ctx, i, iocbbatch);
+               if (status != i) {
+                       printf("bad io_submit: %d [%s]\n", status,
+                               strerror(-status));
+               }
+
+               // reap at least batch count back
+               reap = io_getevents(io_ctx, batch, MAXAIO, ioevent, &ts);
+               if (reap < batch) {
+                       printf("io_getevents returned=%d [%s]\n", reap,
+                               strerror(-reap));
+               }
+
+               // check the return result of each event
+               for (i=0; i<reap; i++)
+                       if (ioevent[i].res != 4096)
+                               printf("error in read: %lx\n", ioevent[i].res);
+       } /* while (1) */
+}
diff -Nur zero/pread_null.c blknull_test/pread_null.c
--- zero/pread_null.c   1969-12-31 16:00:00.000000000 -0800
+++ blknull_test/pread_null.c   2005-03-08 00:44:20.000000000 -0800
@@ -0,0 +1,27 @@
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <malloc.h>
+
+main(int argc, char* argv[])
+{
+       int fd;
+       char *addr;
+
+       fd = open("/dev/raw/raw1", O_RDONLY);
+       if (fd == -1) {
+               perror("error opening\n");
+               exit(0);
+       }
+
+       addr = memalign(4096, 4096);
+       if (addr == 0) {
+               printf("no memory\n");
+               exit(0);
+       }
+
+       while (1) {
+               pread(fd, addr, 4096, 0);
+       }
+
+}
diff -Nur zero/makefile blknull_test/makefile
--- zero/makefile       1969-12-31 16:00:00.000000000 -0800
+++ blknull_test/makefile       2005-03-08 17:10:39.000000000 -0800
@@ -0,0 +1,10 @@
+all:   pread_null aio_null
+
+pread_null: pread_null.c
+       gcc -O3 -o $@ pread_null.c
+
+aio_null: aio_null.c
+       gcc -O3 -o $@ aio_null.c -laio
+
+clean:
+       rm -f pread_null aio_null



-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to