Unverified Commit 38d20356 authored by Jens Axboe's avatar Jens Axboe Committed by Christian Brauner
Browse files

eventpoll: abstract out ep_try_send_events() helper



In preparation for reusing this helper in another epoll setup helper,
abstract it out.

Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
Link: https://lore.kernel.org/r/20250219172552.1565603-3-axboe@kernel.dk


Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent 6b47d35d
Loading
Loading
Loading
Loading
+18 −10
Original line number Diff line number Diff line
@@ -1980,6 +1980,22 @@ static int ep_autoremove_wake_function(struct wait_queue_entry *wq_entry,
	return ret;
}

static int ep_try_send_events(struct eventpoll *ep,
			      struct epoll_event __user *events, int maxevents)
{
	int res;

	/*
	 * Try to transfer events to user space. In case we get 0 events and
	 * there's still timeout left over, we go trying again in search of
	 * more luck.
	 */
	res = ep_send_events(ep, events, maxevents);
	if (res > 0)
		ep_suspend_napi_irqs(ep);
	return res;
}

/**
 * ep_poll - Retrieves ready events, and delivers them to the caller-supplied
 *           event buffer.
@@ -2031,18 +2047,10 @@ static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events,

	while (1) {
		if (eavail) {
			/*
			 * Try to transfer events to user space. In case we get
			 * 0 events and there's still timeout left over, we go
			 * trying again in search of more luck.
			 */
			res = ep_send_events(ep, events, maxevents);
			if (res) {
				if (res > 0)
					ep_suspend_napi_irqs(ep);
			res = ep_try_send_events(ep, events, maxevents);
			if (res)
				return res;
		}
		}

		if (timed_out)
			return 0;