From: Tianyi Gao <tianyi@cloudflare.com>
To: netdev@vger.kernel.org
Cc: andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@kernel.org,
kuba@kernel.org, pabeni@redhat.com, toke@redhat.com,
lorenzo@kernel.org, horms@kernel.org, bpf@vger.kernel.org,
shuah@kernel.org, hawk@kernel.org, kernel-team@cloudflare.com,
ast@kernel.org, daniel@iogearbox.net, john.fastabend@gmail.com,
sdf@fomichev.me, linux-kselftest@vger.kernel.org,
jiayuan.chen@linux.dev, Tianyi Gao <tianyi@cloudflare.com>
Subject: [PATCH net-next 1/3] veth: refactor NAPI enable paths
Date: Thu, 5 Nov 2026 14:33:54 +0000 [thread overview]
Message-ID: <20261105143356.17062-2-tianyi@cloudflare.com> (raw)
In-Reply-To: <20261105143356.17062-1-tianyi@cloudflare.com>
veth_enable_xdp_range() adds the NAPI instances itself, only to pass
rq->xdp_napi.napi_id as the napi_id argument of xdp_rxq_info_reg(). That
argument is unused in __xdp_rxq_info_reg() since commit 5ef44b3cb43b
("xsk: Bring back busy polling support"). Pass 0 instead, as ena, bnxt
and fec already do.
veth_enable_xdp_range() then no longer needs the NAPI instances. Move
netif_napi_add() from it and from veth_napi_enable_range() into
__veth_napi_enable_range(). Add each instance in the loop that enables
it, after the allocations that can fail. Drop the napi_already_on and
delete_napi arguments.
veth_napi_enable_range() and veth_napi_enable() are then trivial
wrappers. Remove them, and rename __veth_napi_enable_range() and
__veth_napi_enable() to veth_napi_enable_range() and veth_napi_enable().
Signed-off-by: Tianyi Gao <tianyi@cloudflare.com>
---
drivers/net/veth.c | 80 +++++++++++-----------------------------------
1 file changed, 18 insertions(+), 62 deletions(-)
diff --git a/drivers/net/veth.c b/drivers/net/veth.c
index 3eca92d3dc60..a3570547ee99 100644
--- a/drivers/net/veth.c
+++ b/drivers/net/veth.c
@@ -1037,7 +1037,7 @@ static int veth_create_page_pool(struct veth_rq *rq)
return 0;
}
-static int __veth_napi_enable_range(struct net_device *dev, int start, int end)
+static int veth_napi_enable_range(struct net_device *dev, int start, int end)
{
struct veth_priv *priv = netdev_priv(dev);
int err, i;
@@ -1059,6 +1059,7 @@ static int __veth_napi_enable_range(struct net_device *dev, int start, int end)
for (i = start; i < end; i++) {
struct veth_rq *rq = &priv->rq[i];
+ netif_napi_add(dev, &rq->xdp_napi, veth_poll);
rcu_assign_pointer(rq->xdp_prog, priv->_xdp_prog);
napi_enable(&rq->xdp_napi);
rcu_assign_pointer(priv->rq[i].napi, &priv->rq[i].xdp_napi);
@@ -1079,9 +1080,9 @@ static int __veth_napi_enable_range(struct net_device *dev, int start, int end)
return err;
}
-static int __veth_napi_enable(struct net_device *dev)
+static int veth_napi_enable(struct net_device *dev)
{
- return __veth_napi_enable_range(dev, 0, dev->real_num_rx_queues);
+ return veth_napi_enable_range(dev, 0, dev->real_num_rx_queues);
}
static void veth_napi_del_range(struct net_device *dev, int start, int end)
@@ -1122,8 +1123,7 @@ static bool veth_gro_requested(const struct net_device *dev)
return !!(dev->wanted_features & NETIF_F_GRO);
}
-static int veth_enable_xdp_range(struct net_device *dev, int start, int end,
- bool napi_already_on)
+static int veth_enable_xdp_range(struct net_device *dev, int start, int end)
{
struct veth_priv *priv = netdev_priv(dev);
int err, i;
@@ -1131,9 +1131,7 @@ static int veth_enable_xdp_range(struct net_device *dev, int start, int end,
for (i = start; i < end; i++) {
struct veth_rq *rq = &priv->rq[i];
- if (!napi_already_on)
- netif_napi_add(dev, &rq->xdp_napi, veth_poll);
- err = xdp_rxq_info_reg(&rq->xdp_rxq, dev, i, rq->xdp_napi.napi_id);
+ err = xdp_rxq_info_reg(&rq->xdp_rxq, dev, i, 0);
if (err < 0)
goto err_rxq_reg;
@@ -1151,21 +1149,13 @@ static int veth_enable_xdp_range(struct net_device *dev, int start, int end,
err_reg_mem:
xdp_rxq_info_unreg(&priv->rq[i].xdp_rxq);
err_rxq_reg:
- if (!napi_already_on)
- netif_napi_del(&priv->rq[i].xdp_napi);
- for (i--; i >= start; i--) {
- struct veth_rq *rq = &priv->rq[i];
-
- xdp_rxq_info_unreg(&rq->xdp_rxq);
- if (!napi_already_on)
- netif_napi_del(&rq->xdp_napi);
- }
+ for (i--; i >= start; i--)
+ xdp_rxq_info_unreg(&priv->rq[i].xdp_rxq);
return err;
}
-static void veth_disable_xdp_range(struct net_device *dev, int start, int end,
- bool delete_napi)
+static void veth_disable_xdp_range(struct net_device *dev, int start, int end)
{
struct veth_priv *priv = netdev_priv(dev);
int i;
@@ -1175,9 +1165,6 @@ static void veth_disable_xdp_range(struct net_device *dev, int start, int end,
rq->xdp_rxq.mem = rq->xdp_mem;
xdp_rxq_info_unreg(&rq->xdp_rxq);
-
- if (delete_napi)
- netif_napi_del(&rq->xdp_napi);
}
}
@@ -1188,14 +1175,15 @@ static int veth_enable_xdp(struct net_device *dev)
int err, i;
if (!xdp_rxq_info_is_reg(&priv->rq[0].xdp_rxq)) {
- err = veth_enable_xdp_range(dev, 0, dev->real_num_rx_queues, napi_already_on);
+ err = veth_enable_xdp_range(dev, 0, dev->real_num_rx_queues);
if (err)
return err;
if (!napi_already_on) {
- err = __veth_napi_enable(dev);
+ err = veth_napi_enable(dev);
if (err) {
- veth_disable_xdp_range(dev, 0, dev->real_num_rx_queues, true);
+ veth_disable_xdp_range(dev, 0,
+ dev->real_num_rx_queues);
return err;
}
}
@@ -1220,35 +1208,7 @@ static void veth_disable_xdp(struct net_device *dev)
if (!netif_running(dev) || !veth_gro_requested(dev))
veth_napi_del(dev);
- veth_disable_xdp_range(dev, 0, dev->real_num_rx_queues, false);
-}
-
-static int veth_napi_enable_range(struct net_device *dev, int start, int end)
-{
- struct veth_priv *priv = netdev_priv(dev);
- int err, i;
-
- for (i = start; i < end; i++) {
- struct veth_rq *rq = &priv->rq[i];
-
- netif_napi_add(dev, &rq->xdp_napi, veth_poll);
- }
-
- err = __veth_napi_enable_range(dev, start, end);
- if (err) {
- for (i = start; i < end; i++) {
- struct veth_rq *rq = &priv->rq[i];
-
- netif_napi_del(&rq->xdp_napi);
- }
- return err;
- }
- return err;
-}
-
-static int veth_napi_enable(struct net_device *dev)
-{
- return veth_napi_enable_range(dev, 0, dev->real_num_rx_queues);
+ veth_disable_xdp_range(dev, 0, dev->real_num_rx_queues);
}
static void veth_disable_range_safe(struct net_device *dev, int start, int end)
@@ -1260,7 +1220,7 @@ static void veth_disable_range_safe(struct net_device *dev, int start, int end)
if (priv->_xdp_prog) {
veth_napi_del_range(dev, start, end);
- veth_disable_xdp_range(dev, start, end, false);
+ veth_disable_xdp_range(dev, start, end);
} else if (veth_gro_requested(dev)) {
veth_napi_del_range(dev, start, end);
}
@@ -1275,17 +1235,13 @@ static int veth_enable_range_safe(struct net_device *dev, int start, int end)
return 0;
if (priv->_xdp_prog) {
- /* these channels are freshly initialized, napi is not on there even
- * when GRO is requeste
- */
- err = veth_enable_xdp_range(dev, start, end, false);
+ err = veth_enable_xdp_range(dev, start, end);
if (err)
return err;
- err = __veth_napi_enable_range(dev, start, end);
+ err = veth_napi_enable_range(dev, start, end);
if (err) {
- /* on error always delete the newly added napis */
- veth_disable_xdp_range(dev, start, end, true);
+ veth_disable_xdp_range(dev, start, end);
return err;
}
} else if (veth_gro_requested(dev)) {
--
2.56.0
next prev parent reply other threads:[~2026-11-05 14:34 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-05 14:33 [PATCH net-next 0/3] veth: link RX queues to their NAPI instances Tianyi Gao
2026-11-05 14:33 ` Tianyi Gao [this message]
2026-11-05 14:33 ` [PATCH net-next 2/3] " Tianyi Gao
2026-11-05 14:33 ` [PATCH net-next 3/3] selftests: net: veth: test RX queue NAPI links Tianyi Gao
2026-11-11 1:08 ` [PATCH net-next 0/3] veth: link RX queues to their NAPI instances Jakub Kicinski
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=20261105143356.17062-2-tianyi@cloudflare.com \
--to=tianyi@cloudflare.com \
--cc=andrew+netdev@lunn.ch \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=edumazet@kernel.org \
--cc=hawk@kernel.org \
--cc=horms@kernel.org \
--cc=jiayuan.chen@linux.dev \
--cc=john.fastabend@gmail.com \
--cc=kernel-team@cloudflare.com \
--cc=kuba@kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=lorenzo@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=sdf@fomichev.me \
--cc=shuah@kernel.org \
--cc=toke@redhat.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.