static int sq_thread_cpu = -1; /* pin above thread to this CPU */
static int do_nop = 0; /* no-op SQ ring commands */
-static int read_op = IORING_OP_READV;
+static int vectored = 1;
static int io_uring_register_buffers(struct submitter *s)
{
goto out;
if ((p->ops[IORING_OP_READ].flags & IO_URING_OP_SUPPORTED))
- read_op = IORING_OP_READ;
+ vectored = 0;
out:
free(p);
}
sqe->addr = (unsigned long) s->iovecs[index].iov_base;
sqe->len = bs;
sqe->buf_index = index;
- } else if (read_op == IORING_OP_READV) {
- sqe->opcode = IORING_OP_READV;
- sqe->addr = (unsigned long) &s->iovecs[index];
- sqe->len = 1;
- sqe->buf_index = 0;
- } else {
+ } else if (!vectored) {
sqe->opcode = IORING_OP_READ;
sqe->addr = (unsigned long) s->iovecs[index].iov_base;
sqe->len = bs;
sqe->buf_index = 0;
+ } else {
+ sqe->opcode = IORING_OP_READV;
+ sqe->addr = (unsigned long) &s->iovecs[index];
+ sqe->len = 1;
+ sqe->buf_index = 0;
}
sqe->ioprio = 0;
sqe->off = offset;
return 1;
}
- while ((opt = getopt(argc, argv, "d:s:c:b:p:h?")) != -1) {
+ while ((opt = getopt(argc, argv, "d:s:c:b:p:B:F:h?")) != -1) {
switch (opt) {
case 'd':
depth = atoi(optarg);
case 'p':
polled = !!atoi(optarg);
break;
+ case 'B':
+ fixedbufs = !!atoi(optarg);
+ break;
+ case 'F':
+ register_files = !!atoi(optarg);
+ break;
case 'h':
case '?':
default:
printf("ring setup failed: %s, %d\n", strerror(errno), err);
return 1;
}
- printf("polled=%d, fixedbufs=%d, buffered=%d", polled, fixedbufs, buffered);
+ printf("polled=%d, fixedbufs=%d, register_files=%d, buffered=%d", polled, fixedbufs, register_files, buffered);
printf(" QD=%d, sq_ring=%d, cq_ring=%d\n", depth, *s->sq_ring.ring_entries, *s->cq_ring.ring_entries);
pthread_create(&s->thread, NULL, submitter_fn, s);