summaryrefslogtreecommitdiff
path: root/io_uring/query.c
diff options
context:
space:
mode:
Diffstat (limited to 'io_uring/query.c')
-rw-r--r--io_uring/query.c57
1 files changed, 46 insertions, 11 deletions
diff --git a/io_uring/query.c b/io_uring/query.c
index 645301bd2c82..abdd6f3e1223 100644
--- a/io_uring/query.c
+++ b/io_uring/query.c
@@ -4,15 +4,20 @@
#include "query.h"
#include "io_uring.h"
+#include "zcrx.h"
-#define IO_MAX_QUERY_SIZE (sizeof(struct io_uring_query_opcode))
+union io_query_data {
+ struct io_uring_query_opcode opcodes;
+ struct io_uring_query_zcrx zcrx;
+ struct io_uring_query_scq scq;
+};
+
+#define IO_MAX_QUERY_SIZE sizeof(union io_query_data)
#define IO_MAX_QUERY_ENTRIES 1000
-static ssize_t io_query_ops(void *data)
+static ssize_t io_query_ops(union io_query_data *data)
{
- struct io_uring_query_opcode *e = data;
-
- BUILD_BUG_ON(sizeof(*e) > IO_MAX_QUERY_SIZE);
+ struct io_uring_query_opcode *e = &data->opcodes;
e->nr_request_opcodes = IORING_OP_LAST;
e->nr_register_opcodes = IORING_REGISTER_LAST;
@@ -20,11 +25,35 @@ static ssize_t io_query_ops(void *data)
e->ring_setup_flags = IORING_SETUP_FLAGS;
e->enter_flags = IORING_ENTER_FLAGS;
e->sqe_flags = SQE_VALID_FLAGS;
+ e->nr_query_opcodes = __IO_URING_QUERY_MAX;
+ e->__pad = 0;
return sizeof(*e);
}
-static int io_handle_query_entry(struct io_ring_ctx *ctx,
- void *data, void __user *uhdr,
+static ssize_t io_query_zcrx(union io_query_data *data)
+{
+ struct io_uring_query_zcrx *e = &data->zcrx;
+
+ e->register_flags = ZCRX_REG_IMPORT;
+ e->area_flags = IORING_ZCRX_AREA_DMABUF;
+ e->nr_ctrl_opcodes = __ZCRX_CTRL_LAST;
+ e->rq_hdr_size = sizeof(struct io_uring);
+ e->rq_hdr_alignment = L1_CACHE_BYTES;
+ e->__resv1 = 0;
+ e->__resv2 = 0;
+ return sizeof(*e);
+}
+
+static ssize_t io_query_scq(union io_query_data *data)
+{
+ struct io_uring_query_scq *e = &data->scq;
+
+ e->hdr_size = sizeof(struct io_rings);
+ e->hdr_alignment = SMP_CACHE_BYTES;
+ return sizeof(*e);
+}
+
+static int io_handle_query_entry(union io_query_data *data, void __user *uhdr,
u64 *next_entry)
{
struct io_uring_query_hdr hdr;
@@ -51,6 +80,12 @@ static int io_handle_query_entry(struct io_ring_ctx *ctx,
case IO_URING_QUERY_OPCODES:
ret = io_query_ops(data);
break;
+ case IO_URING_QUERY_ZCRX:
+ ret = io_query_zcrx(data);
+ break;
+ case IO_URING_QUERY_SCQ:
+ ret = io_query_scq(data);
+ break;
}
if (ret >= 0) {
@@ -71,13 +106,13 @@ out:
return 0;
}
-int io_query(struct io_ring_ctx *ctx, void __user *arg, unsigned nr_args)
+int io_query(void __user *arg, unsigned nr_args)
{
- char entry_buffer[IO_MAX_QUERY_SIZE];
+ union io_query_data entry_buffer;
void __user *uhdr = arg;
int ret, nr = 0;
- memset(entry_buffer, 0, sizeof(entry_buffer));
+ memset(&entry_buffer, 0, sizeof(entry_buffer));
if (nr_args)
return -EINVAL;
@@ -85,7 +120,7 @@ int io_query(struct io_ring_ctx *ctx, void __user *arg, unsigned nr_args)
while (uhdr) {
u64 next_hdr;
- ret = io_handle_query_entry(ctx, entry_buffer, uhdr, &next_hdr);
+ ret = io_handle_query_entry(&entry_buffer, uhdr, &next_hdr);
if (ret)
return ret;
uhdr = u64_to_user_ptr(next_hdr);