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: Jens Axboe <axboe@kernel.dk>
Link: https://lore.kernel.org/r/20250219172552.1565603-3-axboe@kernel.dk
Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
Jens Axboe 2025-02-19 10:22:25 -07:00 committed by Christian Brauner
parent 6b47d35d4d
commit 38d2035601
No known key found for this signature in database
GPG Key ID: 91C61BC06578DCA2

View File

@ -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,17 +2047,9 @@ 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)