clean up io_uring cmd header structure
Subsystems (4)
cover clean up io_uring cmd header structure
Looking at the zc rfc, and how we tend to stuff everything into linux/io_uring, start splitting the file before it becomes even more monstrous.
Pavel Begunkov (3):
io_uring: split out cmd api into a separate header io_uring/cmd: inline io_uring_cmd_do_in_task_lazy io_uring/cmd: inline io_uring_cmd_get_task
drivers/block/ublk_drv.c | 2 +- drivers/nvme/host/ioctl.c | 2 +- include/linux/io_uring.h | 89 +--------------------------------- include/linux/io_uring/cmd.h | 82 +++++++++++++++++++++++++++++++ include/linux/io_uring_types.h | 31 ++++++++++++ io_uring/io_uring.c | 1 + io_uring/io_uring.h | 10 ---- io_uring/rw.c | 2 +- io_uring/uring_cmd.c | 15 +----- 9 files changed, 119 insertions(+), 115 deletions(-) create mode 100644 include/linux/io_uring/cmd.h
Signature · 1 line
2.42.1
PATCH 1/3 io_uring: split out cmd api into a separate header
linux/io_uring.h is slowly becoming a rubbish bin where we put anything exposed to other subsystems. For instance, the task exit hooks and io_uring cmd infra are completely orthogonal and don't need each other's definitions. Start cleaning it up by splitting out all command bits into a new header file.
--- drivers/block/ublk_drv.c | 2 +- drivers/nvme/host/ioctl.c | 2 +- include/linux/io_uring.h | 89 +--------------------------------- include/linux/io_uring/cmd.h | 81 +++++++++++++++++++++++++++++++ include/linux/io_uring_types.h | 20 ++++++++ io_uring/io_uring.c | 1 + io_uring/rw.c | 2 +- io_uring/uring_cmd.c | 2 +- 8 files changed, 107 insertions(+), 92 deletions(-) create mode 100644 include/linux/io_uring/cmd.h
drivers/block/ublk_drv.c +1 -1
@@ -36,7 +36,7 @@#include <linux/sched/mm.h> #include <linux/uaccess.h> #include <linux/cdev.h> -#include <linux/io_uring.h> +#include <linux/io_uring/cmd.h> #include <linux/blk-mq.h> #include <linux/delay.h> #include <linux/mm.h>
drivers/nvme/host/ioctl.c +1 -1
@@ -5,7 +5,7 @@*/ #include <linux/ptrace.h> /* for force_successful_syscall_return */ #include <linux/nvme_ioctl.h> -#include <linux/io_uring.h> +#include <linux/io_uring/cmd.h> #include "nvme.h" enum {
include/linux/io_uring.h +1 -88
114 lines not on this page · raw message
include/linux/io_uring/cmd.h new file +81 -0
81 lines not on this page · raw message
include/linux/io_uring_types.h +20 -0
@@ -7,6 +7,26 @@#include <linux/llist.h> #include <uapi/linux/io_uring.h> +enum io_uring_cmd_flags { +IO_URING_F_COMPLETE_DEFER =1 , +IO_URING_F_UNLOCKED =2 , +/* the request is executed from poll, it should not be freed */ +IO_URING_F_MULTISHOT =4 , +/* executed by io-wq */ +IO_URING_F_IOWQ =8 , +/* int's last bit, sign checks are usually faster than a bit test */ +IO_URING_F_NONBLOCK =INT_MIN , + +/* ctx state flags, for URING_CMD */ +IO_URING_F_SQE128 = (1 <<8 ), +IO_URING_F_CQE32 = (1 <<9 ), +IO_URING_F_IOPOLL = (1 <<10 ), + +/* set when uring wants to cancel a previously issued command */ +IO_URING_F_CANCEL = (1 <<11 ), +IO_URING_F_COMPAT = (1 <<12 ), +}; +struct io_wq_work_node {struct io_wq_work_node *next; };
io_uring/io_uring.c +1 -0
@@ -70,6 +70,7 @@#include <linux/fadvise.h> #include <linux/task_work.h> #include <linux/io_uring.h> +#include <linux/io_uring/cmd.h> #include <linux/audit.h> #include <linux/security.h> #include <asm/shmparam.h>
io_uring/rw.c +1 -1
@@ -10,7 +10,7 @@#include <linux/poll.h> #include <linux/nospec.h> #include <linux/compat.h> -#include <linux/io_uring.h> +#include <linux/io_uring/cmd.h> #include <uapi/linux/io_uring.h>
io_uring/uring_cmd.c +1 -1
@@ -2,7 +2,7 @@#include <linux/kernel.h> #include <linux/errno.h> #include <linux/file.h> -#include <linux/io_uring.h> +#include <linux/io_uring/cmd.h> #include <linux/security.h> #include <linux/nospec.h>
Signature · 1 line
2.42.1
Re: [PATCH 1/3] io_uring: split out cmd api into a separate header
Quoted 270 lines · Pavel Begunkov
linux/io_uring.his slowly becoming a rubbish bin where we put anything exposed to other subsystems. For instance, the task exit hooks andio_uringcmd infra are completely orthogonal and don't need each other's definitions. Start cleaning it up by splitting out all command bits into a new header file.Signed-off-by Pavel Begunkov <[email protected]>--- drivers/block/ublk_drv.c | 2 +- drivers/nvme/host/ioctl.c | 2 +- include/linux/io_uring.h | 89 +--------------------------------- include/linux/io_uring/cmd.h | 81 +++++++++++++++++++++++++++++++ include/linux/io_uring_types.h | 20 ++++++++ io_uring/io_uring.c | 1 + io_uring/rw.c | 2 +- io_uring/uring_cmd.c | 2 +- 8 files changed, 107 insertions(+), 92 deletions(-) create mode 100644 include/linux/io_uring/cmd.hdrivers/block/ublk_drv.c +1
-1@@ -36,7 +36,7 @@#include <linux/sched/mm.h> #include <linux/uaccess.h> #include <linux/cdev.h> -#include <linux/io_uring.h> +#include <linux/io_uring/cmd.h> #include <linux/blk-mq.h> #include <linux/delay.h> #include <linux/mm.h> drivers/nvme/host/ioctl.c +1
-1@@ -5,7 +5,7 @@*/ #include <linux/ptrace.h> /* for force_successful_syscall_return */ #include <linux/nvme_ioctl.h> -#include <linux/io_uring.h> +#include <linux/io_uring/cmd.h> #include "nvme.h" enum {include/linux/io_uring.h +1
-88@@ -6,71 +6,13 @@#include <linux/xarray.h> #include <uapi/linux/io_uring.h> -enum io_uring_cmd_flags { -IO_URING_F_COMPLETE_DEFER =1 , -IO_URING_F_UNLOCKED =2 , -/* the request is executed from poll, it should not be freed */ -IO_URING_F_MULTISHOT =4 , -/* executed by io-wq */ -IO_URING_F_IOWQ =8 , -/* int's last bit, sign checks are usually faster than a bit test */ -IO_URING_F_NONBLOCK =INT_MIN , - -/* ctx state flags, for URING_CMD */ -IO_URING_F_SQE128 = (1 <<8 ), -IO_URING_F_CQE32 = (1 <<9 ), -IO_URING_F_IOPOLL = (1 <<10 ), - -/* set when uring wants to cancel a previously issued command */ -IO_URING_F_CANCEL = (1 <<11 ), -IO_URING_F_COMPAT = (1 <<12 ), -}; - -/* only top 8 bits of sqe->uring_cmd_flags for kernel internal use */ -#define IORING_URING_CMD_CANCELABLE (1U << 30) -#define IORING_URING_CMD_POLLED (1U << 31) - -struct io_uring_cmd { -struct file *file; -const struct io_uring_sqe *sqe; -union { -/* callback to defer completions to task context */ -void (*task_work_cb)(struct io_uring_cmd *cmd,unsigned ); -/* used for polled completion */ -void *cookie; - }; -u32 cmd_op; -u32 flags; -u8 pdu[32 ];/* available inline for free use */ -}; - -static inline const void *io_uring_sqe_cmd (const struct io_uring_sqe *sqe) -{ -return sqe->cmd; -} -#if defined(CONFIG_IO_URING ) -int io_uring_cmd_import_fixed (u64 ubuf,unsigned long len,int rw, -struct iov_iter *iter,void *ioucmd); -void io_uring_cmd_done (struct io_uring_cmd *cmd,ssize_t ret,ssize_t res2, -unsigned issue_flags);struct sock *io_uring_get_socket (struct file *file);void __io_uring_cancel (bool cancel_all);void __io_uring_free (struct task_struct *tsk);void io_uring_unreg_ringfd (void );const char *io_uring_get_opcode (u8 opcode); -void __io_uring_cmd_do_in_task (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned ), -unsigned flags); -/* users should follow semantics of IOU_F_TWQ_LAZY_WAKE */ -void io_uring_cmd_do_in_task_lazy (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned )); - -static inline void io_uring_cmd_complete_in_task (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned )) -{ -__io_uring_cmd_do_in_task (ioucmd, task_work_cb,0 ); -} +int io_uring_cmd_sock (struct io_uring_cmd *cmd,unsigned int issue_flags);static inline void io_uring_files_cancel (void ) {@@ -89,28 +31,7 @@ static inline void io_uring_free(struct task_struct *tsk)if (tsk->io_uring) __io_uring_free(tsk); } -int io_uring_cmd_sock (struct io_uring_cmd *cmd,unsigned int issue_flags); -void io_uring_cmd_mark_cancelable (struct io_uring_cmd *cmd, -unsigned int issue_flags); -struct task_struct *io_uring_cmd_get_task (struct io_uring_cmd *cmd);#else -static inline int io_uring_cmd_import_fixed (u64 ubuf,unsigned long len,int rw, -struct iov_iter *iter,void *ioucmd) -{ -return -EOPNOTSUPP ; -} -static inline void io_uring_cmd_done (struct io_uring_cmd *cmd,ssize_t ret, -ssize_t ret2,unsigned issue_flags) -{ -} -static inline void io_uring_cmd_complete_in_task (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned )) -{ -} -static inline void io_uring_cmd_do_in_task_lazy (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned )) -{ -}static inline struct sock *io_uring_get_socket (struct file *file) {return NULL ;@@ -133,14 +54,6 @@ static inline int io_uring_cmd_sock(struct io_uring_cmd *cmd, {return -EOPNOTSUPP ; } -static inline void io_uring_cmd_mark_cancelable (struct io_uring_cmd *cmd, -unsigned int issue_flags) -{ -} -static inline struct task_struct *io_uring_cmd_get_task (struct io_uring_cmd *cmd) -{ -return NULL ; -}#endif #endif include/linux/io_uring/cmd.h new file +81
-0@@ -0,0 +1,81 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef _LINUX_IO_URING_CMD_H +#define _LINUX_IO_URING_CMD_H + +#include <uapi/linux/io_uring.h> +#include <linux/io_uring_types.h> + +/* only top 8 bits of sqe->uring_cmd_flags for kernel internal use */ +#define IORING_URING_CMD_CANCELABLE (1U << 30) +#define IORING_URING_CMD_POLLED (1U << 31) + +struct io_uring_cmd { +struct file *file; +const struct io_uring_sqe *sqe; +union { +/* callback to defer completions to task context */ +void (*task_work_cb)(struct io_uring_cmd *cmd,unsigned ); +/* used for polled completion */ +void *cookie; + }; +u32 cmd_op; +u32 flags; +u8 pdu[32 ];/* available inline for free use */ +}; + +static inline const void *io_uring_sqe_cmd (const struct io_uring_sqe *sqe) +{ +return sqe->cmd; +} + +#if defined(CONFIG_IO_URING ) +int io_uring_cmd_import_fixed (u64 ubuf,unsigned long len,int rw, +struct iov_iter *iter,void *ioucmd); +void io_uring_cmd_done (struct io_uring_cmd *cmd,ssize_t ret,ssize_t res2, +unsigned issue_flags); +void __io_uring_cmd_do_in_task (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned ), +unsigned flags); +/* users should follow semantics of IOU_F_TWQ_LAZY_WAKE */ +void io_uring_cmd_do_in_task_lazy (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned )); + +static inline void io_uring_cmd_complete_in_task (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned )) +{ +__io_uring_cmd_do_in_task (ioucmd, task_work_cb,0 ); +} + +void io_uring_cmd_mark_cancelable (struct io_uring_cmd *cmd, +unsigned int issue_flags); +struct task_struct *io_uring_cmd_get_task (struct io_uring_cmd *cmd); + +#else +static inline int io_uring_cmd_import_fixed (u64 ubuf,unsigned long len,int rw, +struct iov_iter *iter,void *ioucmd) +{ +return -EOPNOTSUPP ; +} +static inline void io_uring_cmd_done (struct io_uring_cmd *cmd,ssize_t ret, +ssize_t ret2,unsigned issue_flags) +{ +} +static inline void io_uring_cmd_complete_in_task (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned )) +{ +} +static inline void io_uring_cmd_do_in_task_lazy (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned )) +{ +} +static inline void io_uring_cmd_mark_cancelable (struct io_uring_cmd *cmd, +unsigned int issue_flags) +{ +} +static inline struct task_struct *io_uring_cmd_get_task (struct io_uring_cmd *cmd) +{ +return NULL ; +} +#endif + +#endif /* _LINUX_IO_URING_CMD_H */ include/linux/io_uring_types.h +9
-0@@ -7,6 +7,26 @@#include <linux/llist.h> #include <uapi/linux/io_uring.h> +enum io_uring_cmd_flags { +IO_URING_F_COMPLETE_DEFER =1 , +IO_URING_F_UNLOCKED =2 , +/* the request is executed from poll, it should not be freed */ +IO_URING_F_MULTISHOT =4 , +/* executed by io-wq */ +IO_URING_F_IOWQ =8 , +/* int's last bit, sign checks are usually faster than a bit test */ +IO_URING_F_NONBLOCK =INT_MIN ,
include/linux/io_uring_types.h line 28
Quoted 10 lines
include/linux/io_uring_types.h +10
-0+ +/* ctx state flags, for URING_CMD */ +IO_URING_F_SQE128 = (1 <<8 ), +IO_URING_F_CQE32 = (1 <<9 ), +IO_URING_F_IOPOLL = (1 <<10 ), + +/* set when uring wants to cancel a previously issued command */ +IO_URING_F_CANCEL = (1 <<11 ), + IO_URING_F_COMPAT = (1 << 12), +};
I am wondering why you don't move io_uring_cmd_flags into io_uring/cmd.h? And many above flags are used by driver now.
But most definitions in io_uring_types.h are actually io_uring internal stuff.
Thanks,
Ming
Re: [PATCH 1/3] io_uring: split out cmd api into a separate header
Quoted 285 lines · Ming Lei
Quoted 270 lines · Pavel Begunkov
linux/io_uring.his slowly becoming a rubbish bin where we put anything exposed to other subsystems. For instance, the task exit hooks andio_uringcmd infra are completely orthogonal and don't need each other's definitions. Start cleaning it up by splitting out all command bits into a new header file.Signed-off-by Pavel Begunkov <[email protected]>--- drivers/block/ublk_drv.c | 2 +- drivers/nvme/host/ioctl.c | 2 +- include/linux/io_uring.h | 89 +--------------------------------- include/linux/io_uring/cmd.h | 81 +++++++++++++++++++++++++++++++ include/linux/io_uring_types.h | 20 ++++++++ io_uring/io_uring.c | 1 + io_uring/rw.c | 2 +- io_uring/uring_cmd.c | 2 +- 8 files changed, 107 insertions(+), 92 deletions(-)create mode 100644
include/linux/io_uring/cmd.hdrivers/block/ublk_drv.c +1
-1@@ -36,7 +36,7 @@#include <linux/sched/mm.h> #include <linux/uaccess.h> #include <linux/cdev.h> -#include <linux/io_uring.h> +#include <linux/io_uring/cmd.h> #include <linux/blk-mq.h> #include <linux/delay.h> #include <linux/mm.h> drivers/nvme/host/ioctl.c +1
-1@@ -5,7 +5,7 @@*/ #include <linux/ptrace.h> /* for force_successful_syscall_return */ #include <linux/nvme_ioctl.h> -#include <linux/io_uring.h> +#include <linux/io_uring/cmd.h> #include "nvme.h" enum {include/linux/io_uring.h +1
-88@@ -6,71 +6,13 @@#include <linux/xarray.h> #include <uapi/linux/io_uring.h> -enum io_uring_cmd_flags { -IO_URING_F_COMPLETE_DEFER =1 , -IO_URING_F_UNLOCKED =2 , -/* the request is executed from poll, it should not be freed */ -IO_URING_F_MULTISHOT =4 , -/* executed by io-wq */ -IO_URING_F_IOWQ =8 , -/* int's last bit, sign checks are usually faster than a bit test */ -IO_URING_F_NONBLOCK =INT_MIN , - -/* ctx state flags, for URING_CMD */ -IO_URING_F_SQE128 = (1 <<8 ), -IO_URING_F_CQE32 = (1 <<9 ), -IO_URING_F_IOPOLL = (1 <<10 ), - -/* set when uring wants to cancel a previously issued command */ -IO_URING_F_CANCEL = (1 <<11 ), -IO_URING_F_COMPAT = (1 <<12 ), -}; - -/* only top 8 bits of sqe->uring_cmd_flags for kernel internal use */ -#define IORING_URING_CMD_CANCELABLE (1U << 30) -#define IORING_URING_CMD_POLLED (1U << 31) - -struct io_uring_cmd { -struct file *file; -const struct io_uring_sqe *sqe; -union { -/* callback to defer completions to task context */ -void (*task_work_cb)(struct io_uring_cmd *cmd,unsigned ); -/* used for polled completion */ -void *cookie; - }; -u32 cmd_op; -u32 flags; -u8 pdu[32 ];/* available inline for free use */ -}; - -static inline const void *io_uring_sqe_cmd (const struct io_uring_sqe *sqe) -{ -return sqe->cmd; -} -#if defined(CONFIG_IO_URING ) -int io_uring_cmd_import_fixed (u64 ubuf,unsigned long len,int rw, -struct iov_iter *iter,void *ioucmd); -void io_uring_cmd_done (struct io_uring_cmd *cmd,ssize_t ret,ssize_t res2, -unsigned issue_flags);struct sock *io_uring_get_socket (struct file *file);void __io_uring_cancel (bool cancel_all);void __io_uring_free (struct task_struct *tsk);void io_uring_unreg_ringfd (void );const char *io_uring_get_opcode (u8 opcode); -void __io_uring_cmd_do_in_task (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned ), -unsigned flags); -/* users should follow semantics of IOU_F_TWQ_LAZY_WAKE */ -void io_uring_cmd_do_in_task_lazy (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned )); - -static inline void io_uring_cmd_complete_in_task (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned )) -{ -__io_uring_cmd_do_in_task (ioucmd, task_work_cb,0 ); -} +int io_uring_cmd_sock (struct io_uring_cmd *cmd,unsigned int issue_flags);static inline void io_uring_files_cancel (void ) {@@ -89,28 +31,7 @@ static inline void io_uring_free(struct task_struct *tsk)if (tsk->io_uring) __io_uring_free(tsk); } -int io_uring_cmd_sock (struct io_uring_cmd *cmd,unsigned int issue_flags); -void io_uring_cmd_mark_cancelable (struct io_uring_cmd *cmd, -unsigned int issue_flags); -struct task_struct *io_uring_cmd_get_task (struct io_uring_cmd *cmd);#else -static inline int io_uring_cmd_import_fixed (u64 ubuf,unsigned long len,int rw, -struct iov_iter *iter,void *ioucmd) -{ -return -EOPNOTSUPP ; -} -static inline void io_uring_cmd_done (struct io_uring_cmd *cmd,ssize_t ret, -ssize_t ret2,unsigned issue_flags) -{ -} -static inline void io_uring_cmd_complete_in_task (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned )) -{ -} -static inline void io_uring_cmd_do_in_task_lazy (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned )) -{ -}static inline struct sock *io_uring_get_socket (struct file *file) {return NULL ;@@ -133,14 +54,6 @@ static inline int io_uring_cmd_sock(struct io_uring_cmd *cmd, {return -EOPNOTSUPP ; } -static inline void io_uring_cmd_mark_cancelable (struct io_uring_cmd *cmd, -unsigned int issue_flags) -{ -} -static inline struct task_struct *io_uring_cmd_get_task (struct io_uring_cmd *cmd) -{ -return NULL ; -}#endif #endif include/linux/io_uring/cmd.h new file +81
-0@@ -0,0 +1,81 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef _LINUX_IO_URING_CMD_H +#define _LINUX_IO_URING_CMD_H + +#include <uapi/linux/io_uring.h> +#include <linux/io_uring_types.h> + +/* only top 8 bits of sqe->uring_cmd_flags for kernel internal use */ +#define IORING_URING_CMD_CANCELABLE (1U << 30) +#define IORING_URING_CMD_POLLED (1U << 31) + +struct io_uring_cmd { +struct file *file; +const struct io_uring_sqe *sqe; +union { +/* callback to defer completions to task context */ +void (*task_work_cb)(struct io_uring_cmd *cmd,unsigned ); +/* used for polled completion */ +void *cookie; + }; +u32 cmd_op; +u32 flags; +u8 pdu[32 ];/* available inline for free use */ +}; + +static inline const void *io_uring_sqe_cmd (const struct io_uring_sqe *sqe) +{ +return sqe->cmd; +} + +#if defined(CONFIG_IO_URING ) +int io_uring_cmd_import_fixed (u64 ubuf,unsigned long len,int rw, +struct iov_iter *iter,void *ioucmd); +void io_uring_cmd_done (struct io_uring_cmd *cmd,ssize_t ret,ssize_t res2, +unsigned issue_flags); +void __io_uring_cmd_do_in_task (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned ), +unsigned flags); +/* users should follow semantics of IOU_F_TWQ_LAZY_WAKE */ +void io_uring_cmd_do_in_task_lazy (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned )); + +static inline void io_uring_cmd_complete_in_task (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned )) +{ +__io_uring_cmd_do_in_task (ioucmd, task_work_cb,0 ); +} + +void io_uring_cmd_mark_cancelable (struct io_uring_cmd *cmd, +unsigned int issue_flags); +struct task_struct *io_uring_cmd_get_task (struct io_uring_cmd *cmd); + +#else +static inline int io_uring_cmd_import_fixed (u64 ubuf,unsigned long len,int rw, +struct iov_iter *iter,void *ioucmd) +{ +return -EOPNOTSUPP ; +} +static inline void io_uring_cmd_done (struct io_uring_cmd *cmd,ssize_t ret, +ssize_t ret2,unsigned issue_flags) +{ +} +static inline void io_uring_cmd_complete_in_task (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned )) +{ +} +static inline void io_uring_cmd_do_in_task_lazy (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned )) +{ +} +static inline void io_uring_cmd_mark_cancelable (struct io_uring_cmd *cmd, +unsigned int issue_flags) +{ +} +static inline struct task_struct *io_uring_cmd_get_task (struct io_uring_cmd *cmd) +{ +return NULL ; +} +#endif + +#endif /* _LINUX_IO_URING_CMD_H */ include/linux/io_uring_types.h +9
-0@@ -7,6 +7,26 @@#include <linux/llist.h> #include <uapi/linux/io_uring.h> +enum io_uring_cmd_flags { +IO_URING_F_COMPLETE_DEFER =1 , +IO_URING_F_UNLOCKED =2 , +/* the request is executed from poll, it should not be freed */ +IO_URING_F_MULTISHOT =4 , +/* executed by io-wq */ +IO_URING_F_IOWQ =8 , +/* int's last bit, sign checks are usually faster than a bit test */ +IO_URING_F_NONBLOCK =INT_MIN ,include/linux/io_uring_types.h line 28
Quoted 10 lines
include/linux/io_uring_types.h +10
-0+ +/* ctx state flags, for URING_CMD */ +IO_URING_F_SQE128 = (1 <<8 ), +IO_URING_F_CQE32 = (1 <<9 ), +IO_URING_F_IOPOLL = (1 <<10 ), + +/* set when uring wants to cancel a previously issued command */ +IO_URING_F_CANCEL = (1 <<11 ), + IO_URING_F_COMPAT = (1 << 12), +};I am wondering why you don't move
io_uring_cmd_flagsintoio_uring/cmd.h? And many above flags are used by driver now.
Quoted 2 lines
But most definitions in
io_uring_types.hare actuallyio_uringinternal stuff.
That's because these are io_uring internal execution state flags, on top of which someone started to pile up cmd flags, not the other way around. No clue why it was named io_uring_cmd_flags. iow, the first 5 flags are widely used internally, moving them would force us to add cmd.h includes into all io_uring internals.
We could split the enum in half, but that would be more ugly as there are still packed into a single unsigned. And we can also get rid of IO_URING_F_SQE128 and others by checking ctx flags directly (with a helper), it'd be way better than having a cmd copy of specific flags.
Signature · 1 line
Pavel Begunkov
Re: [PATCH 1/3] io_uring: split out cmd api into a separate header
Quoted 290 lines · Pavel Begunkov
Quoted 280 lines · Ming Lei
Quoted 265 lines · Pavel Begunkov
linux/io_uring.his slowly becoming a rubbish bin where we put anything exposed to other subsystems. For instance, the task exit hooks andio_uringcmd infra are completely orthogonal and don't need each other's definitions. Start cleaning it up by splitting out all command bits into a new header file.Signed-off-by Pavel Begunkov <[email protected]>--- drivers/block/ublk_drv.c | 2 +- drivers/nvme/host/ioctl.c | 2 +- include/linux/io_uring.h | 89 +--------------------------------- include/linux/io_uring/cmd.h | 81 +++++++++++++++++++++++++++++++ include/linux/io_uring_types.h | 20 ++++++++ io_uring/io_uring.c | 1 + io_uring/rw.c | 2 +- io_uring/uring_cmd.c | 2 +- 8 files changed, 107 insertions(+), 92 deletions(-)create mode 100644
include/linux/io_uring/cmd.hdrivers/block/ublk_drv.c +1
-1@@ -36,7 +36,7 @@#include <linux/sched/mm.h> #include <linux/uaccess.h> #include <linux/cdev.h> -#include <linux/io_uring.h> +#include <linux/io_uring/cmd.h> #include <linux/blk-mq.h> #include <linux/delay.h> #include <linux/mm.h> drivers/nvme/host/ioctl.c +1
-1@@ -5,7 +5,7 @@*/ #include <linux/ptrace.h> /* for force_successful_syscall_return */ #include <linux/nvme_ioctl.h> -#include <linux/io_uring.h> +#include <linux/io_uring/cmd.h> #include "nvme.h" enum {include/linux/io_uring.h +1
-88@@ -6,71 +6,13 @@#include <linux/xarray.h> #include <uapi/linux/io_uring.h> -enum io_uring_cmd_flags { -IO_URING_F_COMPLETE_DEFER =1 , -IO_URING_F_UNLOCKED =2 , -/* the request is executed from poll, it should not be freed */ -IO_URING_F_MULTISHOT =4 , -/* executed by io-wq */ -IO_URING_F_IOWQ =8 , -/* int's last bit, sign checks are usually faster than a bit test */ -IO_URING_F_NONBLOCK =INT_MIN , - -/* ctx state flags, for URING_CMD */ -IO_URING_F_SQE128 = (1 <<8 ), -IO_URING_F_CQE32 = (1 <<9 ), -IO_URING_F_IOPOLL = (1 <<10 ), - -/* set when uring wants to cancel a previously issued command */ -IO_URING_F_CANCEL = (1 <<11 ), -IO_URING_F_COMPAT = (1 <<12 ), -}; - -/* only top 8 bits of sqe->uring_cmd_flags for kernel internal use */ -#define IORING_URING_CMD_CANCELABLE (1U << 30) -#define IORING_URING_CMD_POLLED (1U << 31) - -struct io_uring_cmd { -struct file *file; -const struct io_uring_sqe *sqe; -union { -/* callback to defer completions to task context */ -void (*task_work_cb)(struct io_uring_cmd *cmd,unsigned ); -/* used for polled completion */ -void *cookie; - }; -u32 cmd_op; -u32 flags; -u8 pdu[32 ];/* available inline for free use */ -}; - -static inline const void *io_uring_sqe_cmd (const struct io_uring_sqe *sqe) -{ -return sqe->cmd; -} -#if defined(CONFIG_IO_URING ) -int io_uring_cmd_import_fixed (u64 ubuf,unsigned long len,int rw, -struct iov_iter *iter,void *ioucmd); -void io_uring_cmd_done (struct io_uring_cmd *cmd,ssize_t ret,ssize_t res2, -unsigned issue_flags);struct sock *io_uring_get_socket (struct file *file);void __io_uring_cancel (bool cancel_all);void __io_uring_free (struct task_struct *tsk);void io_uring_unreg_ringfd (void );const char *io_uring_get_opcode (u8 opcode); -void __io_uring_cmd_do_in_task (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned ), -unsigned flags); -/* users should follow semantics of IOU_F_TWQ_LAZY_WAKE */ -void io_uring_cmd_do_in_task_lazy (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned )); - -static inline void io_uring_cmd_complete_in_task (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned )) -{ -__io_uring_cmd_do_in_task (ioucmd, task_work_cb,0 ); -} +int io_uring_cmd_sock (struct io_uring_cmd *cmd,unsigned int issue_flags);static inline void io_uring_files_cancel (void ) {@@ -89,28 +31,7 @@ static inline void io_uring_free(struct task_struct *tsk)if (tsk->io_uring) __io_uring_free(tsk); } -int io_uring_cmd_sock (struct io_uring_cmd *cmd,unsigned int issue_flags); -void io_uring_cmd_mark_cancelable (struct io_uring_cmd *cmd, -unsigned int issue_flags); -struct task_struct *io_uring_cmd_get_task (struct io_uring_cmd *cmd);#else -static inline int io_uring_cmd_import_fixed (u64 ubuf,unsigned long len,int rw, -struct iov_iter *iter,void *ioucmd) -{ -return -EOPNOTSUPP ; -} -static inline void io_uring_cmd_done (struct io_uring_cmd *cmd,ssize_t ret, -ssize_t ret2,unsigned issue_flags) -{ -} -static inline void io_uring_cmd_complete_in_task (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned )) -{ -} -static inline void io_uring_cmd_do_in_task_lazy (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned )) -{ -}static inline struct sock *io_uring_get_socket (struct file *file) {return NULL ;@@ -133,14 +54,6 @@ static inline int io_uring_cmd_sock(struct io_uring_cmd *cmd, {return -EOPNOTSUPP ; } -static inline void io_uring_cmd_mark_cancelable (struct io_uring_cmd *cmd, -unsigned int issue_flags) -{ -} -static inline struct task_struct *io_uring_cmd_get_task (struct io_uring_cmd *cmd) -{ -return NULL ; -}#endif #endif include/linux/io_uring/cmd.h new file +81
-0@@ -0,0 +1,81 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef _LINUX_IO_URING_CMD_H +#define _LINUX_IO_URING_CMD_H + +#include <uapi/linux/io_uring.h> +#include <linux/io_uring_types.h> + +/* only top 8 bits of sqe->uring_cmd_flags for kernel internal use */ +#define IORING_URING_CMD_CANCELABLE (1U << 30) +#define IORING_URING_CMD_POLLED (1U << 31) + +struct io_uring_cmd { +struct file *file; +const struct io_uring_sqe *sqe; +union { +/* callback to defer completions to task context */ +void (*task_work_cb)(struct io_uring_cmd *cmd,unsigned ); +/* used for polled completion */ +void *cookie; + }; +u32 cmd_op; +u32 flags; +u8 pdu[32 ];/* available inline for free use */ +}; + +static inline const void *io_uring_sqe_cmd (const struct io_uring_sqe *sqe) +{ +return sqe->cmd; +} + +#if defined(CONFIG_IO_URING ) +int io_uring_cmd_import_fixed (u64 ubuf,unsigned long len,int rw, +struct iov_iter *iter,void *ioucmd); +void io_uring_cmd_done (struct io_uring_cmd *cmd,ssize_t ret,ssize_t res2, +unsigned issue_flags); +void __io_uring_cmd_do_in_task (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned ), +unsigned flags); +/* users should follow semantics of IOU_F_TWQ_LAZY_WAKE */ +void io_uring_cmd_do_in_task_lazy (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned )); + +static inline void io_uring_cmd_complete_in_task (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned )) +{ +__io_uring_cmd_do_in_task (ioucmd, task_work_cb,0 ); +} + +void io_uring_cmd_mark_cancelable (struct io_uring_cmd *cmd, +unsigned int issue_flags); +struct task_struct *io_uring_cmd_get_task (struct io_uring_cmd *cmd); + +#else +static inline int io_uring_cmd_import_fixed (u64 ubuf,unsigned long len,int rw, +struct iov_iter *iter,void *ioucmd) +{ +return -EOPNOTSUPP ; +} +static inline void io_uring_cmd_done (struct io_uring_cmd *cmd,ssize_t ret, +ssize_t ret2,unsigned issue_flags) +{ +} +static inline void io_uring_cmd_complete_in_task (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned )) +{ +} +static inline void io_uring_cmd_do_in_task_lazy (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned )) +{ +} +static inline void io_uring_cmd_mark_cancelable (struct io_uring_cmd *cmd, +unsigned int issue_flags) +{ +} +static inline struct task_struct *io_uring_cmd_get_task (struct io_uring_cmd *cmd) +{ +return NULL ; +} +#endif + +#endif /* _LINUX_IO_URING_CMD_H */ include/linux/io_uring_types.h +9
-0@@ -7,6 +7,26 @@#include <linux/llist.h> #include <uapi/linux/io_uring.h> +enum io_uring_cmd_flags { +IO_URING_F_COMPLETE_DEFER =1 , +IO_URING_F_UNLOCKED =2 , +/* the request is executed from poll, it should not be freed */ +IO_URING_F_MULTISHOT =4 , +/* executed by io-wq */ +IO_URING_F_IOWQ =8 , +/* int's last bit, sign checks are usually faster than a bit test */ +IO_URING_F_NONBLOCK =INT_MIN ,include/linux/io_uring_types.h line 27
Quoted 10 lines
include/linux/io_uring_types.h +10
-0+ +/* ctx state flags, for URING_CMD */ +IO_URING_F_SQE128 = (1 <<8 ), +IO_URING_F_CQE32 = (1 <<9 ), +IO_URING_F_IOPOLL = (1 <<10 ), + +/* set when uring wants to cancel a previously issued command */ +IO_URING_F_CANCEL = (1 <<11 ), + IO_URING_F_COMPAT = (1 << 12), +};I am wondering why you don't move
io_uring_cmd_flagsintoio_uring/cmd.h? And many above flags are used by driver now.Quoted 2 lines
But most definitions in
io_uring_types.hare actuallyio_uringinternal stuff.That's because these are
io_uringinternal execution state flags, on top of which someone started to pile up cmd flags, not the other way around. No clue why it was namedio_uring_cmd_flags. iow, the first 5 flags are widely used internally, moving them would force us to addcmd.hincludes into allio_uringinternals.
Quoted 5 lines
We could split the enum in half, but that would be more ugly as there are still packed into a single unsigned. And we can also get rid of
IO_URING_F_SQE128and others by checking ctx flags directly (with a helper), it'd be way better than having a cmd copy of specific flags.
OK, thanks for the explanation.
My only concern is about io_uring_types.h, which is used by io_uring internal except for trace. If you think it is OK to expose it to driver via io_uring/cmd.h now, this patch looks fine for me.
thanks,
Ming
kernel test robot
build botRe: [PATCH 1/3] io_uring: split out cmd api into a separate header
In reply to Pavel Begunkovkernel test robot noticed the following build errors:
Hi Pavel,
kernel test robot noticed the following build errors:
[auto build test ERROR on axboe-block/for-next]
[also build test ERROR on linus/master v6.7-rc2 next-20231124] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Pavel-Begunkov/io_uring-split-out-cmd-api-into-a-separate-header/20231123-001742 base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next patch link: https://lore.kernel.org/r/547e56560b97cd66f00bfc5b53db24f2fa1a8852.1700668641.git.asml.silence%40gmail.com patch subject: [PATCH 1/3] io_uring: split out cmd api into a separate header config: i386-defconfig (https://download.01.org/0day-ci/archive/20231124/[email protected]/config) compiler: gcc-7 (Ubuntu 7.5.0-6ubuntu2) 7.5.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231124/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All errors (new ones prefixed by >>):
security/selinux/hooks.c: In function 'selinux_uring_cmd':
>> security/selinux/hooks.c:6940:28: error: dereferencing pointer to incomplete type 'struct io_uring_cmd'
struct file *file = ioucmd->file;
^~vim +6940 security/selinux/hooks.c
f4d653dcaa4e40 Paul Moore 2022-08-10 6929
f4d653dcaa4e40 Paul Moore 2022-08-10 6930 /**
f4d653dcaa4e40 Paul Moore 2022-08-10 6931 * selinux_uring_cmd - check if IORING_OP_URING_CMD is allowed
f4d653dcaa4e40 Paul Moore 2022-08-10 6932 * @ioucmd: the io_uring command structure
f4d653dcaa4e40 Paul Moore 2022-08-10 6933 *
f4d653dcaa4e40 Paul Moore 2022-08-10 6934 * Check to see if the current domain is allowed to execute an
f4d653dcaa4e40 Paul Moore 2022-08-10 6935 * IORING_OP_URING_CMD against the device/file specified in @ioucmd.
f4d653dcaa4e40 Paul Moore 2022-08-10 6936 *
f4d653dcaa4e40 Paul Moore 2022-08-10 6937 */
f4d653dcaa4e40 Paul Moore 2022-08-10 6938 static int selinux_uring_cmd(struct io_uring_cmd *ioucmd)
f4d653dcaa4e40 Paul Moore 2022-08-10 6939 {
f4d653dcaa4e40 Paul Moore 2022-08-10 @6940 struct file *file = ioucmd->file;
f4d653dcaa4e40 Paul Moore 2022-08-10 6941 struct inode *inode = file_inode(file);
f4d653dcaa4e40 Paul Moore 2022-08-10 6942 struct inode_security_struct *isec = selinux_inode(inode);
f4d653dcaa4e40 Paul Moore 2022-08-10 6943 struct common_audit_data ad;
f4d653dcaa4e40 Paul Moore 2022-08-10 6944
f4d653dcaa4e40 Paul Moore 2022-08-10 6945 ad.type = LSM_AUDIT_DATA_FILE;
f4d653dcaa4e40 Paul Moore 2022-08-10 6946 ad.u.file = file;
f4d653dcaa4e40 Paul Moore 2022-08-10 6947
e67b79850fcc4e Stephen Smalley 2023-03-09 6948 return avc_has_perm(current_sid(), isec->sid,
f4d653dcaa4e40 Paul Moore 2022-08-10 6949 SECCLASS_IO_URING, IO_URING__CMD, &ad);
f4d653dcaa4e40 Paul Moore 2022-08-10 6950 }
740b03414b20e7 Paul Moore 2021-02-23 6951 #endif /* CONFIG_IO_URING */
740b03414b20e7 Paul Moore 2021-02-23 6952 Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
kernel test robot
build botRe: [PATCH 1/3] io_uring: split out cmd api into a separate header
In reply to Pavel Begunkovkernel test robot noticed the following build errors:
Hi Pavel,
kernel test robot noticed the following build errors:
[auto build test ERROR on axboe-block/for-next]
[also build test ERROR on linus/master v6.7-rc2 next-20231124] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Pavel-Begunkov/io_uring-split-out-cmd-api-into-a-separate-header/20231123-001742 base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next patch link: https://lore.kernel.org/r/547e56560b97cd66f00bfc5b53db24f2fa1a8852.1700668641.git.asml.silence%40gmail.com patch subject: [PATCH 1/3] io_uring: split out cmd api into a separate header config: x86_64-rhel-8.3-rust (https://download.01.org/0day-ci/archive/20231124/[email protected]/config) compiler: clang version 16.0.4 (https://github.com/llvm/llvm-project.git ae42196bc493ffe877a7e3dff8be32035dea4d07) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231124/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All errors (new ones prefixed by >>):
>> security/selinux/hooks.c:6940:28: error: incomplete definition of type 'struct io_uring_cmd'
struct file *file = ioucmd->file;
~~~~~~^
include/linux/fs.h:1913:8: note: forward declaration of 'struct io_uring_cmd'
struct io_uring_cmd;
^1 error generated.
vim +6940 security/selinux/hooks.c
f4d653dcaa4e40 Paul Moore 2022-08-10 6929
f4d653dcaa4e40 Paul Moore 2022-08-10 6930 /**
f4d653dcaa4e40 Paul Moore 2022-08-10 6931 * selinux_uring_cmd - check if IORING_OP_URING_CMD is allowed
f4d653dcaa4e40 Paul Moore 2022-08-10 6932 * @ioucmd: the io_uring command structure
f4d653dcaa4e40 Paul Moore 2022-08-10 6933 *
f4d653dcaa4e40 Paul Moore 2022-08-10 6934 * Check to see if the current domain is allowed to execute an
f4d653dcaa4e40 Paul Moore 2022-08-10 6935 * IORING_OP_URING_CMD against the device/file specified in @ioucmd.
f4d653dcaa4e40 Paul Moore 2022-08-10 6936 *
f4d653dcaa4e40 Paul Moore 2022-08-10 6937 */
f4d653dcaa4e40 Paul Moore 2022-08-10 6938 static int selinux_uring_cmd(struct io_uring_cmd *ioucmd)
f4d653dcaa4e40 Paul Moore 2022-08-10 6939 {
f4d653dcaa4e40 Paul Moore 2022-08-10 @6940 struct file *file = ioucmd->file;
f4d653dcaa4e40 Paul Moore 2022-08-10 6941 struct inode *inode = file_inode(file);
f4d653dcaa4e40 Paul Moore 2022-08-10 6942 struct inode_security_struct *isec = selinux_inode(inode);
f4d653dcaa4e40 Paul Moore 2022-08-10 6943 struct common_audit_data ad;
f4d653dcaa4e40 Paul Moore 2022-08-10 6944
f4d653dcaa4e40 Paul Moore 2022-08-10 6945 ad.type = LSM_AUDIT_DATA_FILE;
f4d653dcaa4e40 Paul Moore 2022-08-10 6946 ad.u.file = file;
f4d653dcaa4e40 Paul Moore 2022-08-10 6947
e67b79850fcc4e Stephen Smalley 2023-03-09 6948 return avc_has_perm(current_sid(), isec->sid,
f4d653dcaa4e40 Paul Moore 2022-08-10 6949 SECCLASS_IO_URING, IO_URING__CMD, &ad);
f4d653dcaa4e40 Paul Moore 2022-08-10 6950 }
740b03414b20e7 Paul Moore 2021-02-23 6951 #endif /* CONFIG_IO_URING */
740b03414b20e7 Paul Moore 2021-02-23 6952 Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
PATCH 2/3 io_uring/cmd: inline io_uring_cmd_do_in_task_lazy
In reply to Pavel BegunkovNow as we can easily include io_uring_types.h, move IOU_F_TWQ_LAZY_WAKE and inline io_uring_cmd_do_in_task_lazy().
--- include/linux/io_uring/cmd.h | 31 ++++++++++++++++--------------- include/linux/io_uring_types.h | 11 +++++++++++ io_uring/io_uring.h | 10 ---------- io_uring/uring_cmd.c | 7 ------- 4 files changed, 27 insertions(+), 32 deletions(-)
include/linux/io_uring/cmd.h +16 -15
@@ -36,15 +36,6 @@ void io_uring_cmd_done(struct io_uring_cmd *cmd, ssize_t ret, ssize_t res2,void __io_uring_cmd_do_in_task (struct io_uring_cmd *ioucmd,void (*task_work_cb)(struct io_uring_cmd *,unsigned ),unsigned flags); -/* users should follow semantics of IOU_F_TWQ_LAZY_WAKE */ -void io_uring_cmd_do_in_task_lazy (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned )); - -static inline void io_uring_cmd_complete_in_task (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned )) -{ -__io_uring_cmd_do_in_task (ioucmd, task_work_cb,0 ); -}void io_uring_cmd_mark_cancelable (struct io_uring_cmd *cmd,unsigned int issue_flags);
@@ -60,12 +51,9 @@ static inline void io_uring_cmd_done(struct io_uring_cmd *cmd, ssize_t ret, ssize_t ret2, unsigned issue_flags) { } -static inline void io_uring_cmd_complete_in_task (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned )) -{ -} -static inline void io_uring_cmd_do_in_task_lazy (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned )) +static inline void __io_uring_cmd_do_in_task (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned ), +unsigned flags) { } static inline void io_uring_cmd_mark_cancelable(struct io_uring_cmd *cmd,
@@ -78,4 +66,17 @@ static inline struct task_struct *io_uring_cmd_get_task(struct io_uring_cmd *cmd }#endif +/* users must follow the IOU_F_TWQ_LAZY_WAKE semantics */ +static inline void io_uring_cmd_do_in_task_lazy (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned )) +{ +__io_uring_cmd_do_in_task (ioucmd, task_work_cb,IOU_F_TWQ_LAZY_WAKE ); +} + +static inline void io_uring_cmd_complete_in_task (struct io_uring_cmd *ioucmd, +void (*task_work_cb)(struct io_uring_cmd *,unsigned )) +{ +__io_uring_cmd_do_in_task (ioucmd, task_work_cb,0 ); +} +#endif /* _LINUX_IO_URING_CMD_H */
include/linux/io_uring_types.h +11 -0
@@ -7,6 +7,17 @@#include <linux/llist.h> #include <uapi/linux/io_uring.h> +enum { +/* +* A hint to not wake right away but delay until there are enough of +* tw's queued to match the number of CQEs the task is waiting for. +* +* Must not be used wirh requests generating more than one CQE. +* It's also ignored unless IORING_SETUP_DEFER_TASKRUN is set. +*/ +IOU_F_TWQ_LAZY_WAKE =1 , +}; +enum io_uring_cmd_flags {IO_URING_F_COMPLETE_DEFER =1 ,IO_URING_F_UNLOCKED =2 ,
io_uring/io_uring.h +0 -10
@@ -15,16 +15,6 @@#include <trace/events/io_uring.h> #endif -enum { -/* -* A hint to not wake right away but delay until there are enough of -* tw's queued to match the number of CQEs the task is waiting for. -* -* Must not be used wirh requests generating more than one CQE. -* It's also ignored unless IORING_SETUP_DEFER_TASKRUN is set. -*/ -IOU_F_TWQ_LAZY_WAKE =1 , -};enum {IOU_OK =0 ,
io_uring/uring_cmd.c +0 -7
@@ -78,13 +78,6 @@ void __io_uring_cmd_do_in_task(struct io_uring_cmd *ioucmd, }EXPORT_SYMBOL_GPL (__io_uring_cmd_do_in_task); -void io_uring_cmd_do_in_task_lazy (struct io_uring_cmd *ioucmd, -void (*task_work_cb)(struct io_uring_cmd *,unsigned )) -{ -__io_uring_cmd_do_in_task (ioucmd, task_work_cb,IOU_F_TWQ_LAZY_WAKE ); -} -EXPORT_SYMBOL_GPL (io_uring_cmd_do_in_task_lazy); -static inline void io_req_set_cqe32_extra (struct io_kiocb *req,u64 extra1,u64 extra2) {
Signature · 1 line
2.42.1
PATCH 3/3 io_uring/cmd: inline io_uring_cmd_get_task
In reply to Pavel BegunkovWith io_uring_types.h we see all required definitions to inline io_uring_cmd_get_task().
--- include/linux/io_uring/cmd.h | 10 +++++----- io_uring/uring_cmd.c | 6 ------ 2 files changed, 5 insertions(+), 11 deletions(-)
include/linux/io_uring/cmd.h +5 -5
@@ -39,7 +39,6 @@ void __io_uring_cmd_do_in_task(struct io_uring_cmd *ioucmd,void io_uring_cmd_mark_cancelable (struct io_uring_cmd *cmd,unsigned int issue_flags); -struct task_struct *io_uring_cmd_get_task (struct io_uring_cmd *cmd);#else static inline int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw,
@@ -60,10 +59,6 @@ static inline void io_uring_cmd_mark_cancelable(struct io_uring_cmd *cmd, unsigned int issue_flags) { } -static inline struct task_struct *io_uring_cmd_get_task (struct io_uring_cmd *cmd) -{ -return NULL ; -}#endif /* users must follow the IOU_F_TWQ_LAZY_WAKE semantics */
@@ -79,4 +74,9 @@ static inline void io_uring_cmd_complete_in_task(struct io_uring_cmd *ioucmd, __io_uring_cmd_do_in_task(ioucmd, task_work_cb, 0); } +static inline struct task_struct *io_uring_cmd_get_task (struct io_uring_cmd *cmd) +{ +return cmd_to_io_kiocb (cmd)->task; +} +#endif /* _LINUX_IO_URING_CMD_H */
io_uring/uring_cmd.c +0 -6
@@ -52,12 +52,6 @@ void io_uring_cmd_mark_cancelable(struct io_uring_cmd *cmd, }EXPORT_SYMBOL_GPL (io_uring_cmd_mark_cancelable); -struct task_struct *io_uring_cmd_get_task (struct io_uring_cmd *cmd) -{ -return cmd_to_io_kiocb (cmd)->task; -} -EXPORT_SYMBOL_GPL (io_uring_cmd_get_task); -static void io_uring_cmd_work (struct io_kiocb *req,struct io_tw_state *ts) { struct io_uring_cmd *ioucmd = io_kiocb_to_cmd(req, struct io_uring_cmd);
Signature · 1 line
2.42.1