From: Jens Axboe Date: Sun, 13 Jan 2019 15:56:11 +0000 (-0700) Subject: Move io_uring to os/linux/ X-Git-Tag: fio-3.13~28 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=f3e769a43d02dd468a1662efc504940d8dc21eb6 Move io_uring to os/linux/ It's not a generic OS header, reflect the fact that it's Linux only by moving it to a linux/ directory. Also update io_uring_sqe to match current API. Signed-off-by: Jens Axboe --- diff --git a/Makefile b/Makefile index 3701317e..fd138dd2 100644 --- a/Makefile +++ b/Makefile @@ -444,7 +444,7 @@ cairo_text_helpers.o: cairo_text_helpers.c cairo_text_helpers.h printing.o: printing.c printing.h $(QUIET_CC)$(CC) $(CFLAGS) $(GTK_CFLAGS) $(CPPFLAGS) -c $< -t/io_uring.o: os/io_uring.h +t/io_uring.o: os/linux/io_uring.h t/io_uring: $(T_IOU_RING_OBJS) $(QUIET_LINK)$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(T_IOU_RING_OBJS) $(LIBS) diff --git a/engines/io_uring.c b/engines/io_uring.c index ca3e157f..2186031b 100644 --- a/engines/io_uring.c +++ b/engines/io_uring.c @@ -21,7 +21,7 @@ #ifdef ARCH_HAVE_IOURING #include "../lib/types.h" -#include "../os/io_uring.h" +#include "../os/linux/io_uring.h" struct io_sq_ring { unsigned *head; diff --git a/os/io_uring.h b/os/io_uring.h deleted file mode 100644 index 0f4460d6..00000000 --- a/os/io_uring.h +++ /dev/null @@ -1,148 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -/* - * Header file for the io_uring interface. - * - * Copyright (C) 2019 Jens Axboe - * Copyright (C) 2019 Christoph Hellwig - */ -#ifndef LINUX_IO_URING_H -#define LINUX_IO_URING_H - -#include -#include - -/* - * IO submission data structure (Submission Queue Entry) - */ -struct io_uring_sqe { - __u8 opcode; /* type of operation for this sqe */ - __u8 flags; /* IOSQE_ flags */ - __u16 ioprio; /* ioprio for the request */ - __s32 fd; /* file descriptor to do IO on */ - __u64 off; /* offset into file */ - union { - void *addr; /* buffer or iovecs */ - __u64 __pad; - }; - __u32 len; /* buffer size or number of iovecs */ - union { - __kernel_rwf_t rw_flags; - __u32 fsync_flags; - }; - __u16 buf_index; /* index into fixed buffers, if used */ - __u16 __pad2; - __u32 __pad3; - __u64 user_data; /* data to be passed back at completion time */ -}; - -/* - * sqe->flags - */ -#define IOSQE_FIXED_FILE (1 << 0) /* use fixed fileset */ - -/* - * io_uring_setup() flags - */ -#define IORING_SETUP_IOPOLL (1 << 0) /* io_context is polled */ -#define IORING_SETUP_SQPOLL (1 << 1) /* SQ poll thread */ -#define IORING_SETUP_SQ_AFF (1 << 2) /* sq_thread_cpu is valid */ - -#define IORING_OP_NOP 0 -#define IORING_OP_READV 1 -#define IORING_OP_WRITEV 2 -#define IORING_OP_FSYNC 3 -#define IORING_OP_READ_FIXED 4 -#define IORING_OP_WRITE_FIXED 5 - -/* - * sqe->fsync_flags - */ -#define IORING_FSYNC_DATASYNC (1 << 0) - -/* - * IO completion data structure (Completion Queue Entry) - */ -struct io_uring_cqe { - __u64 user_data; /* sqe->data submission passed back */ - __s32 res; /* result code for this event */ - __u32 flags; -}; - -/* - * io_uring_event->flags - */ -#define IOCQE_FLAG_CACHEHIT (1 << 0) /* IO did not hit media */ - -/* - * Magic offsets for the application to mmap the data it needs - */ -#define IORING_OFF_SQ_RING 0ULL -#define IORING_OFF_CQ_RING 0x8000000ULL -#define IORING_OFF_SQES 0x10000000ULL - -/* - * Filled with the offset for mmap(2) - */ -struct io_sqring_offsets { - __u32 head; - __u32 tail; - __u32 ring_mask; - __u32 ring_entries; - __u32 flags; - __u32 dropped; - __u32 array; - __u32 resv[3]; -}; - -/* - * sq_ring->flags - */ -#define IORING_SQ_NEED_WAKEUP (1 << 0) /* needs io_uring_enter wakeup */ - -struct io_cqring_offsets { - __u32 head; - __u32 tail; - __u32 ring_mask; - __u32 ring_entries; - __u32 overflow; - __u32 cqes; - __u32 resv[4]; -}; - -/* - * io_uring_enter(2) flags - */ -#define IORING_ENTER_GETEVENTS (1 << 0) - -/* - * Passed in for io_uring_setup(2). Copied back with updated info on success - */ -struct io_uring_params { - __u32 sq_entries; - __u32 cq_entries; - __u32 flags; - __u16 sq_thread_cpu; - __u16 resv[9]; - struct io_sqring_offsets sq_off; - struct io_cqring_offsets cq_off; -}; - -/* - * io_uring_register(2) opcodes and arguments - */ -#define IORING_REGISTER_BUFFERS 0 -#define IORING_UNREGISTER_BUFFERS 1 -#define IORING_REGISTER_FILES 2 -#define IORING_UNREGISTER_FILES 3 - -struct io_uring_register_buffers { - struct iovec *iovecs; - __u32 nr_iovecs; -}; - -struct io_uring_register_files { - __s32 *fds; - __u32 nr_fds; -}; - -#endif diff --git a/os/linux/io_uring.h b/os/linux/io_uring.h new file mode 100644 index 00000000..3693d125 --- /dev/null +++ b/os/linux/io_uring.h @@ -0,0 +1,149 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * Header file for the io_uring interface. + * + * Copyright (C) 2019 Jens Axboe + * Copyright (C) 2019 Christoph Hellwig + */ +#ifndef LINUX_IO_URING_H +#define LINUX_IO_URING_H + +#include +#include + +/* + * IO submission data structure (Submission Queue Entry) + */ +struct io_uring_sqe { + __u8 opcode; /* type of operation for this sqe */ + __u8 flags; /* IOSQE_ flags */ + __u16 ioprio; /* ioprio for the request */ + __s32 fd; /* file descriptor to do IO on */ + __u64 off; /* offset into file */ + union { + void *addr; /* buffer or iovecs */ + __u64 __pad; + }; + __u32 len; /* buffer size or number of iovecs */ + union { + __kernel_rwf_t rw_flags; + __u32 fsync_flags; + }; + __u64 user_data; /* data to be passed back at completion time */ + union { + __u16 buf_index; /* index into fixed buffers, if used */ + __u64 __pad2[3]; + }; +}; + +/* + * sqe->flags + */ +#define IOSQE_FIXED_FILE (1 << 0) /* use fixed fileset */ + +/* + * io_uring_setup() flags + */ +#define IORING_SETUP_IOPOLL (1 << 0) /* io_context is polled */ +#define IORING_SETUP_SQPOLL (1 << 1) /* SQ poll thread */ +#define IORING_SETUP_SQ_AFF (1 << 2) /* sq_thread_cpu is valid */ + +#define IORING_OP_NOP 0 +#define IORING_OP_READV 1 +#define IORING_OP_WRITEV 2 +#define IORING_OP_FSYNC 3 +#define IORING_OP_READ_FIXED 4 +#define IORING_OP_WRITE_FIXED 5 + +/* + * sqe->fsync_flags + */ +#define IORING_FSYNC_DATASYNC (1 << 0) + +/* + * IO completion data structure (Completion Queue Entry) + */ +struct io_uring_cqe { + __u64 user_data; /* sqe->data submission passed back */ + __s32 res; /* result code for this event */ + __u32 flags; +}; + +/* + * io_uring_event->flags + */ +#define IOCQE_FLAG_CACHEHIT (1 << 0) /* IO did not hit media */ + +/* + * Magic offsets for the application to mmap the data it needs + */ +#define IORING_OFF_SQ_RING 0ULL +#define IORING_OFF_CQ_RING 0x8000000ULL +#define IORING_OFF_SQES 0x10000000ULL + +/* + * Filled with the offset for mmap(2) + */ +struct io_sqring_offsets { + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 flags; + __u32 dropped; + __u32 array; + __u32 resv[3]; +}; + +/* + * sq_ring->flags + */ +#define IORING_SQ_NEED_WAKEUP (1 << 0) /* needs io_uring_enter wakeup */ + +struct io_cqring_offsets { + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 overflow; + __u32 cqes; + __u32 resv[4]; +}; + +/* + * io_uring_enter(2) flags + */ +#define IORING_ENTER_GETEVENTS (1 << 0) + +/* + * Passed in for io_uring_setup(2). Copied back with updated info on success + */ +struct io_uring_params { + __u32 sq_entries; + __u32 cq_entries; + __u32 flags; + __u16 sq_thread_cpu; + __u16 resv[9]; + struct io_sqring_offsets sq_off; + struct io_cqring_offsets cq_off; +}; + +/* + * io_uring_register(2) opcodes and arguments + */ +#define IORING_REGISTER_BUFFERS 0 +#define IORING_UNREGISTER_BUFFERS 1 +#define IORING_REGISTER_FILES 2 +#define IORING_UNREGISTER_FILES 3 + +struct io_uring_register_buffers { + struct iovec *iovecs; + __u32 nr_iovecs; +}; + +struct io_uring_register_files { + __s32 *fds; + __u32 nr_fds; +}; + +#endif diff --git a/t/io_uring.c b/t/io_uring.c index 8d3f3a9b..b10a1b2a 100644 --- a/t/io_uring.c +++ b/t/io_uring.c @@ -22,7 +22,7 @@ #include "../arch/arch.h" #include "../lib/types.h" -#include "../os/io_uring.h" +#include "../os/linux/io_uring.h" #define barrier() __asm__ __volatile__("": : :"memory")