Skip to content

Commit fccca03

Browse files
LorenzoBianconikuba-moo
authored andcommitted
veth: take into account device reconfiguration for xdp_features flag
Take into account tx/rx queues reconfiguration setting device xdp_features flag. Moreover consider NETIF_F_GRO flag in order to enable ndo_xdp_xmit callback. Fixes: 66c0e13 ("drivers: net: turn on XDP features") Signed-off-by: Lorenzo Bianconi <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 7aa6dc3 commit fccca03

File tree

1 file changed

+38
-4
lines changed

1 file changed

+38
-4
lines changed

drivers/net/veth.c

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1257,6 +1257,26 @@ static int veth_enable_range_safe(struct net_device *dev, int start, int end)
12571257
return 0;
12581258
}
12591259

1260+
static void veth_set_xdp_features(struct net_device *dev)
1261+
{
1262+
struct veth_priv *priv = netdev_priv(dev);
1263+
struct net_device *peer;
1264+
1265+
peer = rcu_dereference(priv->peer);
1266+
if (peer && peer->real_num_tx_queues <= dev->real_num_rx_queues) {
1267+
xdp_features_t val = NETDEV_XDP_ACT_BASIC |
1268+
NETDEV_XDP_ACT_REDIRECT |
1269+
NETDEV_XDP_ACT_RX_SG;
1270+
1271+
if (priv->_xdp_prog || veth_gro_requested(dev))
1272+
val |= NETDEV_XDP_ACT_NDO_XMIT |
1273+
NETDEV_XDP_ACT_NDO_XMIT_SG;
1274+
xdp_set_features_flag(dev, val);
1275+
} else {
1276+
xdp_clear_features_flag(dev);
1277+
}
1278+
}
1279+
12601280
static int veth_set_channels(struct net_device *dev,
12611281
struct ethtool_channels *ch)
12621282
{
@@ -1323,6 +1343,12 @@ static int veth_set_channels(struct net_device *dev,
13231343
if (peer)
13241344
netif_carrier_on(peer);
13251345
}
1346+
1347+
/* update XDP supported features */
1348+
veth_set_xdp_features(dev);
1349+
if (peer)
1350+
veth_set_xdp_features(peer);
1351+
13261352
return err;
13271353

13281354
revert:
@@ -1489,7 +1515,10 @@ static int veth_set_features(struct net_device *dev,
14891515
err = veth_napi_enable(dev);
14901516
if (err)
14911517
return err;
1518+
1519+
xdp_features_set_redirect_target(dev, true);
14921520
} else {
1521+
xdp_features_clear_redirect_target(dev);
14931522
veth_napi_del(dev);
14941523
}
14951524
return 0;
@@ -1570,10 +1599,15 @@ static int veth_xdp_set(struct net_device *dev, struct bpf_prog *prog,
15701599
peer->hw_features &= ~NETIF_F_GSO_SOFTWARE;
15711600
peer->max_mtu = max_mtu;
15721601
}
1602+
1603+
xdp_features_set_redirect_target(dev, true);
15731604
}
15741605

15751606
if (old_prog) {
15761607
if (!prog) {
1608+
if (!veth_gro_requested(dev))
1609+
xdp_features_clear_redirect_target(dev);
1610+
15771611
if (dev->flags & IFF_UP)
15781612
veth_disable_xdp(dev);
15791613

@@ -1686,10 +1720,6 @@ static void veth_setup(struct net_device *dev)
16861720
dev->hw_enc_features = VETH_FEATURES;
16871721
dev->mpls_features = NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE;
16881722
netif_set_tso_max_size(dev, GSO_MAX_SIZE);
1689-
1690-
dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
1691-
NETDEV_XDP_ACT_NDO_XMIT | NETDEV_XDP_ACT_RX_SG |
1692-
NETDEV_XDP_ACT_NDO_XMIT_SG;
16931723
}
16941724

16951725
/*
@@ -1857,6 +1887,10 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
18571887
goto err_queues;
18581888

18591889
veth_disable_gro(dev);
1890+
/* update XDP supported features */
1891+
veth_set_xdp_features(dev);
1892+
veth_set_xdp_features(peer);
1893+
18601894
return 0;
18611895

18621896
err_queues:

0 commit comments

Comments
 (0)