Skip to content

Commit 8267fc7

Browse files
LorenzoBianconiAlexei Starovoitov
authored andcommitted
veth: take into account peer device for NETDEV_XDP_ACT_NDO_XMIT xdp_features flag
For veth pairs, NETDEV_XDP_ACT_NDO_XMIT is supported by the current device if the peer one is running a XDP program or if it has GRO enabled. Fix the xdp_features flags reporting considering peer device and not current one for NETDEV_XDP_ACT_NDO_XMIT. Fixes: fccca03 ("veth: take into account device reconfiguration for xdp_features flag") Signed-off-by: Lorenzo Bianconi <[email protected]> Link: https://lore.kernel.org/r/4f1ca6f6f6b42ae125bfdb5c7782217c83968b2e.1681767806.git.lorenzo@kernel.org Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent c730fce commit 8267fc7

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

drivers/net/veth.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1262,11 +1262,12 @@ static void veth_set_xdp_features(struct net_device *dev)
12621262

12631263
peer = rtnl_dereference(priv->peer);
12641264
if (peer && peer->real_num_tx_queues <= dev->real_num_rx_queues) {
1265+
struct veth_priv *priv_peer = netdev_priv(peer);
12651266
xdp_features_t val = NETDEV_XDP_ACT_BASIC |
12661267
NETDEV_XDP_ACT_REDIRECT |
12671268
NETDEV_XDP_ACT_RX_SG;
12681269

1269-
if (priv->_xdp_prog || veth_gro_requested(dev))
1270+
if (priv_peer->_xdp_prog || veth_gro_requested(peer))
12701271
val |= NETDEV_XDP_ACT_NDO_XMIT |
12711272
NETDEV_XDP_ACT_NDO_XMIT_SG;
12721273
xdp_set_features_flag(dev, val);
@@ -1504,19 +1505,23 @@ static int veth_set_features(struct net_device *dev,
15041505
{
15051506
netdev_features_t changed = features ^ dev->features;
15061507
struct veth_priv *priv = netdev_priv(dev);
1508+
struct net_device *peer;
15071509
int err;
15081510

15091511
if (!(changed & NETIF_F_GRO) || !(dev->flags & IFF_UP) || priv->_xdp_prog)
15101512
return 0;
15111513

1514+
peer = rtnl_dereference(priv->peer);
15121515
if (features & NETIF_F_GRO) {
15131516
err = veth_napi_enable(dev);
15141517
if (err)
15151518
return err;
15161519

1517-
xdp_features_set_redirect_target(dev, true);
1520+
if (peer)
1521+
xdp_features_set_redirect_target(peer, true);
15181522
} else {
1519-
xdp_features_clear_redirect_target(dev);
1523+
if (peer)
1524+
xdp_features_clear_redirect_target(peer);
15201525
veth_napi_del(dev);
15211526
}
15221527
return 0;
@@ -1598,13 +1603,13 @@ static int veth_xdp_set(struct net_device *dev, struct bpf_prog *prog,
15981603
peer->max_mtu = max_mtu;
15991604
}
16001605

1601-
xdp_features_set_redirect_target(dev, true);
1606+
xdp_features_set_redirect_target(peer, true);
16021607
}
16031608

16041609
if (old_prog) {
16051610
if (!prog) {
1606-
if (!veth_gro_requested(dev))
1607-
xdp_features_clear_redirect_target(dev);
1611+
if (peer && !veth_gro_requested(dev))
1612+
xdp_features_clear_redirect_target(peer);
16081613

16091614
if (dev->flags & IFF_UP)
16101615
veth_disable_xdp(dev);

0 commit comments

Comments
 (0)