mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 13:51:44 +00:00
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 <gerhard@engleder-embedded.com> Reviewed-by: Simon Horman <simon.horman@corigine.com> Acked-by: Stanislav Fomichev <sdf@google.com> Acked-by: Jakub Kicinski <kuba@kernel.org> Co-developed-by: Kumar Kartikeya Dwivedi <memxor@gmail.com> Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com> Co-developed-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Marek Majtyka <alardam@gmail.com> Link: https://lore.kernel.org/r/3eca9fafb308462f7edb1f58e451d59209aa07eb.1675245258.git.lorenzo@kernel.org Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
d3d854fd6a
commit
66c0e13ad2
@ -597,7 +597,9 @@ static int ena_xdp_set(struct net_device *netdev, struct netdev_bpf *bpf)
|
|||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
xdp_features_set_redirect_target(netdev, false);
|
||||||
} else if (old_bpf_prog) {
|
} else if (old_bpf_prog) {
|
||||||
|
xdp_features_clear_redirect_target(netdev);
|
||||||
rc = ena_destroy_and_free_all_xdp_queues(adapter);
|
rc = ena_destroy_and_free_all_xdp_queues(adapter);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
@ -4103,6 +4105,8 @@ static void ena_set_conf_feat_params(struct ena_adapter *adapter,
|
|||||||
/* Set offload features */
|
/* Set offload features */
|
||||||
ena_set_dev_offloads(feat, netdev);
|
ena_set_dev_offloads(feat, netdev);
|
||||||
|
|
||||||
|
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT;
|
||||||
|
|
||||||
adapter->max_mtu = feat->dev_attr.max_mtu;
|
adapter->max_mtu = feat->dev_attr.max_mtu;
|
||||||
netdev->max_mtu = adapter->max_mtu;
|
netdev->max_mtu = adapter->max_mtu;
|
||||||
netdev->min_mtu = ENA_MIN_MTU;
|
netdev->min_mtu = ENA_MIN_MTU;
|
||||||
|
@ -384,6 +384,11 @@ void aq_nic_ndev_init(struct aq_nic_s *self)
|
|||||||
self->ndev->mtu = aq_nic_cfg->mtu - ETH_HLEN;
|
self->ndev->mtu = aq_nic_cfg->mtu - ETH_HLEN;
|
||||||
self->ndev->max_mtu = aq_hw_caps->mtu - ETH_FCS_LEN - ETH_HLEN;
|
self->ndev->max_mtu = aq_hw_caps->mtu - ETH_FCS_LEN - ETH_HLEN;
|
||||||
|
|
||||||
|
self->ndev->xdp_features = NETDEV_XDP_ACT_BASIC |
|
||||||
|
NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT |
|
||||||
|
NETDEV_XDP_ACT_RX_SG |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT_SG;
|
||||||
}
|
}
|
||||||
|
|
||||||
void aq_nic_set_tx_ring(struct aq_nic_s *self, unsigned int idx,
|
void aq_nic_set_tx_ring(struct aq_nic_s *self, unsigned int idx,
|
||||||
|
@ -13686,6 +13686,9 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
|
|
||||||
netif_set_tso_max_size(dev, GSO_MAX_SIZE);
|
netif_set_tso_max_size(dev, GSO_MAX_SIZE);
|
||||||
|
|
||||||
|
dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_RX_SG;
|
||||||
|
|
||||||
#ifdef CONFIG_BNXT_SRIOV
|
#ifdef CONFIG_BNXT_SRIOV
|
||||||
init_waitqueue_head(&bp->sriov_cfg_wait);
|
init_waitqueue_head(&bp->sriov_cfg_wait);
|
||||||
#endif
|
#endif
|
||||||
|
@ -422,9 +422,11 @@ static int bnxt_xdp_set(struct bnxt *bp, struct bpf_prog *prog)
|
|||||||
|
|
||||||
if (prog) {
|
if (prog) {
|
||||||
bnxt_set_rx_skb_mode(bp, true);
|
bnxt_set_rx_skb_mode(bp, true);
|
||||||
|
xdp_features_set_redirect_target(dev, true);
|
||||||
} else {
|
} else {
|
||||||
int rx, tx;
|
int rx, tx;
|
||||||
|
|
||||||
|
xdp_features_clear_redirect_target(dev);
|
||||||
bnxt_set_rx_skb_mode(bp, false);
|
bnxt_set_rx_skb_mode(bp, false);
|
||||||
bnxt_get_max_rings(bp, &rx, &tx, true);
|
bnxt_get_max_rings(bp, &rx, &tx, true);
|
||||||
if (rx > 1) {
|
if (rx > 1) {
|
||||||
|
@ -2218,6 +2218,8 @@ static int nicvf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
netdev->netdev_ops = &nicvf_netdev_ops;
|
netdev->netdev_ops = &nicvf_netdev_ops;
|
||||||
netdev->watchdog_timeo = NICVF_TX_TIMEOUT;
|
netdev->watchdog_timeo = NICVF_TX_TIMEOUT;
|
||||||
|
|
||||||
|
netdev->xdp_features = NETDEV_XDP_ACT_BASIC;
|
||||||
|
|
||||||
/* MTU range: 64 - 9200 */
|
/* MTU range: 64 - 9200 */
|
||||||
netdev->min_mtu = NIC_HW_MIN_FRS;
|
netdev->min_mtu = NIC_HW_MIN_FRS;
|
||||||
netdev->max_mtu = NIC_HW_MAX_FRS;
|
netdev->max_mtu = NIC_HW_MAX_FRS;
|
||||||
|
@ -1926,6 +1926,10 @@ static int tsnep_probe(struct platform_device *pdev)
|
|||||||
netdev->features = NETIF_F_SG;
|
netdev->features = NETIF_F_SG;
|
||||||
netdev->hw_features = netdev->features | NETIF_F_LOOPBACK;
|
netdev->hw_features = netdev->features | NETIF_F_LOOPBACK;
|
||||||
|
|
||||||
|
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT_SG;
|
||||||
|
|
||||||
/* carrier off reporting is important to ethtool even BEFORE open */
|
/* carrier off reporting is important to ethtool even BEFORE open */
|
||||||
netif_carrier_off(netdev);
|
netif_carrier_off(netdev);
|
||||||
|
|
||||||
|
@ -244,6 +244,10 @@ static int dpaa_netdev_init(struct net_device *net_dev,
|
|||||||
net_dev->features |= net_dev->hw_features;
|
net_dev->features |= net_dev->hw_features;
|
||||||
net_dev->vlan_features = net_dev->features;
|
net_dev->vlan_features = net_dev->features;
|
||||||
|
|
||||||
|
net_dev->xdp_features = NETDEV_XDP_ACT_BASIC |
|
||||||
|
NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT;
|
||||||
|
|
||||||
if (is_valid_ether_addr(mac_addr)) {
|
if (is_valid_ether_addr(mac_addr)) {
|
||||||
memcpy(net_dev->perm_addr, mac_addr, net_dev->addr_len);
|
memcpy(net_dev->perm_addr, mac_addr, net_dev->addr_len);
|
||||||
eth_hw_addr_set(net_dev, mac_addr);
|
eth_hw_addr_set(net_dev, mac_addr);
|
||||||
|
@ -4596,6 +4596,10 @@ static int dpaa2_eth_netdev_init(struct net_device *net_dev)
|
|||||||
NETIF_F_LLTX | NETIF_F_HW_TC | NETIF_F_TSO;
|
NETIF_F_LLTX | NETIF_F_HW_TC | NETIF_F_TSO;
|
||||||
net_dev->gso_max_segs = DPAA2_ETH_ENQUEUE_MAX_FDS;
|
net_dev->gso_max_segs = DPAA2_ETH_ENQUEUE_MAX_FDS;
|
||||||
net_dev->hw_features = net_dev->features;
|
net_dev->hw_features = net_dev->features;
|
||||||
|
net_dev->xdp_features = NETDEV_XDP_ACT_BASIC |
|
||||||
|
NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_XSK_ZEROCOPY |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT;
|
||||||
|
|
||||||
if (priv->dpni_attrs.vlan_filter_entries)
|
if (priv->dpni_attrs.vlan_filter_entries)
|
||||||
net_dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
|
net_dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
|
||||||
|
@ -807,6 +807,9 @@ static void enetc_pf_netdev_setup(struct enetc_si *si, struct net_device *ndev,
|
|||||||
ndev->hw_features |= NETIF_F_RXHASH;
|
ndev->hw_features |= NETIF_F_RXHASH;
|
||||||
|
|
||||||
ndev->priv_flags |= IFF_UNICAST_FLT;
|
ndev->priv_flags |= IFF_UNICAST_FLT;
|
||||||
|
ndev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT | NETDEV_XDP_ACT_RX_SG |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT_SG;
|
||||||
|
|
||||||
if (si->hw_features & ENETC_SI_F_PSFP && !enetc_psfp_enable(priv)) {
|
if (si->hw_features & ENETC_SI_F_PSFP && !enetc_psfp_enable(priv)) {
|
||||||
priv->active_offloads |= ENETC_F_QCI;
|
priv->active_offloads |= ENETC_F_QCI;
|
||||||
|
@ -1160,6 +1160,11 @@ static int fun_xdp_setup(struct net_device *dev, struct netdev_bpf *xdp)
|
|||||||
WRITE_ONCE(rxqs[i]->xdp_prog, prog);
|
WRITE_ONCE(rxqs[i]->xdp_prog, prog);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (prog)
|
||||||
|
xdp_features_set_redirect_target(dev, true);
|
||||||
|
else
|
||||||
|
xdp_features_clear_redirect_target(dev);
|
||||||
|
|
||||||
dev->max_mtu = prog ? XDP_MAX_MTU : FUN_MAX_MTU;
|
dev->max_mtu = prog ? XDP_MAX_MTU : FUN_MAX_MTU;
|
||||||
old_prog = xchg(&fp->xdp_prog, prog);
|
old_prog = xchg(&fp->xdp_prog, prog);
|
||||||
if (old_prog)
|
if (old_prog)
|
||||||
@ -1765,6 +1770,7 @@ static int fun_create_netdev(struct fun_ethdev *ed, unsigned int portid)
|
|||||||
netdev->vlan_features = netdev->features & VLAN_FEAT;
|
netdev->vlan_features = netdev->features & VLAN_FEAT;
|
||||||
netdev->mpls_features = netdev->vlan_features;
|
netdev->mpls_features = netdev->vlan_features;
|
||||||
netdev->hw_enc_features = netdev->hw_features;
|
netdev->hw_enc_features = netdev->hw_features;
|
||||||
|
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT;
|
||||||
|
|
||||||
netdev->min_mtu = ETH_MIN_MTU;
|
netdev->min_mtu = ETH_MIN_MTU;
|
||||||
netdev->max_mtu = FUN_MAX_MTU;
|
netdev->max_mtu = FUN_MAX_MTU;
|
||||||
|
@ -13339,9 +13339,11 @@ static int i40e_xdp_setup(struct i40e_vsi *vsi, struct bpf_prog *prog,
|
|||||||
old_prog = xchg(&vsi->xdp_prog, prog);
|
old_prog = xchg(&vsi->xdp_prog, prog);
|
||||||
|
|
||||||
if (need_reset) {
|
if (need_reset) {
|
||||||
if (!prog)
|
if (!prog) {
|
||||||
|
xdp_features_clear_redirect_target(vsi->netdev);
|
||||||
/* Wait until ndo_xsk_wakeup completes. */
|
/* Wait until ndo_xsk_wakeup completes. */
|
||||||
synchronize_rcu();
|
synchronize_rcu();
|
||||||
|
}
|
||||||
i40e_reset_and_rebuild(pf, true, true);
|
i40e_reset_and_rebuild(pf, true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -13362,11 +13364,13 @@ static int i40e_xdp_setup(struct i40e_vsi *vsi, struct bpf_prog *prog,
|
|||||||
/* Kick start the NAPI context if there is an AF_XDP socket open
|
/* Kick start the NAPI context if there is an AF_XDP socket open
|
||||||
* on that queue id. This so that receiving will start.
|
* on that queue id. This so that receiving will start.
|
||||||
*/
|
*/
|
||||||
if (need_reset && prog)
|
if (need_reset && prog) {
|
||||||
for (i = 0; i < vsi->num_queue_pairs; i++)
|
for (i = 0; i < vsi->num_queue_pairs; i++)
|
||||||
if (vsi->xdp_rings[i]->xsk_pool)
|
if (vsi->xdp_rings[i]->xsk_pool)
|
||||||
(void)i40e_xsk_wakeup(vsi->netdev, i,
|
(void)i40e_xsk_wakeup(vsi->netdev, i,
|
||||||
XDP_WAKEUP_RX);
|
XDP_WAKEUP_RX);
|
||||||
|
xdp_features_set_redirect_target(vsi->netdev, true);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -13783,6 +13787,8 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
|
|||||||
netdev->hw_enc_features |= NETIF_F_TSO_MANGLEID;
|
netdev->hw_enc_features |= NETIF_F_TSO_MANGLEID;
|
||||||
|
|
||||||
netdev->features &= ~NETIF_F_HW_TC;
|
netdev->features &= ~NETIF_F_HW_TC;
|
||||||
|
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_XSK_ZEROCOPY;
|
||||||
|
|
||||||
if (vsi->type == I40E_VSI_MAIN) {
|
if (vsi->type == I40E_VSI_MAIN) {
|
||||||
SET_NETDEV_DEV(netdev, &pf->pdev->dev);
|
SET_NETDEV_DEV(netdev, &pf->pdev->dev);
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "ice_eswitch.h"
|
#include "ice_eswitch.h"
|
||||||
#include "ice_tc_lib.h"
|
#include "ice_tc_lib.h"
|
||||||
#include "ice_vsi_vlan_ops.h"
|
#include "ice_vsi_vlan_ops.h"
|
||||||
|
#include <net/xdp_sock_drv.h>
|
||||||
|
|
||||||
#define DRV_SUMMARY "Intel(R) Ethernet Connection E800 Series Linux Driver"
|
#define DRV_SUMMARY "Intel(R) Ethernet Connection E800 Series Linux Driver"
|
||||||
static const char ice_driver_string[] = DRV_SUMMARY;
|
static const char ice_driver_string[] = DRV_SUMMARY;
|
||||||
@ -2912,11 +2913,13 @@ ice_xdp_setup_prog(struct ice_vsi *vsi, struct bpf_prog *prog,
|
|||||||
if (xdp_ring_err)
|
if (xdp_ring_err)
|
||||||
NL_SET_ERR_MSG_MOD(extack, "Setting up XDP Tx resources failed");
|
NL_SET_ERR_MSG_MOD(extack, "Setting up XDP Tx resources failed");
|
||||||
}
|
}
|
||||||
|
xdp_features_set_redirect_target(vsi->netdev, false);
|
||||||
/* reallocate Rx queues that are used for zero-copy */
|
/* reallocate Rx queues that are used for zero-copy */
|
||||||
xdp_ring_err = ice_realloc_zc_buf(vsi, true);
|
xdp_ring_err = ice_realloc_zc_buf(vsi, true);
|
||||||
if (xdp_ring_err)
|
if (xdp_ring_err)
|
||||||
NL_SET_ERR_MSG_MOD(extack, "Setting up XDP Rx resources failed");
|
NL_SET_ERR_MSG_MOD(extack, "Setting up XDP Rx resources failed");
|
||||||
} else if (ice_is_xdp_ena_vsi(vsi) && !prog) {
|
} else if (ice_is_xdp_ena_vsi(vsi) && !prog) {
|
||||||
|
xdp_features_clear_redirect_target(vsi->netdev);
|
||||||
xdp_ring_err = ice_destroy_xdp_rings(vsi);
|
xdp_ring_err = ice_destroy_xdp_rings(vsi);
|
||||||
if (xdp_ring_err)
|
if (xdp_ring_err)
|
||||||
NL_SET_ERR_MSG_MOD(extack, "Freeing XDP Tx resources failed");
|
NL_SET_ERR_MSG_MOD(extack, "Freeing XDP Tx resources failed");
|
||||||
@ -3459,6 +3462,8 @@ static int ice_cfg_netdev(struct ice_vsi *vsi)
|
|||||||
np->vsi = vsi;
|
np->vsi = vsi;
|
||||||
|
|
||||||
ice_set_netdev_features(netdev);
|
ice_set_netdev_features(netdev);
|
||||||
|
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_XSK_ZEROCOPY;
|
||||||
|
|
||||||
ice_set_ops(netdev);
|
ice_set_ops(netdev);
|
||||||
|
|
||||||
|
@ -2871,8 +2871,14 @@ static int igb_xdp_setup(struct net_device *dev, struct netdev_bpf *bpf)
|
|||||||
bpf_prog_put(old_prog);
|
bpf_prog_put(old_prog);
|
||||||
|
|
||||||
/* bpf is just replaced, RXQ and MTU are already setup */
|
/* bpf is just replaced, RXQ and MTU are already setup */
|
||||||
if (!need_reset)
|
if (!need_reset) {
|
||||||
return 0;
|
return 0;
|
||||||
|
} else {
|
||||||
|
if (prog)
|
||||||
|
xdp_features_set_redirect_target(dev, true);
|
||||||
|
else
|
||||||
|
xdp_features_clear_redirect_target(dev);
|
||||||
|
}
|
||||||
|
|
||||||
if (running)
|
if (running)
|
||||||
igb_open(dev);
|
igb_open(dev);
|
||||||
@ -3317,6 +3323,7 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
netdev->priv_flags |= IFF_SUPP_NOFCS;
|
netdev->priv_flags |= IFF_SUPP_NOFCS;
|
||||||
|
|
||||||
netdev->priv_flags |= IFF_UNICAST_FLT;
|
netdev->priv_flags |= IFF_UNICAST_FLT;
|
||||||
|
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT;
|
||||||
|
|
||||||
/* MTU range: 68 - 9216 */
|
/* MTU range: 68 - 9216 */
|
||||||
netdev->min_mtu = ETH_MIN_MTU;
|
netdev->min_mtu = ETH_MIN_MTU;
|
||||||
|
@ -6533,6 +6533,9 @@ static int igc_probe(struct pci_dev *pdev,
|
|||||||
netdev->mpls_features |= NETIF_F_HW_CSUM;
|
netdev->mpls_features |= NETIF_F_HW_CSUM;
|
||||||
netdev->hw_enc_features |= netdev->vlan_features;
|
netdev->hw_enc_features |= netdev->vlan_features;
|
||||||
|
|
||||||
|
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_XSK_ZEROCOPY;
|
||||||
|
|
||||||
/* MTU range: 68 - 9216 */
|
/* MTU range: 68 - 9216 */
|
||||||
netdev->min_mtu = ETH_MIN_MTU;
|
netdev->min_mtu = ETH_MIN_MTU;
|
||||||
netdev->max_mtu = MAX_STD_JUMBO_FRAME_SIZE;
|
netdev->max_mtu = MAX_STD_JUMBO_FRAME_SIZE;
|
||||||
|
@ -29,6 +29,11 @@ int igc_xdp_set_prog(struct igc_adapter *adapter, struct bpf_prog *prog,
|
|||||||
if (old_prog)
|
if (old_prog)
|
||||||
bpf_prog_put(old_prog);
|
bpf_prog_put(old_prog);
|
||||||
|
|
||||||
|
if (prog)
|
||||||
|
xdp_features_set_redirect_target(dev, true);
|
||||||
|
else
|
||||||
|
xdp_features_clear_redirect_target(dev);
|
||||||
|
|
||||||
if (if_running)
|
if (if_running)
|
||||||
igc_open(dev);
|
igc_open(dev);
|
||||||
|
|
||||||
|
@ -10301,6 +10301,8 @@ static int ixgbe_xdp_setup(struct net_device *dev, struct bpf_prog *prog)
|
|||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
if (!prog)
|
||||||
|
xdp_features_clear_redirect_target(dev);
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < adapter->num_rx_queues; i++) {
|
for (i = 0; i < adapter->num_rx_queues; i++) {
|
||||||
WRITE_ONCE(adapter->rx_ring[i]->xdp_prog,
|
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)
|
|||||||
if (adapter->xdp_ring[i]->xsk_pool)
|
if (adapter->xdp_ring[i]->xsk_pool)
|
||||||
(void)ixgbe_xsk_wakeup(adapter->netdev, i,
|
(void)ixgbe_xsk_wakeup(adapter->netdev, i,
|
||||||
XDP_WAKEUP_RX);
|
XDP_WAKEUP_RX);
|
||||||
|
xdp_features_set_redirect_target(dev, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -11018,6 +11021,9 @@ skip_sriov:
|
|||||||
netdev->priv_flags |= IFF_UNICAST_FLT;
|
netdev->priv_flags |= IFF_UNICAST_FLT;
|
||||||
netdev->priv_flags |= IFF_SUPP_NOFCS;
|
netdev->priv_flags |= IFF_SUPP_NOFCS;
|
||||||
|
|
||||||
|
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_XSK_ZEROCOPY;
|
||||||
|
|
||||||
/* MTU range: 68 - 9710 */
|
/* MTU range: 68 - 9710 */
|
||||||
netdev->min_mtu = ETH_MIN_MTU;
|
netdev->min_mtu = ETH_MIN_MTU;
|
||||||
netdev->max_mtu = IXGBE_MAX_JUMBO_FRAME_SIZE - (ETH_HLEN + ETH_FCS_LEN);
|
netdev->max_mtu = IXGBE_MAX_JUMBO_FRAME_SIZE - (ETH_HLEN + ETH_FCS_LEN);
|
||||||
|
@ -4634,6 +4634,7 @@ static int ixgbevf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
NETIF_F_HW_VLAN_CTAG_TX;
|
NETIF_F_HW_VLAN_CTAG_TX;
|
||||||
|
|
||||||
netdev->priv_flags |= IFF_UNICAST_FLT;
|
netdev->priv_flags |= IFF_UNICAST_FLT;
|
||||||
|
netdev->xdp_features = NETDEV_XDP_ACT_BASIC;
|
||||||
|
|
||||||
/* MTU range: 68 - 1504 or 9710 */
|
/* MTU range: 68 - 1504 or 9710 */
|
||||||
netdev->min_mtu = ETH_MIN_MTU;
|
netdev->min_mtu = ETH_MIN_MTU;
|
||||||
|
@ -5612,6 +5612,9 @@ static int mvneta_probe(struct platform_device *pdev)
|
|||||||
NETIF_F_TSO | NETIF_F_RXCSUM;
|
NETIF_F_TSO | NETIF_F_RXCSUM;
|
||||||
dev->hw_features |= dev->features;
|
dev->hw_features |= dev->features;
|
||||||
dev->vlan_features |= dev->features;
|
dev->vlan_features |= dev->features;
|
||||||
|
dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT | NETDEV_XDP_ACT_RX_SG |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT_SG;
|
||||||
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
|
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
|
||||||
netif_set_tso_max_segs(dev, MVNETA_MAX_TSO_SEGS);
|
netif_set_tso_max_segs(dev, MVNETA_MAX_TSO_SEGS);
|
||||||
|
|
||||||
|
@ -6866,6 +6866,10 @@ static int mvpp2_port_probe(struct platform_device *pdev,
|
|||||||
|
|
||||||
dev->vlan_features |= features;
|
dev->vlan_features |= features;
|
||||||
netif_set_tso_max_segs(dev, MVPP2_MAX_TSO_SEGS);
|
netif_set_tso_max_segs(dev, MVPP2_MAX_TSO_SEGS);
|
||||||
|
|
||||||
|
dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT;
|
||||||
|
|
||||||
dev->priv_flags |= IFF_UNICAST_FLT;
|
dev->priv_flags |= IFF_UNICAST_FLT;
|
||||||
|
|
||||||
/* MTU range: 68 - 9704 */
|
/* MTU range: 68 - 9704 */
|
||||||
|
@ -2512,10 +2512,13 @@ static int otx2_xdp_setup(struct otx2_nic *pf, struct bpf_prog *prog)
|
|||||||
/* Network stack and XDP shared same rx queues.
|
/* Network stack and XDP shared same rx queues.
|
||||||
* Use separate tx queues for XDP and network stack.
|
* Use separate tx queues for XDP and network stack.
|
||||||
*/
|
*/
|
||||||
if (pf->xdp_prog)
|
if (pf->xdp_prog) {
|
||||||
pf->hw.xdp_queues = pf->hw.rx_queues;
|
pf->hw.xdp_queues = pf->hw.rx_queues;
|
||||||
else
|
xdp_features_set_redirect_target(dev, false);
|
||||||
|
} else {
|
||||||
pf->hw.xdp_queues = 0;
|
pf->hw.xdp_queues = 0;
|
||||||
|
xdp_features_clear_redirect_target(dev);
|
||||||
|
}
|
||||||
|
|
||||||
pf->hw.tot_tx_queues += pf->hw.xdp_queues;
|
pf->hw.tot_tx_queues += pf->hw.xdp_queues;
|
||||||
|
|
||||||
@ -2878,6 +2881,7 @@ static int otx2_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||||||
netdev->watchdog_timeo = OTX2_TX_TIMEOUT;
|
netdev->watchdog_timeo = OTX2_TX_TIMEOUT;
|
||||||
|
|
||||||
netdev->netdev_ops = &otx2_netdev_ops;
|
netdev->netdev_ops = &otx2_netdev_ops;
|
||||||
|
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT;
|
||||||
|
|
||||||
netdev->min_mtu = OTX2_MIN_MTU;
|
netdev->min_mtu = OTX2_MIN_MTU;
|
||||||
netdev->max_mtu = otx2_get_max_mtu(pf);
|
netdev->max_mtu = otx2_get_max_mtu(pf);
|
||||||
|
@ -4447,6 +4447,12 @@ static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
|
|||||||
register_netdevice_notifier(&mac->device_notifier);
|
register_netdevice_notifier(&mac->device_notifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mtk_page_pool_enabled(eth))
|
||||||
|
eth->netdev[id]->xdp_features = NETDEV_XDP_ACT_BASIC |
|
||||||
|
NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT_SG;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
free_netdev:
|
free_netdev:
|
||||||
|
@ -3416,6 +3416,8 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
|
|||||||
priv->rss_hash_fn = ETH_RSS_HASH_TOP;
|
priv->rss_hash_fn = ETH_RSS_HASH_TOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT;
|
||||||
|
|
||||||
/* MTU range: 68 - hw-specific max */
|
/* MTU range: 68 - hw-specific max */
|
||||||
dev->min_mtu = ETH_MIN_MTU;
|
dev->min_mtu = ETH_MIN_MTU;
|
||||||
dev->max_mtu = priv->max_mtu;
|
dev->max_mtu = priv->max_mtu;
|
||||||
|
@ -4780,6 +4780,13 @@ static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog)
|
|||||||
if (old_prog)
|
if (old_prog)
|
||||||
bpf_prog_put(old_prog);
|
bpf_prog_put(old_prog);
|
||||||
|
|
||||||
|
if (reset) {
|
||||||
|
if (prog)
|
||||||
|
xdp_features_set_redirect_target(netdev, true);
|
||||||
|
else
|
||||||
|
xdp_features_clear_redirect_target(netdev);
|
||||||
|
}
|
||||||
|
|
||||||
if (!test_bit(MLX5E_STATE_OPENED, &priv->state) || reset)
|
if (!test_bit(MLX5E_STATE_OPENED, &priv->state) || reset)
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
@ -5175,6 +5182,10 @@ static void mlx5e_build_nic_netdev(struct net_device *netdev)
|
|||||||
netdev->features |= NETIF_F_HIGHDMA;
|
netdev->features |= NETIF_F_HIGHDMA;
|
||||||
netdev->features |= NETIF_F_HW_VLAN_STAG_FILTER;
|
netdev->features |= NETIF_F_HW_VLAN_STAG_FILTER;
|
||||||
|
|
||||||
|
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_XSK_ZEROCOPY |
|
||||||
|
NETDEV_XDP_ACT_RX_SG;
|
||||||
|
|
||||||
netdev->priv_flags |= IFF_UNICAST_FLT;
|
netdev->priv_flags |= IFF_UNICAST_FLT;
|
||||||
|
|
||||||
netif_set_tso_max_size(netdev, GSO_MAX_SIZE);
|
netif_set_tso_max_size(netdev, GSO_MAX_SIZE);
|
||||||
|
@ -2160,6 +2160,8 @@ static int mana_probe_port(struct mana_context *ac, int port_idx,
|
|||||||
ndev->hw_features |= NETIF_F_RXHASH;
|
ndev->hw_features |= NETIF_F_RXHASH;
|
||||||
ndev->features = ndev->hw_features;
|
ndev->features = ndev->hw_features;
|
||||||
ndev->vlan_features = 0;
|
ndev->vlan_features = 0;
|
||||||
|
ndev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT;
|
||||||
|
|
||||||
err = register_netdev(ndev);
|
err = register_netdev(ndev);
|
||||||
if (err) {
|
if (err) {
|
||||||
|
@ -2529,10 +2529,15 @@ static void nfp_net_netdev_init(struct nfp_net *nn)
|
|||||||
netdev->features &= ~NETIF_F_HW_VLAN_STAG_RX;
|
netdev->features &= ~NETIF_F_HW_VLAN_STAG_RX;
|
||||||
nn->dp.ctrl &= ~NFP_NET_CFG_CTRL_RXQINQ;
|
nn->dp.ctrl &= ~NFP_NET_CFG_CTRL_RXQINQ;
|
||||||
|
|
||||||
|
netdev->xdp_features = NETDEV_XDP_ACT_BASIC;
|
||||||
|
if (nn->app && nn->app->type->id == NFP_APP_BPF_NIC)
|
||||||
|
netdev->xdp_features |= NETDEV_XDP_ACT_HW_OFFLOAD;
|
||||||
|
|
||||||
/* Finalise the netdev setup */
|
/* Finalise the netdev setup */
|
||||||
switch (nn->dp.ops->version) {
|
switch (nn->dp.ops->version) {
|
||||||
case NFP_NFD_VER_NFD3:
|
case NFP_NFD_VER_NFD3:
|
||||||
netdev->netdev_ops = &nfp_nfd3_netdev_ops;
|
netdev->netdev_ops = &nfp_nfd3_netdev_ops;
|
||||||
|
netdev->xdp_features |= NETDEV_XDP_ACT_XSK_ZEROCOPY;
|
||||||
break;
|
break;
|
||||||
case NFP_NFD_VER_NFDK:
|
case NFP_NFD_VER_NFDK:
|
||||||
netdev->netdev_ops = &nfp_nfdk_netdev_ops;
|
netdev->netdev_ops = &nfp_nfdk_netdev_ops;
|
||||||
|
@ -892,6 +892,9 @@ static void qede_init_ndev(struct qede_dev *edev)
|
|||||||
|
|
||||||
ndev->hw_features = hw_features;
|
ndev->hw_features = hw_features;
|
||||||
|
|
||||||
|
ndev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT;
|
||||||
|
|
||||||
/* MTU range: 46 - 9600 */
|
/* MTU range: 46 - 9600 */
|
||||||
ndev->min_mtu = ETH_ZLEN - ETH_HLEN;
|
ndev->min_mtu = ETH_ZLEN - ETH_HLEN;
|
||||||
ndev->max_mtu = QEDE_MAX_JUMBO_PACKET_SIZE;
|
ndev->max_mtu = QEDE_MAX_JUMBO_PACKET_SIZE;
|
||||||
|
@ -1078,6 +1078,10 @@ static int efx_pci_probe(struct pci_dev *pci_dev,
|
|||||||
|
|
||||||
pci_info(pci_dev, "Solarflare NIC detected\n");
|
pci_info(pci_dev, "Solarflare NIC detected\n");
|
||||||
|
|
||||||
|
efx->net_dev->xdp_features = NETDEV_XDP_ACT_BASIC |
|
||||||
|
NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT;
|
||||||
|
|
||||||
if (!efx->type->is_vf)
|
if (!efx->type->is_vf)
|
||||||
efx_probe_vpd_strings(efx);
|
efx_probe_vpd_strings(efx);
|
||||||
|
|
||||||
|
@ -1048,6 +1048,10 @@ static int efx_pci_probe(struct pci_dev *pci_dev,
|
|||||||
|
|
||||||
pci_info(pci_dev, "Solarflare NIC detected\n");
|
pci_info(pci_dev, "Solarflare NIC detected\n");
|
||||||
|
|
||||||
|
efx->net_dev->xdp_features = NETDEV_XDP_ACT_BASIC |
|
||||||
|
NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT;
|
||||||
|
|
||||||
if (!efx->type->is_vf)
|
if (!efx->type->is_vf)
|
||||||
efx_probe_vpd_strings(efx);
|
efx_probe_vpd_strings(efx);
|
||||||
|
|
||||||
|
@ -2104,6 +2104,9 @@ static int netsec_probe(struct platform_device *pdev)
|
|||||||
NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
|
NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
|
||||||
ndev->hw_features = ndev->features;
|
ndev->hw_features = ndev->features;
|
||||||
|
|
||||||
|
ndev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT;
|
||||||
|
|
||||||
priv->rx_cksum_offload_flag = true;
|
priv->rx_cksum_offload_flag = true;
|
||||||
|
|
||||||
ret = netsec_register_mdio(priv, phy_addr);
|
ret = netsec_register_mdio(priv, phy_addr);
|
||||||
|
@ -7150,6 +7150,8 @@ int stmmac_dvr_probe(struct device *device,
|
|||||||
|
|
||||||
ndev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
|
ndev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
|
||||||
NETIF_F_RXCSUM;
|
NETIF_F_RXCSUM;
|
||||||
|
ndev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT;
|
||||||
|
|
||||||
ret = stmmac_tc_init(priv, priv);
|
ret = stmmac_tc_init(priv, priv);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
|
@ -1458,6 +1458,8 @@ static int cpsw_probe_dual_emac(struct cpsw_priv *priv)
|
|||||||
priv_sl2->emac_port = 1;
|
priv_sl2->emac_port = 1;
|
||||||
cpsw->slaves[1].ndev = ndev;
|
cpsw->slaves[1].ndev = ndev;
|
||||||
ndev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_VLAN_CTAG_RX;
|
ndev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_VLAN_CTAG_RX;
|
||||||
|
ndev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT;
|
||||||
|
|
||||||
ndev->netdev_ops = &cpsw_netdev_ops;
|
ndev->netdev_ops = &cpsw_netdev_ops;
|
||||||
ndev->ethtool_ops = &cpsw_ethtool_ops;
|
ndev->ethtool_ops = &cpsw_ethtool_ops;
|
||||||
@ -1635,6 +1637,8 @@ static int cpsw_probe(struct platform_device *pdev)
|
|||||||
cpsw->slaves[0].ndev = ndev;
|
cpsw->slaves[0].ndev = ndev;
|
||||||
|
|
||||||
ndev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_VLAN_CTAG_RX;
|
ndev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_VLAN_CTAG_RX;
|
||||||
|
ndev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT;
|
||||||
|
|
||||||
ndev->netdev_ops = &cpsw_netdev_ops;
|
ndev->netdev_ops = &cpsw_netdev_ops;
|
||||||
ndev->ethtool_ops = &cpsw_ethtool_ops;
|
ndev->ethtool_ops = &cpsw_ethtool_ops;
|
||||||
|
@ -1405,6 +1405,10 @@ static int cpsw_create_ports(struct cpsw_common *cpsw)
|
|||||||
ndev->features |= NETIF_F_HW_VLAN_CTAG_FILTER |
|
ndev->features |= NETIF_F_HW_VLAN_CTAG_FILTER |
|
||||||
NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_NETNS_LOCAL | NETIF_F_HW_TC;
|
NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_NETNS_LOCAL | NETIF_F_HW_TC;
|
||||||
|
|
||||||
|
ndev->xdp_features = NETDEV_XDP_ACT_BASIC |
|
||||||
|
NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT;
|
||||||
|
|
||||||
ndev->netdev_ops = &cpsw_netdev_ops;
|
ndev->netdev_ops = &cpsw_netdev_ops;
|
||||||
ndev->ethtool_ops = &cpsw_ethtool_ops;
|
ndev->ethtool_ops = &cpsw_ethtool_ops;
|
||||||
SET_NETDEV_DEV(ndev, dev);
|
SET_NETDEV_DEV(ndev, dev);
|
||||||
|
@ -2559,6 +2559,8 @@ static int netvsc_probe(struct hv_device *dev,
|
|||||||
|
|
||||||
netdev_lockdep_set_classes(net);
|
netdev_lockdep_set_classes(net);
|
||||||
|
|
||||||
|
net->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT;
|
||||||
|
|
||||||
/* MTU range: 68 - 1500 or 65521 */
|
/* MTU range: 68 - 1500 or 65521 */
|
||||||
net->min_mtu = NETVSC_MTU_MIN;
|
net->min_mtu = NETVSC_MTU_MIN;
|
||||||
if (nvdev->nvsp_version >= NVSP_PROTOCOL_VERSION_2)
|
if (nvdev->nvsp_version >= NVSP_PROTOCOL_VERSION_2)
|
||||||
|
@ -286,6 +286,7 @@ static void nsim_setup(struct net_device *dev)
|
|||||||
NETIF_F_TSO;
|
NETIF_F_TSO;
|
||||||
dev->hw_features |= NETIF_F_HW_TC;
|
dev->hw_features |= NETIF_F_HW_TC;
|
||||||
dev->max_mtu = ETH_MAX_MTU;
|
dev->max_mtu = ETH_MAX_MTU;
|
||||||
|
dev->xdp_features = NETDEV_XDP_ACT_HW_OFFLOAD;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nsim_init_netdevsim(struct netdevsim *ns)
|
static int nsim_init_netdevsim(struct netdevsim *ns)
|
||||||
|
@ -1401,6 +1401,11 @@ static void tun_net_initialize(struct net_device *dev)
|
|||||||
|
|
||||||
eth_hw_addr_random(dev);
|
eth_hw_addr_random(dev);
|
||||||
|
|
||||||
|
/* Currently tun does not support XDP, only tap does. */
|
||||||
|
dev->xdp_features = NETDEV_XDP_ACT_BASIC |
|
||||||
|
NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1686,6 +1686,10 @@ static void veth_setup(struct net_device *dev)
|
|||||||
dev->hw_enc_features = VETH_FEATURES;
|
dev->hw_enc_features = VETH_FEATURES;
|
||||||
dev->mpls_features = NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE;
|
dev->mpls_features = NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE;
|
||||||
netif_set_tso_max_size(dev, GSO_MAX_SIZE);
|
netif_set_tso_max_size(dev, GSO_MAX_SIZE);
|
||||||
|
|
||||||
|
dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT | NETDEV_XDP_ACT_RX_SG |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT_SG;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3280,7 +3280,10 @@ static int virtnet_xdp_set(struct net_device *dev, struct bpf_prog *prog,
|
|||||||
if (i == 0 && !old_prog)
|
if (i == 0 && !old_prog)
|
||||||
virtnet_clear_guest_offloads(vi);
|
virtnet_clear_guest_offloads(vi);
|
||||||
}
|
}
|
||||||
|
if (!old_prog)
|
||||||
|
xdp_features_set_redirect_target(dev, false);
|
||||||
} else {
|
} else {
|
||||||
|
xdp_features_clear_redirect_target(dev);
|
||||||
vi->xdp_enabled = false;
|
vi->xdp_enabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3910,6 +3913,7 @@ static int virtnet_probe(struct virtio_device *vdev)
|
|||||||
dev->hw_features |= NETIF_F_GRO_HW;
|
dev->hw_features |= NETIF_F_GRO_HW;
|
||||||
|
|
||||||
dev->vlan_features = dev->features;
|
dev->vlan_features = dev->features;
|
||||||
|
dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT;
|
||||||
|
|
||||||
/* MTU range: 68 - 65535 */
|
/* MTU range: 68 - 65535 */
|
||||||
dev->min_mtu = MIN_MTU;
|
dev->min_mtu = MIN_MTU;
|
||||||
|
@ -1741,6 +1741,8 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
|
|||||||
* negotiate with the backend regarding supported features.
|
* negotiate with the backend regarding supported features.
|
||||||
*/
|
*/
|
||||||
netdev->features |= netdev->hw_features;
|
netdev->features |= netdev->hw_features;
|
||||||
|
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT;
|
||||||
|
|
||||||
netdev->ethtool_ops = &xennet_ethtool_ops;
|
netdev->ethtool_ops = &xennet_ethtool_ops;
|
||||||
netdev->min_mtu = ETH_MIN_MTU;
|
netdev->min_mtu = ETH_MIN_MTU;
|
||||||
|
@ -428,9 +428,21 @@ MAX_XDP_METADATA_KFUNC,
|
|||||||
#ifdef CONFIG_NET
|
#ifdef CONFIG_NET
|
||||||
u32 bpf_xdp_metadata_kfunc_id(int id);
|
u32 bpf_xdp_metadata_kfunc_id(int id);
|
||||||
bool bpf_dev_bound_kfunc_id(u32 btf_id);
|
bool bpf_dev_bound_kfunc_id(u32 btf_id);
|
||||||
|
void xdp_features_set_redirect_target(struct net_device *dev, bool support_sg);
|
||||||
|
void xdp_features_clear_redirect_target(struct net_device *dev);
|
||||||
#else
|
#else
|
||||||
static inline u32 bpf_xdp_metadata_kfunc_id(int id) { return 0; }
|
static inline u32 bpf_xdp_metadata_kfunc_id(int id) { return 0; }
|
||||||
static inline bool bpf_dev_bound_kfunc_id(u32 btf_id) { return false; }
|
static inline bool bpf_dev_bound_kfunc_id(u32 btf_id) { return false; }
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
xdp_features_set_redirect_target(struct net_device *dev, bool support_sg)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
xdp_features_clear_redirect_target(struct net_device *dev)
|
||||||
|
{
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __LINUX_NET_XDP_H__ */
|
#endif /* __LINUX_NET_XDP_H__ */
|
||||||
|
@ -774,3 +774,21 @@ static int __init xdp_metadata_init(void)
|
|||||||
return register_btf_kfunc_id_set(BPF_PROG_TYPE_XDP, &xdp_metadata_kfunc_set);
|
return register_btf_kfunc_id_set(BPF_PROG_TYPE_XDP, &xdp_metadata_kfunc_set);
|
||||||
}
|
}
|
||||||
late_initcall(xdp_metadata_init);
|
late_initcall(xdp_metadata_init);
|
||||||
|
|
||||||
|
void xdp_features_set_redirect_target(struct net_device *dev, bool support_sg)
|
||||||
|
{
|
||||||
|
dev->xdp_features |= NETDEV_XDP_ACT_NDO_XMIT;
|
||||||
|
if (support_sg)
|
||||||
|
dev->xdp_features |= NETDEV_XDP_ACT_NDO_XMIT_SG;
|
||||||
|
|
||||||
|
call_netdevice_notifiers(NETDEV_XDP_FEAT_CHANGE, dev);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(xdp_features_set_redirect_target);
|
||||||
|
|
||||||
|
void xdp_features_clear_redirect_target(struct net_device *dev)
|
||||||
|
{
|
||||||
|
dev->xdp_features &= ~(NETDEV_XDP_ACT_NDO_XMIT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT_SG);
|
||||||
|
call_netdevice_notifiers(NETDEV_XDP_FEAT_CHANGE, dev);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(xdp_features_clear_redirect_target);
|
||||||
|
Loading…
Reference in New Issue
Block a user