Skip to content

Commit 5f3139f

Browse files
isilenceaxboe
authored andcommitted
io_uring/cmd: add cmd lazy tw wake helper
We want to use IOU_F_TWQ_LAZY_WAKE in commands. First, introduce a new cmd tw helper accepting TWQ flags, and then add io_uring_cmd_do_in_task_laz() that will pass IOU_F_TWQ_LAZY_WAKE and imply the "lazy" semantics, i.e. it posts no more than 1 CQE and delaying execution of this tw should not prevent forward progress. Signed-off-by: Pavel Begunkov <[email protected]> Link: https://lore.kernel.org/r/5b9f6716006df7e817f18bd555aee2f8f9c8b0c3.1684154817.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <[email protected]>
1 parent 5498bf2 commit 5f3139f

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

include/linux/io_uring.h

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,23 @@ int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw,
4646
struct iov_iter *iter, void *ioucmd);
4747
void io_uring_cmd_done(struct io_uring_cmd *cmd, ssize_t ret, ssize_t res2,
4848
unsigned issue_flags);
49-
void io_uring_cmd_complete_in_task(struct io_uring_cmd *ioucmd,
50-
void (*task_work_cb)(struct io_uring_cmd *, unsigned));
5149
struct sock *io_uring_get_socket(struct file *file);
5250
void __io_uring_cancel(bool cancel_all);
5351
void __io_uring_free(struct task_struct *tsk);
5452
void io_uring_unreg_ringfd(void);
5553
const char *io_uring_get_opcode(u8 opcode);
54+
void __io_uring_cmd_do_in_task(struct io_uring_cmd *ioucmd,
55+
void (*task_work_cb)(struct io_uring_cmd *, unsigned),
56+
unsigned flags);
57+
/* users should follow semantics of IOU_F_TWQ_LAZY_WAKE */
58+
void io_uring_cmd_do_in_task_lazy(struct io_uring_cmd *ioucmd,
59+
void (*task_work_cb)(struct io_uring_cmd *, unsigned));
60+
61+
static inline void io_uring_cmd_complete_in_task(struct io_uring_cmd *ioucmd,
62+
void (*task_work_cb)(struct io_uring_cmd *, unsigned))
63+
{
64+
__io_uring_cmd_do_in_task(ioucmd, task_work_cb, 0);
65+
}
5666

5767
static inline void io_uring_files_cancel(void)
5868
{
@@ -85,6 +95,10 @@ static inline void io_uring_cmd_complete_in_task(struct io_uring_cmd *ioucmd,
8595
void (*task_work_cb)(struct io_uring_cmd *, unsigned))
8696
{
8797
}
98+
static inline void io_uring_cmd_do_in_task_lazy(struct io_uring_cmd *ioucmd,
99+
void (*task_work_cb)(struct io_uring_cmd *, unsigned))
100+
{
101+
}
88102
static inline struct sock *io_uring_get_socket(struct file *file)
89103
{
90104
return NULL;

io_uring/uring_cmd.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,24 @@ static void io_uring_cmd_work(struct io_kiocb *req, struct io_tw_state *ts)
2020
ioucmd->task_work_cb(ioucmd, issue_flags);
2121
}
2222

23-
void io_uring_cmd_complete_in_task(struct io_uring_cmd *ioucmd,
24-
void (*task_work_cb)(struct io_uring_cmd *, unsigned))
23+
void __io_uring_cmd_do_in_task(struct io_uring_cmd *ioucmd,
24+
void (*task_work_cb)(struct io_uring_cmd *, unsigned),
25+
unsigned flags)
2526
{
2627
struct io_kiocb *req = cmd_to_io_kiocb(ioucmd);
2728

2829
ioucmd->task_work_cb = task_work_cb;
2930
req->io_task_work.func = io_uring_cmd_work;
30-
io_req_task_work_add(req);
31+
__io_req_task_work_add(req, flags);
32+
}
33+
EXPORT_SYMBOL_GPL(__io_uring_cmd_do_in_task);
34+
35+
void io_uring_cmd_do_in_task_lazy(struct io_uring_cmd *ioucmd,
36+
void (*task_work_cb)(struct io_uring_cmd *, unsigned))
37+
{
38+
__io_uring_cmd_do_in_task(ioucmd, task_work_cb, IOU_F_TWQ_LAZY_WAKE);
3139
}
32-
EXPORT_SYMBOL_GPL(io_uring_cmd_complete_in_task);
40+
EXPORT_SYMBOL_GPL(io_uring_cmd_do_in_task_lazy);
3341

3442
static inline void io_req_set_cqe32_extra(struct io_kiocb *req,
3543
u64 extra1, u64 extra2)

0 commit comments

Comments
 (0)