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: 4+ 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
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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox