lkml.org 
[lkml]   [2024]   [Feb]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH net-next v5 1/3] eventpoll: support busy poll per epoll instance
    On Wed, Jan 31, 2024 at 06:08:03PM +0000, Joe Damato wrote:
    > Allow busy polling on a per-epoll context basis. The per-epoll context
    > usec timeout value is preferred, but the pre-existing system wide sysctl
    > value is still supported if it specified.
    >
    > Note that this change uses an xor: either per epoll instance busy polling
    > is enabled on the epoll instance or system wide epoll is enabled. Enabling
    > both is disallowed.

    I just realized that I updated the code below to use a an or (||) instead
    of xor (^), but forgot to update the commit message.

    I can fix this and send a v6.

    >
    > Signed-off-by: Joe Damato <jdamato@fastly.com>
    > ---
    > fs/eventpoll.c | 49 +++++++++++++++++++++++++++++++++++++++++++++----
    > 1 file changed, 45 insertions(+), 4 deletions(-)
    >
    > diff --git a/fs/eventpoll.c b/fs/eventpoll.c
    > index 3534d36a1474..ce75189d46df 100644
    > --- a/fs/eventpoll.c
    > +++ b/fs/eventpoll.c
    > @@ -227,6 +227,8 @@ struct eventpoll {
    > #ifdef CONFIG_NET_RX_BUSY_POLL
    > /* used to track busy poll napi_id */
    > unsigned int napi_id;
    > + /* busy poll timeout */
    > + u64 busy_poll_usecs;
    > #endif
    >
    > #ifdef CONFIG_DEBUG_LOCK_ALLOC
    > @@ -386,12 +388,44 @@ static inline int ep_events_available(struct eventpoll *ep)
    > READ_ONCE(ep->ovflist) != EP_UNACTIVE_PTR;
    > }
    >
    > +/**
    > + * busy_loop_ep_timeout - check if busy poll has timed out. The timeout value
    > + * from the epoll instance ep is preferred, but if it is not set fallback to
    > + * the system-wide global via busy_loop_timeout.
    > + *
    > + * @start_time: The start time used to compute the remaining time until timeout.
    > + * @ep: Pointer to the eventpoll context.
    > + *
    > + * Return: true if the timeout has expired, false otherwise.
    > + */
    > +static inline bool busy_loop_ep_timeout(unsigned long start_time, struct eventpoll *ep)
    > +{
    > +#ifdef CONFIG_NET_RX_BUSY_POLL
    > + unsigned long bp_usec = READ_ONCE(ep->busy_poll_usecs);
    > +
    > + if (bp_usec) {
    > + unsigned long end_time = start_time + bp_usec;
    > + unsigned long now = busy_loop_current_time();
    > +
    > + return time_after(now, end_time);
    > + } else {
    > + return busy_loop_timeout(start_time);
    > + }
    > +#endif
    > + return true;
    > +}
    > +
    > #ifdef CONFIG_NET_RX_BUSY_POLL
    > +static bool ep_busy_loop_on(struct eventpoll *ep)
    > +{
    > + return !!ep->busy_poll_usecs || net_busy_loop_on();
    > +}
    > +
    > static bool ep_busy_loop_end(void *p, unsigned long start_time)
    > {
    > struct eventpoll *ep = p;
    >
    > - return ep_events_available(ep) || busy_loop_timeout(start_time);
    > + return ep_events_available(ep) || busy_loop_ep_timeout(start_time, ep);
    > }
    >
    > /*
    > @@ -404,7 +438,7 @@ static bool ep_busy_loop(struct eventpoll *ep, int nonblock)
    > {
    > unsigned int napi_id = READ_ONCE(ep->napi_id);
    >
    > - if ((napi_id >= MIN_NAPI_ID) && net_busy_loop_on()) {
    > + if ((napi_id >= MIN_NAPI_ID) && ep_busy_loop_on(ep)) {
    > napi_busy_loop(napi_id, nonblock ? NULL : ep_busy_loop_end, ep, false,
    > BUSY_POLL_BUDGET);
    > if (ep_events_available(ep))
    > @@ -430,7 +464,8 @@ static inline void ep_set_busy_poll_napi_id(struct epitem *epi)
    > struct socket *sock;
    > struct sock *sk;
    >
    > - if (!net_busy_loop_on())
    > + ep = epi->ep;
    > + if (!ep_busy_loop_on(ep))
    > return;
    >
    > sock = sock_from_file(epi->ffd.file);
    > @@ -442,7 +477,6 @@ static inline void ep_set_busy_poll_napi_id(struct epitem *epi)
    > return;
    >
    > napi_id = READ_ONCE(sk->sk_napi_id);
    > - ep = epi->ep;
    >
    > /* Non-NAPI IDs can be rejected
    > * or
    > @@ -466,6 +500,10 @@ static inline void ep_set_busy_poll_napi_id(struct epitem *epi)
    > {
    > }
    >
    > +static inline bool ep_busy_loop_on(struct eventpoll *ep)
    > +{
    > + return false;
    > +}
    > #endif /* CONFIG_NET_RX_BUSY_POLL */
    >
    > /*
    > @@ -2058,6 +2096,9 @@ static int do_epoll_create(int flags)
    > error = PTR_ERR(file);
    > goto out_free_fd;
    > }
    > +#ifdef CONFIG_NET_RX_BUSY_POLL
    > + ep->busy_poll_usecs = 0;
    > +#endif
    > ep->file = file;
    > fd_install(fd, file);
    > return fd;
    > --
    > 2.25.1
    >

    \
     
     \ /
      Last update: 2024-05-27 14:49    [W:2.180 / U:0.668 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site