From: Heng Qi <hengqi@linux.alibaba.com>
To: netdev@vger.kernel.org, bpf@vger.kernel.org
Cc: Paolo Abeni <pabeni@redhat.com>, Jakub Kicinski <kuba@kernel.org>,
Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Subject: [PATCH 2/2] Revert "veth: Avoid drop packets when xdp_redirect performs"
Date: Mon, 21 Nov 2022 19:28:48 +0800 [thread overview]
Message-ID: <20221121112848.51388-3-hengqi@linux.alibaba.com> (raw)
In-Reply-To: <20221121112848.51388-1-hengqi@linux.alibaba.com>
This reverts commit 2e0de6366ac16ab4d0abb2aaddbc8a1eba216d11.
Based on the issues reported by John and Paolo and their comments,
this patch and the corresponding fix 5e5dc33d5da are reverted, and
we'll remake it.
Signed-off-by: Heng Qi <hengqi@linux.alibaba.com>
Reviewed-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
---
drivers/net/veth.c | 88 +++++++---------------------------------------
1 file changed, 12 insertions(+), 76 deletions(-)
diff --git a/drivers/net/veth.c b/drivers/net/veth.c
index b1ed5a93b6c5..ac7c0653695f 100644
--- a/drivers/net/veth.c
+++ b/drivers/net/veth.c
@@ -1119,14 +1119,10 @@ static void veth_disable_xdp_range(struct net_device *dev, int start, int end,
static int veth_enable_xdp(struct net_device *dev)
{
+ bool napi_already_on = veth_gro_requested(dev) && (dev->flags & IFF_UP);
struct veth_priv *priv = netdev_priv(dev);
- bool napi_already_on;
- struct veth_rq *rq;
int err, i;
- rq = &priv->rq[0];
- napi_already_on = (dev->flags & IFF_UP) && rcu_access_pointer(rq->napi);
-
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);
if (err)
@@ -1327,28 +1323,18 @@ static int veth_set_channels(struct net_device *dev,
static int veth_open(struct net_device *dev)
{
- struct veth_priv *peer_priv, *priv = netdev_priv(dev);
+ struct veth_priv *priv = netdev_priv(dev);
struct net_device *peer = rtnl_dereference(priv->peer);
- struct veth_rq *peer_rq;
int err;
if (!peer)
return -ENOTCONN;
- peer_priv = netdev_priv(peer);
- peer_rq = &peer_priv->rq[0];
-
if (priv->_xdp_prog) {
err = veth_enable_xdp(dev);
if (err)
return err;
- /* refer to the logic in veth_xdp_set() */
- if (!rtnl_dereference(peer_rq->napi)) {
- err = veth_napi_enable(peer);
- if (err)
- return err;
- }
- } else if (veth_gro_requested(dev) || peer_priv->_xdp_prog) {
+ } else if (veth_gro_requested(dev)) {
err = veth_napi_enable(dev);
if (err)
return err;
@@ -1364,29 +1350,17 @@ static int veth_open(struct net_device *dev)
static int veth_close(struct net_device *dev)
{
- struct veth_priv *peer_priv, *priv = netdev_priv(dev);
+ struct veth_priv *priv = netdev_priv(dev);
struct net_device *peer = rtnl_dereference(priv->peer);
- struct veth_rq *peer_rq;
netif_carrier_off(dev);
- if (peer) {
- peer_priv = netdev_priv(peer);
- peer_rq = &peer_priv->rq[0];
- }
+ if (peer)
+ netif_carrier_off(peer);
- if (priv->_xdp_prog) {
+ if (priv->_xdp_prog)
veth_disable_xdp(dev);
- /* refer to the logic in veth_xdp_set */
- if (peer && rtnl_dereference(peer_rq->napi)) {
- if (!veth_gro_requested(peer) && !peer_priv->_xdp_prog)
- veth_napi_del(peer);
- }
- } else if (veth_gro_requested(dev) || (peer && peer_priv->_xdp_prog)) {
+ else if (veth_gro_requested(dev))
veth_napi_del(dev);
- }
-
- if (peer)
- netif_carrier_off(peer);
return 0;
}
@@ -1496,21 +1470,17 @@ static int veth_set_features(struct net_device *dev,
{
netdev_features_t changed = features ^ dev->features;
struct veth_priv *priv = netdev_priv(dev);
- struct veth_rq *rq = &priv->rq[0];
int err;
if (!(changed & NETIF_F_GRO) || !(dev->flags & IFF_UP) || priv->_xdp_prog)
return 0;
if (features & NETIF_F_GRO) {
- if (!rtnl_dereference(rq->napi)) {
- err = veth_napi_enable(dev);
- if (err)
- return err;
- }
+ err = veth_napi_enable(dev);
+ if (err)
+ return err;
} else {
- if (rtnl_dereference(rq->napi))
- veth_napi_del(dev);
+ veth_napi_del(dev);
}
return 0;
}
@@ -1542,19 +1512,14 @@ static int veth_xdp_set(struct net_device *dev, struct bpf_prog *prog,
struct netlink_ext_ack *extack)
{
struct veth_priv *priv = netdev_priv(dev);
- struct veth_priv *peer_priv;
struct bpf_prog *old_prog;
- struct veth_rq *peer_rq;
struct net_device *peer;
- bool napi_already_off;
unsigned int max_mtu;
- bool noreq_napi;
int err;
old_prog = priv->_xdp_prog;
priv->_xdp_prog = prog;
peer = rtnl_dereference(priv->peer);
- peer_priv = netdev_priv(peer);
if (prog) {
if (!peer) {
@@ -1591,24 +1556,6 @@ static int veth_xdp_set(struct net_device *dev, struct bpf_prog *prog,
}
}
- if (peer && (peer->flags & IFF_UP)) {
- peer_rq = &peer_priv->rq[0];
-
- /* If the peer hasn't enabled GRO and loaded xdp,
- * then we enable napi automatically if its napi
- * is not ready.
- */
- napi_already_off = !rtnl_dereference(peer_rq->napi);
- if (napi_already_off) {
- err = veth_napi_enable(peer);
- if (err) {
- NL_SET_ERR_MSG_MOD(extack,
- "Failed to automatically enable napi of peer");
- goto err;
- }
- }
- }
-
if (!old_prog) {
peer->hw_features &= ~NETIF_F_GSO_SOFTWARE;
peer->max_mtu = max_mtu;
@@ -1623,17 +1570,6 @@ static int veth_xdp_set(struct net_device *dev, struct bpf_prog *prog,
if (peer) {
peer->hw_features |= NETIF_F_GSO_SOFTWARE;
peer->max_mtu = ETH_MAX_MTU;
- peer_rq = &peer_priv->rq[0];
-
- /* If the peer doesn't has its xdp and enabled
- * GRO, then we disable napi if its napi is ready;
- */
- if (rtnl_dereference(peer_rq->napi)) {
- noreq_napi = !veth_gro_requested(peer) &&
- !peer_priv->_xdp_prog;
- if (noreq_napi && (peer->flags & IFF_UP))
- veth_napi_del(peer);
- }
}
}
bpf_prog_put(old_prog);
--
2.19.1.6.gb485710b
next prev parent reply other threads:[~2022-11-21 11:34 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-17 23:33 [PATCH net-next 0/2] veth: a couple of fixes Paolo Abeni
2022-11-17 23:33 ` [PATCH net-next 1/2] veth: fix uninitialized napi disable Paolo Abeni
2022-11-17 23:33 ` [PATCH net-next 2/2] veth: fix double napi enable Paolo Abeni
2022-11-18 14:24 ` Heng Qi
2022-11-18 8:41 ` [PATCH net-next 0/2] veth: a couple of fixes Paolo Abeni
2022-11-18 11:05 ` Toke Høiland-Jørgensen
2022-11-19 1:06 ` Jakub Kicinski
2022-11-21 6:15 ` John Fastabend
2022-11-21 3:33 ` Xuan Zhuo
2022-11-21 3:55 ` Heng Qi
2022-11-21 10:11 ` Paolo Abeni
2022-11-21 11:28 ` [PATCH 0/2] Revert "veth: Avoid drop packets when xdp_redirect performs" and its fix Heng Qi
2022-11-21 11:28 ` [PATCH 1/2] Revert "bpf: veth driver panics when xdp prog attached before veth_open" Heng Qi
2022-11-21 11:28 ` Heng Qi [this message]
2022-11-22 3:50 [PATCH 0/2] Revert "veth: Avoid drop packets when xdp_redirect performs" and its fix Heng Qi
2022-11-22 3:50 ` [PATCH 2/2] Revert "veth: Avoid drop packets when xdp_redirect performs" Heng Qi
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=20221121112848.51388-3-hengqi@linux.alibaba.com \
--to=hengqi@linux.alibaba.com \
--cc=bpf@vger.kernel.org \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=xuanzhuo@linux.alibaba.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;
as well as URLs for NNTP newsgroup(s).