Doesn't do anything on the kernel side, just a round trip through
the SQ and CQ ring.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
#define IORING_SETUP_SQPOLL (1 << 1) /* SQ poll thread */
#define IORING_SETUP_SQ_AFF (1 << 2) /* sq_thread_cpu is valid */
#define IORING_SETUP_SQPOLL (1 << 1) /* SQ poll thread */
#define IORING_SETUP_SQ_AFF (1 << 2) /* sq_thread_cpu is valid */
#define IORING_OP_READV 1
#define IORING_OP_WRITEV 2
#define IORING_OP_FSYNC 3
#define IORING_OP_READV 1
#define IORING_OP_WRITEV 2
#define IORING_OP_FSYNC 3
static int buffered = 0; /* use buffered IO, not O_DIRECT */
static int sq_thread_poll = 0; /* use kernel submission/poller thread */
static int sq_thread_cpu = -1; /* pin above thread to this CPU */
static int buffered = 0; /* use buffered IO, not O_DIRECT */
static int sq_thread_poll = 0; /* use kernel submission/poller thread */
static int sq_thread_cpu = -1; /* pin above thread to this CPU */
+static int do_nop = 0; /* no-op SQ ring commands */
static int io_uring_register_buffers(struct submitter *s)
{
static int io_uring_register_buffers(struct submitter *s)
{
+ if (do_nop)
+ return 0;
+
return syscall(__NR_sys_io_uring_register, s->ring_fd,
IORING_REGISTER_BUFFERS, ®);
}
return syscall(__NR_sys_io_uring_register, s->ring_fd,
IORING_REGISTER_BUFFERS, ®);
}
struct io_uring_register_files reg;
int i;
struct io_uring_register_files reg;
int i;
+ if (do_nop)
+ return 0;
+
s->fds = calloc(s->nr_files, sizeof(__s32));
for (i = 0; i < s->nr_files; i++) {
s->fds[i] = s->files[i].real_fd;
s->fds = calloc(s->nr_files, sizeof(__s32));
for (i = 0; i < s->nr_files; i++) {
s->fds[i] = s->files[i].real_fd;
+ if (do_nop) {
+ sqe->opcode = IORING_OP_NOP;
+ return;
+ }
+
if (s->nr_files == 1) {
f = &s->files[0];
} else {
if (s->nr_files == 1) {
f = &s->files[0];
} else {
if (head == *ring->tail)
break;
cqe = &ring->cqes[head & cq_ring_mask];
if (head == *ring->tail)
break;
cqe = &ring->cqes[head & cq_ring_mask];
- f = (struct file *) cqe->user_data;
- f->pending_ios--;
- if (cqe->res != BS) {
- printf("io: unexpected ret=%d\n", cqe->res);
- return -1;
+ if (!do_nop) {
+ f = (struct file *) cqe->user_data;
+ f->pending_ios--;
+ if (cqe->res != BS) {
+ printf("io: unexpected ret=%d\n", cqe->res);
+ return -1;
+ }
}
if (cqe->flags & IOCQE_FLAG_CACHEHIT)
s->cachehit++;
}
if (cqe->flags & IOCQE_FLAG_CACHEHIT)
s->cachehit++;
struct rlimit rlim;
void *ret;
struct rlimit rlim;
void *ret;
+ if (!do_nop && argc < 2) {
printf("%s: filename\n", argv[0]);
return 1;
}
printf("%s: filename\n", argv[0]);
return 1;
}
flags |= O_DIRECT;
i = 1;
flags |= O_DIRECT;
i = 1;
+ while (!do_nop && i < argc) {
struct file *f = &s->files[s->nr_files];
fd = open(argv[i], flags);
struct file *f = &s->files[s->nr_files];
fd = open(argv[i], flags);