enum {
IO_URING_QUERY_OPCODES = 0,
+ IO_URING_QUERY_ZCRX = 1,
__IO_URING_QUERY_MAX,
};
__u32 __pad;
};
+struct io_uring_query_zcrx {
+ /* Bitmask of supported ZCRX_REG_* flags, */
+ __u64 register_flags;
+ /* Bitmask of all supported IORING_ZCRX_AREA_* flags */
+ __u64 area_flags;
+ /* The number of supported ZCRX_CTRL_* opcodes */
+ __u32 nr_ctrl_opcodes;
+ __u32 __resv1;
+ /* The refill ring header size */
+ __u32 rq_hdr_size;
+ /* The alignment for the header */
+ __u32 rq_hdr_alignment;
+ __u64 __resv2;
+};
+
#endif
#include "query.h"
#include "io_uring.h"
+#include "zcrx.h"
union io_query_data {
struct io_uring_query_opcode opcodes;
+ struct io_uring_query_zcrx zcrx;
};
#define IO_MAX_QUERY_SIZE sizeof(union io_query_data)
return sizeof(*e);
}
+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 int io_handle_query_entry(struct io_ring_ctx *ctx,
union io_query_data *data, void __user *uhdr,
u64 *next_entry)
case IO_URING_QUERY_OPCODES:
ret = io_query_ops(data);
break;
+ case IO_URING_QUERY_ZCRX:
+ ret = io_query_zcrx(data);
+ break;
}
if (ret >= 0) {