xref: /openbmc/linux/include/linux/io_uring.h (revision 303c0a13)
10f212204SJens Axboe /* SPDX-License-Identifier: GPL-2.0-or-later */
20f212204SJens Axboe #ifndef _LINUX_IO_URING_H
30f212204SJens Axboe #define _LINUX_IO_URING_H
40f212204SJens Axboe 
50f212204SJens Axboe #include <linux/sched.h>
60f212204SJens Axboe #include <linux/xarray.h>
7a9216facSAnuj Gupta #include <uapi/linux/io_uring.h>
898447d65SJens Axboe 
9ee692a21SJens Axboe enum io_uring_cmd_flags {
10ee692a21SJens Axboe 	IO_URING_F_COMPLETE_DEFER	= 1,
11ee692a21SJens Axboe 	IO_URING_F_UNLOCKED		= 2,
127500194aSPavel Begunkov 	/* the request is executed from poll, it should not be freed */
137500194aSPavel Begunkov 	IO_URING_F_MULTISHOT		= 4,
14e6aeb272SPavel Begunkov 	/* executed by io-wq */
15e6aeb272SPavel Begunkov 	IO_URING_F_IOWQ			= 8,
16ee692a21SJens Axboe 	/* int's last bit, sign checks are usually faster than a bit test */
17ee692a21SJens Axboe 	IO_URING_F_NONBLOCK		= INT_MIN,
18ee692a21SJens Axboe 
19ee692a21SJens Axboe 	/* ctx state flags, for URING_CMD */
207500194aSPavel Begunkov 	IO_URING_F_SQE128		= (1 << 8),
217500194aSPavel Begunkov 	IO_URING_F_CQE32		= (1 << 9),
227500194aSPavel Begunkov 	IO_URING_F_IOPOLL		= (1 << 10),
23ee692a21SJens Axboe };
24ee692a21SJens Axboe 
25ee692a21SJens Axboe struct io_uring_cmd {
26ee692a21SJens Axboe 	struct file	*file;
27fd9b8547SBreno Leitao 	const struct io_uring_sqe *sqe;
285756a3a7SKanchan Joshi 	union {
29ee692a21SJens Axboe 		/* callback to defer completions to task context */
309d2789acSJens Axboe 		void (*task_work_cb)(struct io_uring_cmd *cmd, unsigned);
315756a3a7SKanchan Joshi 		/* used for polled completion */
325756a3a7SKanchan Joshi 		void *cookie;
335756a3a7SKanchan Joshi 	};
34ee692a21SJens Axboe 	u32		cmd_op;
359cda70f6SAnuj Gupta 	u32		flags;
36ee692a21SJens Axboe 	u8		pdu[32]; /* available inline for free use */
37ee692a21SJens Axboe };
38ee692a21SJens Axboe 
io_uring_sqe_cmd(const struct io_uring_sqe * sqe)39293007b0SJens Axboe static inline const void *io_uring_sqe_cmd(const struct io_uring_sqe *sqe)
40293007b0SJens Axboe {
41293007b0SJens Axboe 	return sqe->cmd;
42293007b0SJens Axboe }
43293007b0SJens Axboe 
440f212204SJens Axboe #if defined(CONFIG_IO_URING)
45a9216facSAnuj Gupta int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw,
46a9216facSAnuj Gupta 			      struct iov_iter *iter, void *ioucmd);
479d2789acSJens Axboe void io_uring_cmd_done(struct io_uring_cmd *cmd, ssize_t ret, ssize_t res2,
489d2789acSJens Axboe 			unsigned issue_flags);
49f552a27aSHao Xu void __io_uring_cancel(bool cancel_all);
500f212204SJens Axboe void __io_uring_free(struct task_struct *tsk);
51e7a6c00dSJens Axboe void io_uring_unreg_ringfd(void);
5233337d03SDylan Yudaken const char *io_uring_get_opcode(u8 opcode);
535f3139fcSPavel Begunkov void __io_uring_cmd_do_in_task(struct io_uring_cmd *ioucmd,
545f3139fcSPavel Begunkov 			    void (*task_work_cb)(struct io_uring_cmd *, unsigned),
555f3139fcSPavel Begunkov 			    unsigned flags);
565f3139fcSPavel Begunkov /* users should follow semantics of IOU_F_TWQ_LAZY_WAKE */
575f3139fcSPavel Begunkov void io_uring_cmd_do_in_task_lazy(struct io_uring_cmd *ioucmd,
585f3139fcSPavel Begunkov 			void (*task_work_cb)(struct io_uring_cmd *, unsigned));
595f3139fcSPavel Begunkov 
io_uring_cmd_complete_in_task(struct io_uring_cmd * ioucmd,void (* task_work_cb)(struct io_uring_cmd *,unsigned))605f3139fcSPavel Begunkov static inline void io_uring_cmd_complete_in_task(struct io_uring_cmd *ioucmd,
615f3139fcSPavel Begunkov 			void (*task_work_cb)(struct io_uring_cmd *, unsigned))
625f3139fcSPavel Begunkov {
635f3139fcSPavel Begunkov 	__io_uring_cmd_do_in_task(ioucmd, task_work_cb, 0);
645f3139fcSPavel Begunkov }
650f212204SJens Axboe 
io_uring_files_cancel(void)66f552a27aSHao Xu static inline void io_uring_files_cancel(void)
670f212204SJens Axboe {
68e7a6c00dSJens Axboe 	if (current->io_uring) {
69e7a6c00dSJens Axboe 		io_uring_unreg_ringfd();
70f552a27aSHao Xu 		__io_uring_cancel(false);
713f48cf18SPavel Begunkov 	}
72e7a6c00dSJens Axboe }
io_uring_task_cancel(void)733f48cf18SPavel Begunkov static inline void io_uring_task_cancel(void)
743f48cf18SPavel Begunkov {
75a4aadd11SHao Xu 	if (current->io_uring)
76f552a27aSHao Xu 		__io_uring_cancel(true);
770f212204SJens Axboe }
io_uring_free(struct task_struct * tsk)780f212204SJens Axboe static inline void io_uring_free(struct task_struct *tsk)
790f212204SJens Axboe {
800f212204SJens Axboe 	if (tsk->io_uring)
810f212204SJens Axboe 		__io_uring_free(tsk);
820f212204SJens Axboe }
838e9fad0eSBreno Leitao int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags);
84*303c0a13SJens Axboe bool io_is_uring_fops(struct file *file);
850f212204SJens Axboe #else
io_uring_cmd_import_fixed(u64 ubuf,unsigned long len,int rw,struct iov_iter * iter,void * ioucmd)860e0abad2SGeert Uytterhoeven static inline int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw,
87a9216facSAnuj Gupta 			      struct iov_iter *iter, void *ioucmd)
88a9216facSAnuj Gupta {
89a9216facSAnuj Gupta 	return -EOPNOTSUPP;
90a9216facSAnuj Gupta }
io_uring_cmd_done(struct io_uring_cmd * cmd,ssize_t ret,ssize_t ret2,unsigned issue_flags)91ee692a21SJens Axboe static inline void io_uring_cmd_done(struct io_uring_cmd *cmd, ssize_t ret,
929d2789acSJens Axboe 		ssize_t ret2, unsigned issue_flags)
93ee692a21SJens Axboe {
94ee692a21SJens Axboe }
io_uring_cmd_complete_in_task(struct io_uring_cmd * ioucmd,void (* task_work_cb)(struct io_uring_cmd *,unsigned))95ee692a21SJens Axboe static inline void io_uring_cmd_complete_in_task(struct io_uring_cmd *ioucmd,
969d2789acSJens Axboe 			void (*task_work_cb)(struct io_uring_cmd *, unsigned))
97ee692a21SJens Axboe {
98ee692a21SJens Axboe }
io_uring_cmd_do_in_task_lazy(struct io_uring_cmd * ioucmd,void (* task_work_cb)(struct io_uring_cmd *,unsigned))995f3139fcSPavel Begunkov static inline void io_uring_cmd_do_in_task_lazy(struct io_uring_cmd *ioucmd,
1005f3139fcSPavel Begunkov 			void (*task_work_cb)(struct io_uring_cmd *, unsigned))
1015f3139fcSPavel Begunkov {
1025f3139fcSPavel Begunkov }
io_uring_task_cancel(void)1030f212204SJens Axboe static inline void io_uring_task_cancel(void)
1040f212204SJens Axboe {
1050f212204SJens Axboe }
io_uring_files_cancel(void)106f552a27aSHao Xu static inline void io_uring_files_cancel(void)
1070f212204SJens Axboe {
1080f212204SJens Axboe }
io_uring_free(struct task_struct * tsk)1090f212204SJens Axboe static inline void io_uring_free(struct task_struct *tsk)
1100f212204SJens Axboe {
1110f212204SJens Axboe }
io_uring_get_opcode(u8 opcode)11233337d03SDylan Yudaken static inline const char *io_uring_get_opcode(u8 opcode)
11333337d03SDylan Yudaken {
11433337d03SDylan Yudaken 	return "";
11533337d03SDylan Yudaken }
io_uring_cmd_sock(struct io_uring_cmd * cmd,unsigned int issue_flags)1168e9fad0eSBreno Leitao static inline int io_uring_cmd_sock(struct io_uring_cmd *cmd,
1178e9fad0eSBreno Leitao 				    unsigned int issue_flags)
1188e9fad0eSBreno Leitao {
1198e9fad0eSBreno Leitao 	return -EOPNOTSUPP;
1208e9fad0eSBreno Leitao }
io_is_uring_fops(struct file * file)121*303c0a13SJens Axboe static inline bool io_is_uring_fops(struct file *file)
122*303c0a13SJens Axboe {
123*303c0a13SJens Axboe 	return false;
124*303c0a13SJens Axboe }
1250f212204SJens Axboe #endif
1260f212204SJens Axboe 
1270f212204SJens Axboe #endif
128