diff options
Diffstat (limited to 'include/linux/io_uring.h')
-rw-r--r-- | include/linux/io_uring.h | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/include/linux/io_uring.h b/include/linux/io_uring.h new file mode 100644 index 000000000..a1484cdb3 --- /dev/null +++ b/include/linux/io_uring.h @@ -0,0 +1,101 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef _LINUX_IO_URING_H +#define _LINUX_IO_URING_H + +#include <linux/sched.h> +#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, + /* 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 = 4, + IO_URING_F_CQE32 = 8, + IO_URING_F_IOPOLL = 16, + + /* the request is executed from poll, it should not be freed */ + IO_URING_F_MULTISHOT = 32, +}; + +struct io_uring_cmd { + struct file *file; + const void *cmd; + 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 */ +}; + +#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_complete_in_task(struct io_uring_cmd *ioucmd, + void (*task_work_cb)(struct io_uring_cmd *, unsigned)); +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); + +static inline void io_uring_files_cancel(void) +{ + if (current->io_uring) { + io_uring_unreg_ringfd(); + __io_uring_cancel(false); + } +} +static inline void io_uring_task_cancel(void) +{ + if (current->io_uring) + __io_uring_cancel(true); +} +static inline void io_uring_free(struct task_struct *tsk) +{ + if (tsk->io_uring) + __io_uring_free(tsk); +} +#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 struct sock *io_uring_get_socket(struct file *file) +{ + return NULL; +} +static inline void io_uring_task_cancel(void) +{ +} +static inline void io_uring_files_cancel(void) +{ +} +static inline void io_uring_free(struct task_struct *tsk) +{ +} +static inline const char *io_uring_get_opcode(u8 opcode) +{ + return ""; +} +#endif + +#endif |