Skip to content

Commit 66c0e13

Browse files
Marek MajtykaAlexei Starovoitov
Marek Majtyka
authored and
Alexei Starovoitov
committed
drivers: net: turn on XDP features
A summary of the flags being set for various drivers is given below. Note that XDP_F_REDIRECT_TARGET and XDP_F_FRAG_TARGET are features that can be turned off and on at runtime. This means that these flags may be set and unset under RTNL lock protection by the driver. Hence, READ_ONCE must be used by code loading the flag value. Also, these flags are not used for synchronization against the availability of XDP resources on a device. It is merely a hint, and hence the read may race with the actual teardown of XDP resources on the device. This may change in the future, e.g. operations taking a reference on the XDP resources of the driver, and in turn inhibiting turning off this flag. However, for now, it can only be used as a hint to check whether device supports becoming a redirection target. Turn 'hw-offload' feature flag on for: - netronome (nfp) - netdevsim. Turn 'native' and 'zerocopy' features flags on for: - intel (i40e, ice, ixgbe, igc) - mellanox (mlx5). - stmmac - netronome (nfp) Turn 'native' features flags on for: - amazon (ena) - broadcom (bnxt) - freescale (dpaa, dpaa2, enetc) - funeth - intel (igb) - marvell (mvneta, mvpp2, octeontx2) - mellanox (mlx4) - mtk_eth_soc - qlogic (qede) - sfc - socionext (netsec) - ti (cpsw) - tap - tsnep - veth - xen - virtio_net. Turn 'basic' (tx, pass, aborted and drop) features flags on for: - netronome (nfp) - cavium (thunder) - hyperv. Turn 'redirect_target' feature flag on for: - amanzon (ena) - broadcom (bnxt) - freescale (dpaa, dpaa2) - intel (i40e, ice, igb, ixgbe) - ti (cpsw) - marvell (mvneta, mvpp2) - sfc - socionext (netsec) - qlogic (qede) - mellanox (mlx5) - tap - veth - virtio_net - xen Reviewed-by: Gerhard Engleder <[email protected]> Reviewed-by: Simon Horman <[email protected]> Acked-by: Stanislav Fomichev <[email protected]> Acked-by: Jakub Kicinski <[email protected]> Co-developed-by: Kumar Kartikeya Dwivedi <[email protected]> Signed-off-by: Kumar Kartikeya Dwivedi <[email protected]> Co-developed-by: Lorenzo Bianconi <[email protected]> Signed-off-by: Lorenzo Bianconi <[email protected]> Signed-off-by: Marek Majtyka <[email protected]> Link: https://lore.kernel.org/r/3eca9fafb308462f7edb1f58e451d59209aa07eb.1675245258.git.lorenzo@kernel.org Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent d3d854f commit 66c0e13

File tree

40 files changed

+184
-5
lines changed

40 files changed

+184
-5
lines changed

