Skip to content

Commit

Permalink
Merge tag 'io_uring-6.7-2023-12-15' of git://git.kernel.dk/linux
Browse files Browse the repository at this point in the history
Pull io_uring fixes from Jens Axboe:
 "Just two minor fixes:

   - Fix for the io_uring socket option commands using the wrong value
     on some archs (Al)

   - Tweak to the poll lazy wake enable (me)"

* tag 'io_uring-6.7-2023-12-15' of git://git.kernel.dk/linux:
  io_uring/cmd: fix breakage in SOCKET_URING_OP_SIOC* implementation
  io_uring/poll: don't enable lazy wake for POLLEXCLUSIVE
  • Loading branch information
Linus Torvalds committed Dec 15, 2023
2 parents a62aa88 + 1ba0e9d commit 3bd7d74
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 4 deletions.
3 changes: 3 additions & 0 deletions include/linux/io_uring_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,7 @@ enum {
/* keep async read/write and isreg together and in order */
REQ_F_SUPPORT_NOWAIT_BIT,
REQ_F_ISREG_BIT,
REQ_F_POLL_NO_LAZY_BIT,

/* not a real bit, just to check we're not overflowing the space */
__REQ_F_LAST_BIT,
Expand Down Expand Up @@ -501,6 +502,8 @@ enum {
REQ_F_CLEAR_POLLIN = BIT(REQ_F_CLEAR_POLLIN_BIT),
/* hashed into ->cancel_hash_locked, protected by ->uring_lock */
REQ_F_HASH_LOCKED = BIT(REQ_F_HASH_LOCKED_BIT),
/* don't use lazy poll wake for this request */
REQ_F_POLL_NO_LAZY = BIT(REQ_F_POLL_NO_LAZY_BIT),
};

typedef void (*io_req_tw_func_t)(struct io_kiocb *req, struct io_tw_state *ts);
Expand Down
20 changes: 17 additions & 3 deletions io_uring/poll.c
Original file line number Diff line number Diff line change
Expand Up @@ -366,11 +366,16 @@ void io_poll_task_func(struct io_kiocb *req, struct io_tw_state *ts)

static void __io_poll_execute(struct io_kiocb *req, int mask)
{
unsigned flags = 0;

io_req_set_res(req, mask, 0);
req->io_task_work.func = io_poll_task_func;

trace_io_uring_task_add(req, mask);
__io_req_task_work_add(req, IOU_F_TWQ_LAZY_WAKE);

if (!(req->flags & REQ_F_POLL_NO_LAZY))
flags = IOU_F_TWQ_LAZY_WAKE;
__io_req_task_work_add(req, flags);
}

static inline void io_poll_execute(struct io_kiocb *req, int res)
Expand Down Expand Up @@ -526,10 +531,19 @@ static void __io_queue_proc(struct io_poll *poll, struct io_poll_table *pt,
poll->head = head;
poll->wait.private = (void *) wqe_private;

if (poll->events & EPOLLEXCLUSIVE)
if (poll->events & EPOLLEXCLUSIVE) {
/*
* Exclusive waits may only wake a limited amount of entries
* rather than all of them, this may interfere with lazy
* wake if someone does wait(events > 1). Ensure we don't do
* lazy wake for those, as we need to process each one as they
* come in.
*/
req->flags |= REQ_F_POLL_NO_LAZY;
add_wait_queue_exclusive(head, &poll->wait);
else
} else {
add_wait_queue(head, &poll->wait);
}
}

static void io_poll_queue_proc(struct file *file, struct wait_queue_head *head,
Expand Down
2 changes: 1 addition & 1 deletion io_uring/uring_cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#include <linux/nospec.h>

#include <uapi/linux/io_uring.h>
#include <uapi/asm-generic/ioctls.h>
#include <asm/ioctls.h>

#include "io_uring.h"
#include "rsrc.h"
Expand Down

0 comments on commit 3bd7d74

Please sign in to comment.