All of lore.kernel.org
 help / color / mirror / Atom feed
From: Joe Damato <jdamato@fastly.com>
To: linux-kernel@vger.kernel.org, netdev@vger.kernel.org
Cc: chuck.lever@oracle.com, jlayton@kernel.org,
	linux-api@vger.kernel.org, brauner@kernel.org,
	edumazet@google.com, davem@davemloft.net,
	alexander.duyck@gmail.com, sridhar.samudrala@intel.com,
	kuba@kernel.org, willemdebruijn.kernel@gmail.com,
	weiwan@google.com, David.Laight@ACULAB.COM, arnd@arndb.de,
	Alexander Viro <viro@zeniv.linux.org.uk>, Jan Kara <jack@suse.cz>,
	"open list:FILESYSTEMS (VFS and infrastructure)"
	<linux-fsdevel@vger.kernel.org>
Subject: Re: [PATCH net-next v5 1/3] eventpoll: support busy poll per epoll instance
Date: Mon, 5 Feb 2024 10:25:55 -0800	[thread overview]
Message-ID: <20240205182555.GA10463@fastly.com> (raw)
In-Reply-To: <20240131180811.23566-2-jdamato@fastly.com>

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
> 

  reply	other threads:[~2024-02-05 18:25 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-31 18:08 [PATCH net-next v5 0/3] Per epoll context busy poll support Joe Damato
2024-01-31 18:08 ` [PATCH net-next v5 1/3] eventpoll: support busy poll per epoll instance Joe Damato
2024-02-05 18:25   ` Joe Damato [this message]
2024-01-31 18:08 ` [PATCH net-next v5 2/3] eventpoll: Add per-epoll busy poll packet budget Joe Damato
2024-01-31 18:08 ` [PATCH net-next v5 3/3] eventpoll: Add epoll ioctl for epoll_params Joe Damato

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240205182555.GA10463@fastly.com \
    --to=jdamato@fastly.com \
    --cc=David.Laight@ACULAB.COM \
    --cc=alexander.duyck@gmail.com \
    --cc=arnd@arndb.de \
    --cc=brauner@kernel.org \
    --cc=chuck.lever@oracle.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=jack@suse.cz \
    --cc=jlayton@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=sridhar.samudrala@intel.com \
    --cc=viro@zeniv.linux.org.uk \
    --cc=weiwan@google.com \
    --cc=willemdebruijn.kernel@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.