drivers/net/ethernet/amazon/ena/ena_netdev.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,9 @@ static int ena_xdp_set(struct net_device *netdev, struct netdev_bpf *bpf)
597597
if (rc)
598598
return rc;
599599
}
600+
xdp_features_set_redirect_target(netdev, false);
600601
} else if (old_bpf_prog) {
602+
xdp_features_clear_redirect_target(netdev);
601603
rc = ena_destroy_and_free_all_xdp_queues(adapter);
602604
if (rc)
603605
return rc;
@@ -4103,6 +4105,8 @@ static void ena_set_conf_feat_params(struct ena_adapter *adapter,
41034105
/* Set offload features */
41044106
ena_set_dev_offloads(feat, netdev);
41054107

4108+
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT;
4109+
41064110
adapter->max_mtu = feat->dev_attr.max_mtu;
41074111
netdev->max_mtu = adapter->max_mtu;
41084112
netdev->min_mtu = ENA_MIN_MTU;

drivers/net/ethernet/aquantia/atlantic/aq_nic.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,11 @@ void aq_nic_ndev_init(struct aq_nic_s *self)
384384
self->ndev->mtu = aq_nic_cfg->mtu - ETH_HLEN;
385385
self->ndev->max_mtu = aq_hw_caps->mtu - ETH_FCS_LEN - ETH_HLEN;
386386

387+
self->ndev->xdp_features = NETDEV_XDP_ACT_BASIC |
388+
NETDEV_XDP_ACT_REDIRECT |
389+
NETDEV_XDP_ACT_NDO_XMIT |
390+
NETDEV_XDP_ACT_RX_SG |
391+
NETDEV_XDP_ACT_NDO_XMIT_SG;
387392
}
388393

389394
void aq_nic_set_tx_ring(struct aq_nic_s *self, unsigned int idx,

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13686,6 +13686,9 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1368613686

1368713687
netif_set_tso_max_size(dev, GSO_MAX_SIZE);
1368813688

13689+
dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
13690+
NETDEV_XDP_ACT_RX_SG;
13691+
1368913692
#ifdef CONFIG_BNXT_SRIOV
1369013693
init_waitqueue_head(&bp->sriov_cfg_wait);
1369113694
#endif

drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,9 +422,11 @@ static int bnxt_xdp_set(struct bnxt *bp, struct bpf_prog *prog)
422422

423423
if (prog) {
424424
bnxt_set_rx_skb_mode(bp, true);
425+
xdp_features_set_redirect_target(dev, true);
425426
} else {
426427
int rx, tx;
427428

429+
xdp_features_clear_redirect_target(dev);
428430
bnxt_set_rx_skb_mode(bp, false);
429431
bnxt_get_max_rings(bp, &rx, &tx, true);
430432
if (rx > 1) {

drivers/net/ethernet/cavium/thunder/nicvf_main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2218,6 +2218,8 @@ static int nicvf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
22182218
netdev->netdev_ops = &nicvf_netdev_ops;
22192219
netdev->watchdog_timeo = NICVF_TX_TIMEOUT;
22202220

2221+
netdev->xdp_features = NETDEV_XDP_ACT_BASIC;
2222+
22212223
/* MTU range: 64 - 9200 */
22222224
netdev->min_mtu = NIC_HW_MIN_FRS;
22232225
netdev->max_mtu = NIC_HW_MAX_FRS;

drivers/net/ethernet/engleder/tsnep_main.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1926,6 +1926,10 @@ static int tsnep_probe(struct platform_device *pdev)
19261926
netdev->features = NETIF_F_SG;
19271927
netdev->hw_features = netdev->features | NETIF_F_LOOPBACK;
19281928

1929+
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
1930+
NETDEV_XDP_ACT_NDO_XMIT |
1931+
NETDEV_XDP_ACT_NDO_XMIT_SG;
1932+
19291933
/* carrier off reporting is important to ethtool even BEFORE open */
19301934
netif_carrier_off(netdev);
19311935

drivers/net/ethernet/freescale/dpaa/dpaa_eth.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,10 @@ static int dpaa_netdev_init(struct net_device *net_dev,
244244
net_dev->features |= net_dev->hw_features;
245245
net_dev->vlan_features = net_dev->features;
246246

247+
net_dev->xdp_features = NETDEV_XDP_ACT_BASIC |
248+
NETDEV_XDP_ACT_REDIRECT |
249+
NETDEV_XDP_ACT_NDO_XMIT;
250+
247251
if (is_valid_ether_addr(mac_addr)) {
248252
memcpy(net_dev->perm_addr, mac_addr, net_dev->addr_len);
249253
eth_hw_addr_set(net_dev, mac_addr);

drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4596,6 +4596,10 @@ static int dpaa2_eth_netdev_init(struct net_device *net_dev)
45964596
NETIF_F_LLTX | NETIF_F_HW_TC | NETIF_F_TSO;
45974597
net_dev->gso_max_segs = DPAA2_ETH_ENQUEUE_MAX_FDS;
45984598
net_dev->hw_features = net_dev->features;
4599+
net_dev->xdp_features = NETDEV_XDP_ACT_BASIC |
4600+
NETDEV_XDP_ACT_REDIRECT |
4601+
NETDEV_XDP_ACT_XSK_ZEROCOPY |
4602+
NETDEV_XDP_ACT_NDO_XMIT;
45994603

46004604
if (priv->dpni_attrs.vlan_filter_entries)
46014605
net_dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;

drivers/net/ethernet/freescale/enetc/enetc_pf.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,9 @@ static void enetc_pf_netdev_setup(struct enetc_si *si, struct net_device *ndev,
807807
ndev->hw_features |= NETIF_F_RXHASH;
808808

809809
ndev->priv_flags |= IFF_UNICAST_FLT;
810+
ndev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
811+
NETDEV_XDP_ACT_NDO_XMIT | NETDEV_XDP_ACT_RX_SG |
812+
NETDEV_XDP_ACT_NDO_XMIT_SG;
810813

811814
if (si->hw_features & ENETC_SI_F_PSFP && !enetc_psfp_enable(priv)) {
812815
priv->active_offloads |= ENETC_F_QCI;

drivers/net/ethernet/fungible/funeth/funeth_main.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,6 +1160,11 @@ static int fun_xdp_setup(struct net_device *dev, struct netdev_bpf *xdp)
11601160
WRITE_ONCE(rxqs[i]->xdp_prog, prog);
11611161
}
11621162

1163+
if (prog)
1164+
xdp_features_set_redirect_target(dev, true);
1165+
else
1166+
xdp_features_clear_redirect_target(dev);
1167+
11631168
dev->max_mtu = prog ? XDP_MAX_MTU : FUN_MAX_MTU;
11641169
old_prog = xchg(&fp->xdp_prog, prog);
11651170
if (old_prog)
@@ -1765,6 +1770,7 @@ static int fun_create_netdev(struct fun_ethdev *ed, unsigned int portid)
17651770
netdev->vlan_features = netdev->features & VLAN_FEAT;
17661771
netdev->mpls_features = netdev->vlan_features;
17671772
netdev->hw_enc_features = netdev->hw_features;
1773+
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT;
17681774

17691775
netdev->min_mtu = ETH_MIN_MTU;
17701776
netdev->max_mtu = FUN_MAX_MTU;

drivers/net/ethernet/intel/i40e/i40e_main.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13339,9 +13339,11 @@ static int i40e_xdp_setup(struct i40e_vsi *vsi, struct bpf_prog *prog,
1333913339
old_prog = xchg(&vsi->xdp_prog, prog);
1334013340

1334113341
if (need_reset) {
13342-
if (!prog)
13342+
if (!prog) {
13343+
xdp_features_clear_redirect_target(vsi->netdev);
1334313344
/* Wait until ndo_xsk_wakeup completes. */
1334413345
synchronize_rcu();
13346+
}
1334513347
i40e_reset_and_rebuild(pf, true, true);
1334613348
}
1334713349

@@ -13362,11 +13364,13 @@ static int i40e_xdp_setup(struct i40e_vsi *vsi, struct bpf_prog *prog,
1336213364
/* Kick start the NAPI context if there is an AF_XDP socket open
1336313365
* on that queue id. This so that receiving will start.
1336413366
*/
13365-
if (need_reset && prog)
13367+
if (need_reset && prog) {
1336613368
for (i = 0; i < vsi->num_queue_pairs; i++)
1336713369
if (vsi->xdp_rings[i]->xsk_pool)
1336813370
(void)i40e_xsk_wakeup(vsi->netdev, i,
1336913371
XDP_WAKEUP_RX);
13372+
xdp_features_set_redirect_target(vsi->netdev, true);
13373+
}
1337013374

1337113375
return 0;
1337213376
}
@@ -13783,6 +13787,8 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
1378313787
netdev->hw_enc_features |= NETIF_F_TSO_MANGLEID;
1378413788

1378513789
netdev->features &= ~NETIF_F_HW_TC;
13790+
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
13791+
NETDEV_XDP_ACT_XSK_ZEROCOPY;
1378613792

1378713793
if (vsi->type == I40E_VSI_MAIN) {
1378813794
SET_NETDEV_DEV(netdev, &pf->pdev->dev);

drivers/net/ethernet/intel/ice/ice_main.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "ice_eswitch.h"
2323
#include "ice_tc_lib.h"
2424
#include "ice_vsi_vlan_ops.h"
25+
#include <net/xdp_sock_drv.h>
2526

2627
#define DRV_SUMMARY "Intel(R) Ethernet Connection E800 Series Linux Driver"
2728
static const char ice_driver_string[] = DRV_SUMMARY;
@@ -2912,11 +2913,13 @@ ice_xdp_setup_prog(struct ice_vsi *vsi, struct bpf_prog *prog,
29122913
if (xdp_ring_err)
29132914
NL_SET_ERR_MSG_MOD(extack, "Setting up XDP Tx resources failed");
29142915
}
2916+
xdp_features_set_redirect_target(vsi->netdev, false);
29152917
/* reallocate Rx queues that are used for zero-copy */
29162918
xdp_ring_err = ice_realloc_zc_buf(vsi, true);
29172919
if (xdp_ring_err)
29182920
NL_SET_ERR_MSG_MOD(extack, "Setting up XDP Rx resources failed");
29192921
} else if (ice_is_xdp_ena_vsi(vsi) && !prog) {
2922+
xdp_features_clear_redirect_target(vsi->netdev);
29202923
xdp_ring_err = ice_destroy_xdp_rings(vsi);
29212924
if (xdp_ring_err)
29222925
NL_SET_ERR_MSG_MOD(extack, "Freeing XDP Tx resources failed");
@@ -3459,6 +3462,8 @@ static int ice_cfg_netdev(struct ice_vsi *vsi)
34593462
np->vsi = vsi;
34603463

34613464
ice_set_netdev_features(netdev);
3465+
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
3466+
NETDEV_XDP_ACT_XSK_ZEROCOPY;
34623467

34633468
ice_set_ops(netdev);
34643469

drivers/net/ethernet/intel/igb/igb_main.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2871,8 +2871,14 @@ static int igb_xdp_setup(struct net_device *dev, struct netdev_bpf *bpf)
28712871
bpf_prog_put(old_prog);
28722872

28732873
/* bpf is just replaced, RXQ and MTU are already setup */
2874-
if (!need_reset)
2874+
if (!need_reset) {
28752875
return 0;
2876+
} else {
2877+
if (prog)
2878+
xdp_features_set_redirect_target(dev, true);
2879+
else
2880+
xdp_features_clear_redirect_target(dev);
2881+
}
28762882

28772883
if (running)
28782884
igb_open(dev);
@@ -3317,6 +3323,7 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
33173323
netdev->priv_flags |= IFF_SUPP_NOFCS;
33183324

33193325
netdev->priv_flags |= IFF_UNICAST_FLT;
3326+
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT;
33203327

33213328
/* MTU range: 68 - 9216 */
33223329
netdev->min_mtu = ETH_MIN_MTU;

drivers/net/ethernet/intel/igc/igc_main.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6533,6 +6533,9 @@ static int igc_probe(struct pci_dev *pdev,
65336533
netdev->mpls_features |= NETIF_F_HW_CSUM;
65346534
netdev->hw_enc_features |= netdev->vlan_features;
65356535

6536+
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
6537+
NETDEV_XDP_ACT_XSK_ZEROCOPY;
6538+
65366539
/* MTU range: 68 - 9216 */
65376540
netdev->min_mtu = ETH_MIN_MTU;
65386541
netdev->max_mtu = MAX_STD_JUMBO_FRAME_SIZE;

drivers/net/ethernet/intel/igc/igc_xdp.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ int igc_xdp_set_prog(struct igc_adapter *adapter, struct bpf_prog *prog,
2929
if (old_prog)
3030
bpf_prog_put(old_prog);
3131

32+
if (prog)
33+
xdp_features_set_redirect_target(dev, true);
34+
else
35+
xdp_features_clear_redirect_target(dev);
36+
3237
if (if_running)
3338
igc_open(dev);
3439

drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10301,6 +10301,8 @@ static int ixgbe_xdp_setup(struct net_device *dev, struct bpf_prog *prog)
1030110301

1030210302
if (err)
1030310303
return -EINVAL;
10304+
if (!prog)
10305+
xdp_features_clear_redirect_target(dev);
1030410306
} else {
1030510307
for (i = 0; i < adapter->num_rx_queues; i++) {
1030610308
WRITE_ONCE(adapter->rx_ring[i]->xdp_prog,
@@ -10321,6 +10323,7 @@ static int ixgbe_xdp_setup(struct net_device *dev, struct bpf_prog *prog)
1032110323
if (adapter->xdp_ring[i]->xsk_pool)
1032210324
(void)ixgbe_xsk_wakeup(adapter->netdev, i,
1032310325
XDP_WAKEUP_RX);
10326+
xdp_features_set_redirect_target(dev, true);
1032410327
}
1032510328

1032610329
return 0;
@@ -11018,6 +11021,9 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1101811021
netdev->priv_flags |= IFF_UNICAST_FLT;
1101911022
netdev->priv_flags |= IFF_SUPP_NOFCS;
1102011023

11024+
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
11025+
NETDEV_XDP_ACT_XSK_ZEROCOPY;
11026+
1102111027
/* MTU range: 68 - 9710 */
1102211028
netdev->min_mtu = ETH_MIN_MTU;
1102311029
netdev->max_mtu = IXGBE_MAX_JUMBO_FRAME_SIZE - (ETH_HLEN + ETH_FCS_LEN);

drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4634,6 +4634,7 @@ static int ixgbevf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
46344634
NETIF_F_HW_VLAN_CTAG_TX;
46354635

46364636
netdev->priv_flags |= IFF_UNICAST_FLT;
4637+
netdev->xdp_features = NETDEV_XDP_ACT_BASIC;
46374638

46384639
/* MTU range: 68 - 1504 or 9710 */
46394640
netdev->min_mtu = ETH_MIN_MTU;

drivers/net/ethernet/marvell/mvneta.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5612,6 +5612,9 @@ static int mvneta_probe(struct platform_device *pdev)
56125612
NETIF_F_TSO | NETIF_F_RXCSUM;
56135613
dev->hw_features |= dev->features;
56145614
dev->vlan_features |= dev->features;
5615+
dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
5616+
NETDEV_XDP_ACT_NDO_XMIT | NETDEV_XDP_ACT_RX_SG |
5617+
NETDEV_XDP_ACT_NDO_XMIT_SG;
56155618
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
56165619
netif_set_tso_max_segs(dev, MVNETA_MAX_TSO_SEGS);
56175620

drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6866,6 +6866,10 @@ static int mvpp2_port_probe(struct platform_device *pdev,
68666866

68676867
dev->vlan_features |= features;
68686868
netif_set_tso_max_segs(dev, MVPP2_MAX_TSO_SEGS);
6869+
6870+
dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
6871+
NETDEV_XDP_ACT_NDO_XMIT;
6872+
68696873
dev->priv_flags |= IFF_UNICAST_FLT;
68706874

68716875
/* MTU range: 68 - 9704 */

drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2512,10 +2512,13 @@ static int otx2_xdp_setup(struct otx2_nic *pf, struct bpf_prog *prog)
25122512
/* Network stack and XDP shared same rx queues.
25132513
* Use separate tx queues for XDP and network stack.
25142514
*/
2515-
if (pf->xdp_prog)
2515+
if (pf->xdp_prog) {
25162516
pf->hw.xdp_queues = pf->hw.rx_queues;
2517-
else
2517+
xdp_features_set_redirect_target(dev, false);
2518+
} else {
25182519
pf->hw.xdp_queues = 0;
2520+
xdp_features_clear_redirect_target(dev);
2521+
}
25192522

25202523
pf->hw.tot_tx_queues += pf->hw.xdp_queues;
25212524

@@ -2878,6 +2881,7 @@ static int otx2_probe(struct pci_dev *pdev, const struct pci_device_id *id)
28782881
netdev->watchdog_timeo = OTX2_TX_TIMEOUT;
28792882

28802883
netdev->netdev_ops = &otx2_netdev_ops;
2884+
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT;
28812885

28822886
netdev->min_mtu = OTX2_MIN_MTU;
28832887
netdev->max_mtu = otx2_get_max_mtu(pf);

drivers/net/ethernet/mediatek/mtk_eth_soc.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4447,6 +4447,12 @@ static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
44474447
register_netdevice_notifier(&mac->device_notifier);
44484448
}
44494449

4450+
if (mtk_page_pool_enabled(eth))
4451+
eth->netdev[id]->xdp_features = NETDEV_XDP_ACT_BASIC |
4452+
NETDEV_XDP_ACT_REDIRECT |
4453+
NETDEV_XDP_ACT_NDO_XMIT |
4454+
NETDEV_XDP_ACT_NDO_XMIT_SG;
4455+
44504456
return 0;
44514457

44524458
free_netdev:

drivers/net/ethernet/mellanox/mlx4/en_netdev.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3416,6 +3416,8 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
34163416
priv->rss_hash_fn = ETH_RSS_HASH_TOP;
34173417
}
34183418

3419+
dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT;
3420+
34193421
/* MTU range: 68 - hw-specific max */
34203422
dev->min_mtu = ETH_MIN_MTU;
34213423
dev->max_mtu = priv->max_mtu;

drivers/net/ethernet/mellanox/mlx5/core/en_main.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4780,6 +4780,13 @@ static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog)
47804780
if (old_prog)
47814781
bpf_prog_put(old_prog);
47824782

4783+
if (reset) {
4784+
if (prog)
4785+
xdp_features_set_redirect_target(netdev, true);
4786+
else
4787+
xdp_features_clear_redirect_target(netdev);
4788+
}
4789+
47834790
if (!test_bit(MLX5E_STATE_OPENED, &priv->state) || reset)
47844791
goto unlock;
47854792

@@ -5175,6 +5182,10 @@ static void mlx5e_build_nic_netdev(struct net_device *netdev)
51755182
netdev->features |= NETIF_F_HIGHDMA;
51765183
netdev->features |= NETIF_F_HW_VLAN_STAG_FILTER;
51775184

5185+
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
5186+
NETDEV_XDP_ACT_XSK_ZEROCOPY |
5187+
NETDEV_XDP_ACT_RX_SG;
5188+
51785189
netdev->priv_flags |= IFF_UNICAST_FLT;
51795190

51805191
netif_set_tso_max_size(netdev, GSO_MAX_SIZE);

drivers/net/ethernet/microsoft/mana/mana_en.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2160,6 +2160,8 @@ static int mana_probe_port(struct mana_context *ac, int port_idx,
21602160
ndev->hw_features |= NETIF_F_RXHASH;
21612161
ndev->features = ndev->hw_features;
21622162
ndev->vlan_features = 0;
2163+
ndev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
2164+
NETDEV_XDP_ACT_NDO_XMIT;
21632165

21642166
err = register_netdev(ndev);
21652167
if (err) {

drivers/net/ethernet/netronome/nfp/nfp_net_common.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2529,10 +2529,15 @@ static void nfp_net_netdev_init(struct nfp_net *nn)
25292529
netdev->features &= ~NETIF_F_HW_VLAN_STAG_RX;
25302530
nn->dp.ctrl &= ~NFP_NET_CFG_CTRL_RXQINQ;
25312531

2532+
netdev->xdp_features = NETDEV_XDP_ACT_BASIC;
2533+
if (nn->app && nn->app->type->id == NFP_APP_BPF_NIC)
2534+
netdev->xdp_features |= NETDEV_XDP_ACT_HW_OFFLOAD;
2535+
25322536
/* Finalise the netdev setup */
25332537
switch (nn->dp.ops->version) {
25342538
case NFP_NFD_VER_NFD3:
25352539
netdev->netdev_ops = &nfp_nfd3_netdev_ops;
2540+
netdev->xdp_features |= NETDEV_XDP_ACT_XSK_ZEROCOPY;
25362541
break;
25372542
case NFP_NFD_VER_NFDK:
25382543
netdev->netdev_ops = &nfp_nfdk_netdev_ops;

0 commit comments

Comments
 (0)