/* * Description: run various io_uring nop tests * xiaoguang.wang@linux.alibaba.com * */ #include #include #include #include #include #include #include "liburing.h" static char *myprog; static int batch_count = 16; static int force_async = 0; static int runtime = 30; static unsigned long long ios; static volatile int stop = 0; static int test_nop(struct io_uring *ring) { struct io_uring_cqe *cqe; struct io_uring_sqe *sqe; int i, ret; for (i = 0; i < batch_count; i++) { sqe = io_uring_get_sqe(ring); if (!sqe) { fprintf(stderr, "get sqe failed\n"); goto err; } io_uring_prep_nop(sqe); if (force_async) sqe->flags |= IOSQE_ASYNC; } ret = io_uring_submit(ring); if (ret <= 0) { fprintf(stderr, "sqe submit failed: %d\n", ret); goto err; } for (i = 0; i < batch_count; i++) { ret = io_uring_wait_cqe(ring, &cqe); if (ret < 0) { fprintf(stderr, "wait completion %d\n", ret); goto err; } io_uring_cqe_seen(ring, cqe); } ios += batch_count; return 0; err: return 1; } static void usage(void) { printf("Usage: %s -H or\n", myprog); printf(" %s [-b batch][-a][-r runtime]\n", myprog); printf(" -b batch submission batch count, default 16\n"); printf(" -r runtime run time, default 30\n"); printf(" -a force asynchronous submission\n"); printf(" -H prints usage and exits\n"); } static void alarm_handler(int signum) { (void)signum; stop = 1; } int main(int argc, char *argv[]) { struct io_uring ring; struct sigaction sa; int ret, c; const char *opts = "b:ar:"; myprog = argv[0]; while ((c = getopt(argc, argv, opts)) != -1) { switch (c) { case 'b': batch_count = atoi(optarg); break; case 'a': force_async = 1; break; case 'r': runtime = atoi(optarg); break; case 'H': usage(); exit(1); } } if (!batch_count) { fprintf(stderr, "batch count should be greater than 0\n"); exit(1); } if (!runtime) { printf("run time is zero, are you sure?\n"); return 0; } memset(&sa, 0, sizeof(sa)); sa.sa_handler = alarm_handler; sigemptyset(&sa.sa_mask); ret = sigaction(SIGALRM, &sa, NULL); if (ret < 0) { fprintf(stderr, "sigaction failed: %s", strerror(errno)); exit(1); } alarm(runtime); ret = io_uring_queue_init(batch_count, &ring, 0); if (ret) { fprintf(stderr, "ring setup failed: %d\n", ret); return 1; } while (!stop) { ret = test_nop(&ring); if (ret) { fprintf(stderr, "test_nop failed\n"); return ret; } } printf("total ios: %llu\n", ios); printf("IOPS: %llu\n", ios / runtime); return 0; }