1b66509b8SPavel Begunkov /* SPDX-License-Identifier: GPL-2.0-or-later */ 2b66509b8SPavel Begunkov #ifndef _LINUX_IO_URING_CMD_H 3b66509b8SPavel Begunkov #define _LINUX_IO_URING_CMD_H 4b66509b8SPavel Begunkov 5b66509b8SPavel Begunkov #include <uapi/linux/io_uring.h> 6b66509b8SPavel Begunkov #include <linux/io_uring_types.h> 7b66509b8SPavel Begunkov 8b66509b8SPavel Begunkov /* only top 8 bits of sqe->uring_cmd_flags for kernel internal use */ 9b66509b8SPavel Begunkov #define IORING_URING_CMD_CANCELABLE (1U << 30) 10b66509b8SPavel Begunkov #define IORING_URING_CMD_POLLED (1U << 31) 11b66509b8SPavel Begunkov 12b66509b8SPavel Begunkov struct io_uring_cmd { 13b66509b8SPavel Begunkov struct file *file; 14b66509b8SPavel Begunkov const struct io_uring_sqe *sqe; 15b66509b8SPavel Begunkov union { 16b66509b8SPavel Begunkov /* callback to defer completions to task context */ 17b66509b8SPavel Begunkov void (*task_work_cb)(struct io_uring_cmd *cmd, unsigned); 18b66509b8SPavel Begunkov /* used for polled completion */ 19b66509b8SPavel Begunkov void *cookie; 20b66509b8SPavel Begunkov }; 21b66509b8SPavel Begunkov u32 cmd_op; 22b66509b8SPavel Begunkov u32 flags; 23b66509b8SPavel Begunkov u8 pdu[32]; /* available inline for free use */ 24b66509b8SPavel Begunkov }; 25b66509b8SPavel Begunkov 26b66509b8SPavel Begunkov static inline const void *io_uring_sqe_cmd(const struct io_uring_sqe *sqe) 27b66509b8SPavel Begunkov { 28b66509b8SPavel Begunkov return sqe->cmd; 29b66509b8SPavel Begunkov } 30b66509b8SPavel Begunkov 31b66509b8SPavel Begunkov #if defined(CONFIG_IO_URING) 32b66509b8SPavel Begunkov int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw, 33b66509b8SPavel Begunkov struct iov_iter *iter, void *ioucmd); 34b66509b8SPavel Begunkov void io_uring_cmd_done(struct io_uring_cmd *cmd, ssize_t ret, ssize_t res2, 35b66509b8SPavel Begunkov unsigned issue_flags); 36b66509b8SPavel Begunkov void __io_uring_cmd_do_in_task(struct io_uring_cmd *ioucmd, 37b66509b8SPavel Begunkov void (*task_work_cb)(struct io_uring_cmd *, unsigned), 38b66509b8SPavel Begunkov unsigned flags); 39b66509b8SPavel Begunkov 40b66509b8SPavel Begunkov void io_uring_cmd_mark_cancelable(struct io_uring_cmd *cmd, 41b66509b8SPavel Begunkov unsigned int issue_flags); 42b66509b8SPavel Begunkov struct task_struct *io_uring_cmd_get_task(struct io_uring_cmd *cmd); 43b66509b8SPavel Begunkov 44b66509b8SPavel Begunkov #else 45b66509b8SPavel Begunkov static inline int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw, 46b66509b8SPavel Begunkov struct iov_iter *iter, void *ioucmd) 47b66509b8SPavel Begunkov { 48b66509b8SPavel Begunkov return -EOPNOTSUPP; 49b66509b8SPavel Begunkov } 50b66509b8SPavel Begunkov static inline void io_uring_cmd_done(struct io_uring_cmd *cmd, ssize_t ret, 51b66509b8SPavel Begunkov ssize_t ret2, unsigned issue_flags) 52b66509b8SPavel Begunkov { 53b66509b8SPavel Begunkov } 54*6b04a373SPavel Begunkov static inline void __io_uring_cmd_do_in_task(struct io_uring_cmd *ioucmd, 55*6b04a373SPavel Begunkov void (*task_work_cb)(struct io_uring_cmd *, unsigned), 56*6b04a373SPavel Begunkov unsigned flags) 57b66509b8SPavel Begunkov { 58b66509b8SPavel Begunkov } 59b66509b8SPavel Begunkov static inline void io_uring_cmd_mark_cancelable(struct io_uring_cmd *cmd, 60b66509b8SPavel Begunkov unsigned int issue_flags) 61b66509b8SPavel Begunkov { 62b66509b8SPavel Begunkov } 63b66509b8SPavel Begunkov static inline struct task_struct *io_uring_cmd_get_task(struct io_uring_cmd *cmd) 64b66509b8SPavel Begunkov { 65b66509b8SPavel Begunkov return NULL; 66b66509b8SPavel Begunkov } 67b66509b8SPavel Begunkov #endif 68b66509b8SPavel Begunkov 69*6b04a373SPavel Begunkov /* users must follow the IOU_F_TWQ_LAZY_WAKE semantics */ 70*6b04a373SPavel Begunkov static inline void io_uring_cmd_do_in_task_lazy(struct io_uring_cmd *ioucmd, 71*6b04a373SPavel Begunkov void (*task_work_cb)(struct io_uring_cmd *, unsigned)) 72*6b04a373SPavel Begunkov { 73*6b04a373SPavel Begunkov __io_uring_cmd_do_in_task(ioucmd, task_work_cb, IOU_F_TWQ_LAZY_WAKE); 74*6b04a373SPavel Begunkov } 75*6b04a373SPavel Begunkov 76*6b04a373SPavel Begunkov static inline void io_uring_cmd_complete_in_task(struct io_uring_cmd *ioucmd, 77*6b04a373SPavel Begunkov void (*task_work_cb)(struct io_uring_cmd *, unsigned)) 78*6b04a373SPavel Begunkov { 79*6b04a373SPavel Begunkov __io_uring_cmd_do_in_task(ioucmd, task_work_cb, 0); 80*6b04a373SPavel Begunkov } 81*6b04a373SPavel Begunkov 82b66509b8SPavel Begunkov #endif /* _LINUX_IO_URING_CMD_H */ 83