Commit 3bd7d748 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'io_uring-6.7-2023-12-15' of git://git.kernel.dk/linux

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
parents a62aa88b 1ba0e9d6
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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,
@@ -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);
+17 −3
Original line number Diff line number Diff line
@@ -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)
@@ -526,11 +531,20 @@ 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,
			       struct poll_table_struct *p)
+1 −1
Original line number Diff line number Diff line
@@ -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"