Message ID | 20240205210453.11301-2-jdamato@fastly.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel+bounces-53938-ouuuleilei=gmail.com@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:168b:b0:106:860b:bbdd with SMTP id ma11csp1179957dyb; Mon, 5 Feb 2024 14:16:44 -0800 (PST) X-Google-Smtp-Source: AGHT+IFI/rlsU5pJcanAXgK5SIs8cN3j0Tsc/Nr1NKv9YdP57+qOqnv2+RPFPPkieGvFQzvLsmvf X-Received: by 2002:a05:6a20:394b:b0:19e:5e0c:3bb8 with SMTP id r11-20020a056a20394b00b0019e5e0c3bb8mr1590900pzg.7.1707171403978; Mon, 05 Feb 2024 14:16:43 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1707171403; cv=pass; d=google.com; s=arc-20160816; b=fY3ZR5AtZgRzLYpKhwWCHtC28+gMPzqDybiyhVmuKqSGUTsVnUYptXYSem27L4jn2w SvAChBPjsm0p90qR2zMGrgWTb3OHWqGJhMpCf2R9qXuRWM+hcVQZq0WODuLfgCfMrFRo G/b0YNnsf08/HplqVZ4L33Aq8tCkmduqPIR8vESSwPFj9+b0aXcBTdNAd1W3/a6RVr4X O2ofg8YzCESGACuyesCNLD9RgT03MMKKlp61cp9Ry19ClhdukGAUVsKyTHb5HUccD0OE 6hCNKCWujAHjTAYVuGIsn7gphzBZSE38uWVnbK7bywvJTUi9tsppNB06AimP5F39LBvC rBuQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=//WWP3LIv7F69f9OvZE6kAJ/ncD/SOZi/tM1IcQuzWk=; fh=skA7SLVRv358uqRyuCHjBwVBIPhTdENtzypQpjF+Njc=; b=LjKW0FZZMdaRQp5M0IZbtwWXHk66fxzLN+/wl2OXwh6jZjpefABHyyvc4IrQ7i07JS vZzq/GNO+xVimEGIeUx6FaagGhjT2m1Xlg6nk9fAKxQHQYs363Gw7r0gZ2Bt6p/BSyuX nDjHxvuAXpg8xXctpUQC0QM3R9smfPnVTcb/pOFWXYebs695XdmkqgsvViJRF3PHImQx SxNT+ZvwW6yNe3+W3DAc10rMpbUo85IckIkyrWINiSAVMpFkHM9nq7fs5l7Y2TVwR1cd 3yQVfw7omXTtjymdDFQwjClRZDIwkOKeT9lNijy2R5V4hRWGERI5tGWTqD1VwuTE93xV jOig==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@fastly.com header.s=google header.b=Z9p1Typm; arc=pass (i=1 spf=pass spfdomain=fastly.com dkim=pass dkdomain=fastly.com dmarc=pass fromdomain=fastly.com); spf=pass (google.com: domain of linux-kernel+bounces-53938-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-53938-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=fastly.com X-Forwarded-Encrypted: i=1; AJvYcCUyDZGd23EILsqsY4/rtw7HoaLys2agDU4y+96N4WK7f/aM7Jfq78OkblRhw7erNWXn1yqfO+95WVYfzCICeEioC/N3rA== Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id j22-20020a632316000000b005be3683ec6asi529642pgj.184.2024.02.05.14.16.43 for <ouuuleilei@gmail.com> (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Feb 2024 14:16:43 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-53938-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@fastly.com header.s=google header.b=Z9p1Typm; arc=pass (i=1 spf=pass spfdomain=fastly.com dkim=pass dkdomain=fastly.com dmarc=pass fromdomain=fastly.com); spf=pass (google.com: domain of linux-kernel+bounces-53938-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-53938-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=fastly.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id AF0F8B27105 for <ouuuleilei@gmail.com>; Mon, 5 Feb 2024 21:57:58 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8569813D4E6; Mon, 5 Feb 2024 21:05:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=fastly.com header.i=@fastly.com header.b="Z9p1Typm" Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 99E1213B79A for <linux-kernel@vger.kernel.org>; Mon, 5 Feb 2024 21:05:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707167105; cv=none; b=fEFdeyzY+35z7PIN5tHsElgJZpcEMMPlJdR7iYc/jSuEIYcTiV2eS4lECj6ZOO68EvCiwI5ruZGiztDO6f0ePHkQ5j2yup5S3QrC5jrszogEmvaqfK/90dyrFoqviVqjv/srbsP9sFop3sGLeOVm8x4u13/ZgJ4qDj8T1qLO9JY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707167105; c=relaxed/simple; bh=gQDKvGU/ghxRMfcflvdwZ024OwvFboTrSVuhgGT5PSY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Pga4PgqKfbfcjuFNGAs0dIDFGqTiV0WyW0WKQ+Iei8No2rz6gsXsW8uIjeyr97/WdL7V47sG6jhVWnee2KHN3lM3+tcLkJwgV50RVRZOP34lJt8hTyAHcQMPWNAEwnluI3lWFkqIKWPmGxWDqte/r1sR4kQgUo+VGBlQ+ZwE+9A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=fastly.com; spf=pass smtp.mailfrom=fastly.com; dkim=pass (1024-bit key) header.d=fastly.com header.i=@fastly.com header.b=Z9p1Typm; arc=none smtp.client-ip=209.85.210.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=fastly.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=fastly.com Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-6e055baec89so162568b3a.1 for <linux-kernel@vger.kernel.org>; Mon, 05 Feb 2024 13:05:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fastly.com; s=google; t=1707167102; x=1707771902; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=//WWP3LIv7F69f9OvZE6kAJ/ncD/SOZi/tM1IcQuzWk=; b=Z9p1TypmZBncIk3hMD3ssbrfbGNvV//XFL3azhO5lzVQ3E3tzoSmMHONBmlisJZYiG ZMZiiGkgGSxZJjSft0H4/VdeUKNTyPmplMCthd9vrMGOs2hNYy8x5/AiCHv0h+h3s5jp 7v9zjyEi+3j6DrJxYtAlokCirPCDmcZDz/T2o= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1707167102; x=1707771902; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=//WWP3LIv7F69f9OvZE6kAJ/ncD/SOZi/tM1IcQuzWk=; b=VfaqEuTtrURbFUFe+EkeLiC93KqatTc1OR1Z0kUOqqx1Hje5SKSyOgZIpIYNiNcywb ktwe3elzpz8bqjbv22c5aJBuj2aSzVxZOGAdSHc6T+VFlBoclYEeXLIInH9XzAqkDS46 xnuAzOkPygm9tCEoIyg9gxK9pCi/bEHQTDzD0FcPMjwu79FZ/259C2b1T3nLTLFOORDI V1JnFzgixQyvInKhaomwx4EAn7ffhumdFb2AxAf2/e4d5L2CrWzbK5r/xVT3nxNSKO+j PMCCooY5tcCbpzREJ6y0w6ujRV0NpzJTMcs71Ks0uD/0K8FVFULR9V8ME6GndlRzreXx RkYQ== X-Gm-Message-State: AOJu0YxyjcVhpSoudthnjHFhNPP5FnXeiNrBhYprQBVqPlz/BU1H8icx wwQqBjBQERmLghuDObuCX2n6XjHUGmQ6yOQLGvBBQY01V3M+r7iSzGNCLnzLeq5XFxfUuUXEVkU OA14LhaEva6mDQvfKQvqB/H/UL8aRXpCCIYmY+DB7dkGEnWDAQhEQMoY3Qt5q4p+mJbX8eWNj2P kL2WabVBXvsQU7P6zCLZs3apBzxprnTf2H1/poZ7QLoGDovw== X-Received: by 2002:aa7:88d0:0:b0:6e0:405f:ef8d with SMTP id k16-20020aa788d0000000b006e0405fef8dmr5450050pff.8.1707167101863; Mon, 05 Feb 2024 13:05:01 -0800 (PST) X-Forwarded-Encrypted: i=0; AJvYcCV0V7zW2Chf3BKlfYDuPfCvy127acHgLLl/mxXnRfIXqkHQCrQaQCPHdzazH8xfDSiXyKXxDAueYNvzI5Np8XwDPN9VFhyCsI/seiejAqnkBwWYlAIraIZTqvzT1jWdBJjgIYJg+S8qdc+J0padB7TRXlFeO4wU8oN/787VAdH9YX3HjMvC1iTU15fBaj57sOpTXPiLe0gaLgRk+Oyn0hCBygc8JUZPOQCQLCa58l9VRsWqlBWhy0ldc0/xQdKWLedO4A3GZgOAWY8FTZGYhutzcb++BPzwHk8tt509jQHGEA0E4smfPQBmWPK3b6zYUSjNCDkb7s/N0d/A5cTdU/6+/Zc84r4SFUUF7ey9P4dHQbE8oSxdo9/6grXe0IblW1hW28CRUI+KROaAQx2fKD0/BRNzFiShZRS6At7UG1y7RzCxXhEB00PPg4SkrBTf14nbukfvwi8OcCoP6cWk8gPxqPBdafgnzncvXql9bw48+qEi4/SC96wpgrucv6d6tr/9+lvtgLRAEVljlg7OP3N8l8kkGjbHSXTQQM2aSmzw8DrTZUMewHKF+EWZtdugy/VYyeJj7kJXH13ydUAmVmKgir3VjWEg4zW7FrKpSmujyLaJs5Iv9cLIZ4r7ccI= Received: from localhost.localdomain ([2620:11a:c018:0:ea8:be91:8d1:f59b]) by smtp.gmail.com with ESMTPSA id p9-20020aa79e89000000b006e03efbcb3esm315750pfq.73.2024.02.05.13.04.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Feb 2024 13:05:01 -0800 (PST) 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, sdf@google.com, amritha.nambiar@intel.com, Joe Damato <jdamato@fastly.com>, Alexander Viro <viro@zeniv.linux.org.uk>, Jan Kara <jack@suse.cz>, linux-fsdevel@vger.kernel.org (open list:FILESYSTEMS (VFS and infrastructure)) Subject: [PATCH net-next v6 1/4] eventpoll: support busy poll per epoll instance Date: Mon, 5 Feb 2024 21:04:46 +0000 Message-Id: <20240205210453.11301-2-jdamato@fastly.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240205210453.11301-1-jdamato@fastly.com> References: <20240205210453.11301-1-jdamato@fastly.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: <linux-kernel.vger.kernel.org> List-Subscribe: <mailto:linux-kernel+subscribe@vger.kernel.org> List-Unsubscribe: <mailto:linux-kernel+unsubscribe@vger.kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1790098962281889241 X-GMAIL-MSGID: 1790098962281889241 |
Series |
Per epoll context busy poll support
|
|
Commit Message
Joe Damato
Feb. 5, 2024, 9:04 p.m. UTC
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.
Signed-off-by: Joe Damato <jdamato@fastly.com>
---
fs/eventpoll.c | 49 +++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 45 insertions(+), 4 deletions(-)
Comments
On Mon, 5 Feb 2024 21:04:46 +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. Why do we need u64 for usecs? I think u16 would do, and u32 would give a very solid "engineering margin". If it was discussed in previous versions I think it's worth explaining in the commit message.
On Wed, Feb 07, 2024 at 11:04:13AM -0800, Jakub Kicinski wrote: > On Mon, 5 Feb 2024 21:04:46 +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. > > Why do we need u64 for usecs? I think u16 would do, and u32 would give > a very solid "engineering margin". If it was discussed in previous > versions I think it's worth explaining in the commit message. In patch 4/4 the value is limited to U32_MAX, but if you prefer I use a u32 here instead, I can make that change.
On Wed, 7 Feb 2024 11:14:08 -0800 Joe Damato wrote: > > Why do we need u64 for usecs? I think u16 would do, and u32 would give > > a very solid "engineering margin". If it was discussed in previous > > versions I think it's worth explaining in the commit message. > > In patch 4/4 the value is limited to U32_MAX, but if you prefer I use a u32 > here instead, I can make that change. Unless you have a clear reason not to, I think using u32 would be more natural? If my head math is right the range for u32 is 4096 sec, slightly over an hour? I'd use u32 and limit it to S32_MAX.
On Wed, Feb 07, 2024 at 12:11:24PM -0800, Jakub Kicinski wrote: > On Wed, 7 Feb 2024 11:14:08 -0800 Joe Damato wrote: > > > Why do we need u64 for usecs? I think u16 would do, and u32 would give > > > a very solid "engineering margin". If it was discussed in previous > > > versions I think it's worth explaining in the commit message. > > > > In patch 4/4 the value is limited to U32_MAX, but if you prefer I use a u32 > > here instead, I can make that change. > > Unless you have a clear reason not to, I think using u32 would be more > natural? If my head math is right the range for u32 is 4096 sec, > slightly over an hour? I'd use u32 and limit it to S32_MAX. OK, that seems fine. Sorry for the noob question, but since that represents a fucntional change to patch 4/4, I believe I would need to drop Jiri's Reviewed-by, is that right?
On Wed, 7 Feb 2024 12:23:23 -0800 Joe Damato wrote: > > Unless you have a clear reason not to, I think using u32 would be more > > natural? If my head math is right the range for u32 is 4096 sec, > > slightly over an hour? I'd use u32 and limit it to S32_MAX. > > OK, that seems fine. Sorry for the noob question, but since that represents > a fucntional change to patch 4/4, I believe I would need to drop Jiri's > Reviewed-by, is that right? I'd default to keeping it. But the review tag retention rules are one of the more subjective things in kernel developments.
On Mon, Feb 5, 2024 at 10:05 PM Joe Damato <jdamato@fastly.com> 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. > > 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 It seems this local helper is only called from code compiled when CONFIG_NET_RX_BUSY_POLL is set. Not sure why you need an #ifdef here. > + 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 >
On Thu, Feb 08, 2024 at 06:46:25PM +0100, Eric Dumazet wrote: > On Mon, Feb 5, 2024 at 10:05 PM Joe Damato <jdamato@fastly.com> 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. > > > > 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 > > It seems this local helper is only called from code compiled when > CONFIG_NET_RX_BUSY_POLL > is set. > > Not sure why you need an #ifdef here. Thanks, you are right. I'll move this down to be within CONFIG_NET_RX_BUSY_POLL and get rid of the #ifdef for the v7. Thanks for your review. > > + 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 > >
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;