1

netdev_features: convert NETIF_F_LLTX to dev->lltx

NETIF_F_LLTX can't be changed via Ethtool and is not a feature,
rather an attribute, very similar to IFF_NO_QUEUE (and hot).
Free one netdev_features_t bit and make it a "hot" private flag.

Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Alexander Lobakin 2024-08-29 14:33:37 +02:00 committed by Paolo Abeni
parent beb5a9bea8
commit 00d066a4d4
57 changed files with 93 additions and 84 deletions

View File

@ -8,6 +8,7 @@ net_device struct fast path usage breakdown
Type Name fastpath_tx_access fastpath_rx_access Comments Type Name fastpath_tx_access fastpath_rx_access Comments
..struct ..net_device ..struct ..net_device
unsigned_long:32 priv_flags read_mostly - __dev_queue_xmit(tx) unsigned_long:32 priv_flags read_mostly - __dev_queue_xmit(tx)
unsigned_long:1 lltx read_mostly - HARD_TX_LOCK,HARD_TX_TRYLOCK,HARD_TX_UNLOCK(tx)
char name[16] - - char name[16] - -
struct_netdev_name_node* name_node struct_netdev_name_node* name_node
struct_dev_ifalias* ifalias struct_dev_ifalias* ifalias

View File

@ -139,14 +139,6 @@ chained skbs (skb->next/prev list).
Features contained in NETIF_F_SOFT_FEATURES are features of networking Features contained in NETIF_F_SOFT_FEATURES are features of networking
stack. Driver should not change behaviour based on them. stack. Driver should not change behaviour based on them.
* LLTX driver (deprecated for hardware drivers)
NETIF_F_LLTX is meant to be used by drivers that don't need locking at all,
e.g. software tunnels.
This is also used in a few legacy drivers that implement their
own locking, don't use it for new (hardware) drivers.
* netns-local device * netns-local device
NETIF_F_NETNS_LOCAL is set for devices that are not allowed to move between NETIF_F_NETNS_LOCAL is set for devices that are not allowed to move between

View File

@ -258,11 +258,11 @@ ndo_get_stats:
ndo_start_xmit: ndo_start_xmit:
Synchronization: __netif_tx_lock spinlock. Synchronization: __netif_tx_lock spinlock.
When the driver sets NETIF_F_LLTX in dev->features this will be When the driver sets dev->lltx this will be
called without holding netif_tx_lock. In this case the driver called without holding netif_tx_lock. In this case the driver
has to lock by itself when needed. has to lock by itself when needed.
The locking there should also properly protect against The locking there should also properly protect against
set_rx_mode. WARNING: use of NETIF_F_LLTX is deprecated. set_rx_mode. WARNING: use of dev->lltx is deprecated.
Don't use it for new drivers. Don't use it for new drivers.
Context: Process with BHs disabled or BH (timer), Context: Process with BHs disabled or BH (timer),

View File

@ -3098,7 +3098,7 @@ static void amt_link_setup(struct net_device *dev)
dev->hard_header_len = 0; dev->hard_header_len = 0;
dev->addr_len = 0; dev->addr_len = 0;
dev->priv_flags |= IFF_NO_QUEUE; dev->priv_flags |= IFF_NO_QUEUE;
dev->features |= NETIF_F_LLTX; dev->lltx = true;
dev->features |= NETIF_F_GSO_SOFTWARE; dev->features |= NETIF_F_GSO_SOFTWARE;
dev->features |= NETIF_F_NETNS_LOCAL; dev->features |= NETIF_F_NETNS_LOCAL;
dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM; dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM;

View File

@ -553,7 +553,6 @@ static void bareudp_setup(struct net_device *dev)
SET_NETDEV_DEVTYPE(dev, &bareudp_type); SET_NETDEV_DEVTYPE(dev, &bareudp_type);
dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST; dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
dev->features |= NETIF_F_RXCSUM; dev->features |= NETIF_F_RXCSUM;
dev->features |= NETIF_F_LLTX;
dev->features |= NETIF_F_GSO_SOFTWARE; dev->features |= NETIF_F_GSO_SOFTWARE;
dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST; dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
dev->hw_features |= NETIF_F_RXCSUM; dev->hw_features |= NETIF_F_RXCSUM;
@ -566,6 +565,7 @@ static void bareudp_setup(struct net_device *dev)
dev->type = ARPHRD_NONE; dev->type = ARPHRD_NONE;
netif_keep_dst(dev); netif_keep_dst(dev);
dev->priv_flags |= IFF_NO_QUEUE; dev->priv_flags |= IFF_NO_QUEUE;
dev->lltx = true;
dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS; dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
} }

View File

@ -5928,7 +5928,7 @@ void bond_setup(struct net_device *bond_dev)
#endif /* CONFIG_XFRM_OFFLOAD */ #endif /* CONFIG_XFRM_OFFLOAD */
/* don't acquire bond device's netif_tx_lock when transmitting */ /* don't acquire bond device's netif_tx_lock when transmitting */
bond_dev->features |= NETIF_F_LLTX; bond_dev->lltx = true;
/* By default, we declare the bond to be fully /* By default, we declare the bond to be fully
* VLAN hardware accelerated capable. Special * VLAN hardware accelerated capable. Special

View File

@ -109,9 +109,10 @@ static void dummy_setup(struct net_device *dev)
dev->flags |= IFF_NOARP; dev->flags |= IFF_NOARP;
dev->flags &= ~IFF_MULTICAST; dev->flags &= ~IFF_MULTICAST;
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE; dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
dev->lltx = true;
dev->features |= NETIF_F_SG | NETIF_F_FRAGLIST; dev->features |= NETIF_F_SG | NETIF_F_FRAGLIST;
dev->features |= NETIF_F_GSO_SOFTWARE; dev->features |= NETIF_F_GSO_SOFTWARE;
dev->features |= NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_LLTX; dev->features |= NETIF_F_HW_CSUM | NETIF_F_HIGHDMA;
dev->features |= NETIF_F_GSO_ENCAP_ALL; dev->features |= NETIF_F_GSO_ENCAP_ALL;
dev->hw_features |= dev->features; dev->hw_features |= dev->features;
dev->hw_enc_features |= dev->features; dev->hw_enc_features |= dev->features;

View File

@ -1034,7 +1034,8 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
netdev->hw_features |= NETIF_F_SG | NETIF_F_IP_CSUM | netdev->hw_features |= NETIF_F_SG | NETIF_F_IP_CSUM |
NETIF_F_RXCSUM; NETIF_F_RXCSUM;
netdev->features |= NETIF_F_SG | NETIF_F_IP_CSUM | netdev->features |= NETIF_F_SG | NETIF_F_IP_CSUM |
NETIF_F_RXCSUM | NETIF_F_LLTX | NETIF_F_HIGHDMA; NETIF_F_RXCSUM | NETIF_F_HIGHDMA;
netdev->lltx = true;
if (vlan_tso_capable(adapter)) { if (vlan_tso_capable(adapter)) {
netdev->features |= netdev->features |=

View File

@ -229,7 +229,7 @@ static int dpaa_netdev_init(struct net_device *net_dev,
net_dev->max_mtu = dpaa_get_max_mtu(); net_dev->max_mtu = dpaa_get_max_mtu();
net_dev->hw_features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | net_dev->hw_features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
NETIF_F_LLTX | NETIF_F_RXHASH); NETIF_F_RXHASH);
net_dev->hw_features |= NETIF_F_SG | NETIF_F_HIGHDMA; net_dev->hw_features |= NETIF_F_SG | NETIF_F_HIGHDMA;
/* The kernels enables GSO automatically, if we declare NETIF_F_SG. /* The kernels enables GSO automatically, if we declare NETIF_F_SG.
@ -239,6 +239,7 @@ static int dpaa_netdev_init(struct net_device *net_dev,
net_dev->features |= NETIF_F_RXCSUM; net_dev->features |= NETIF_F_RXCSUM;
net_dev->priv_flags |= IFF_LIVE_ADDR_CHANGE; net_dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
net_dev->lltx = true;
/* we do not want shared skbs on TX */ /* we do not want shared skbs on TX */
net_dev->priv_flags &= ~IFF_TX_SKB_SHARING; net_dev->priv_flags &= ~IFF_TX_SKB_SHARING;

View File

@ -4594,12 +4594,13 @@ static int dpaa2_eth_netdev_init(struct net_device *net_dev)
net_dev->priv_flags |= supported; net_dev->priv_flags |= supported;
net_dev->priv_flags &= ~not_supported; net_dev->priv_flags &= ~not_supported;
net_dev->lltx = true;
/* Features */ /* Features */
net_dev->features = NETIF_F_RXCSUM | net_dev->features = NETIF_F_RXCSUM |
NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_SG | NETIF_F_HIGHDMA |
NETIF_F_LLTX | NETIF_F_HW_TC | NETIF_F_TSO; 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 | net_dev->xdp_features = NETDEV_XDP_ACT_BASIC |

View File

@ -1676,9 +1676,10 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u16 local_port,
netif_carrier_off(dev); netif_carrier_off(dev);
dev->features |= NETIF_F_NETNS_LOCAL | NETIF_F_LLTX | NETIF_F_SG | dev->features |= NETIF_F_NETNS_LOCAL | NETIF_F_SG |
NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_TC; NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_TC;
dev->hw_features |= NETIF_F_HW_TC | NETIF_F_LOOPBACK; dev->hw_features |= NETIF_F_HW_TC | NETIF_F_LOOPBACK;
dev->lltx = true;
dev->min_mtu = ETH_MIN_MTU; dev->min_mtu = ETH_MIN_MTU;
dev->max_mtu = MLXSW_PORT_MAX_MTU - MLXSW_PORT_ETH_FRAME_HDR; dev->max_mtu = MLXSW_PORT_MAX_MTU - MLXSW_PORT_ETH_FRAME_HDR;

View File

@ -248,7 +248,6 @@ nfp_repr_fix_features(struct net_device *netdev, netdev_features_t features)
features = netdev_intersect_features(features, lower_features); features = netdev_intersect_features(features, lower_features);
features |= old_features & (NETIF_F_SOFT_FEATURES | NETIF_F_HW_TC); features |= old_features & (NETIF_F_SOFT_FEATURES | NETIF_F_HW_TC);
features |= NETIF_F_LLTX;
return features; return features;
} }
@ -386,7 +385,7 @@ int nfp_repr_init(struct nfp_app *app, struct net_device *netdev,
netif_set_tso_max_segs(netdev, NFP_NET_LSO_MAX_SEGS); netif_set_tso_max_segs(netdev, NFP_NET_LSO_MAX_SEGS);
netdev->priv_flags |= IFF_NO_QUEUE | IFF_DISABLE_NETPOLL; netdev->priv_flags |= IFF_NO_QUEUE | IFF_DISABLE_NETPOLL;
netdev->features |= NETIF_F_LLTX; netdev->lltx = true;
if (nfp_app_has_tc(app)) { if (nfp_app_has_tc(app)) {
netdev->features |= NETIF_F_HW_TC; netdev->features |= NETIF_F_HW_TC;

View File

@ -1699,8 +1699,9 @@ pasemi_mac_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
netif_napi_add(dev, &mac->napi, pasemi_mac_poll); netif_napi_add(dev, &mac->napi, pasemi_mac_poll);
dev->features = NETIF_F_IP_CSUM | NETIF_F_LLTX | NETIF_F_SG | dev->features = NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_HIGHDMA |
NETIF_F_HIGHDMA | NETIF_F_GSO; NETIF_F_GSO;
dev->lltx = true;
mac->dma_pdev = pci_get_device(PCI_VENDOR_ID_PASEMI, 0xa007, NULL); mac->dma_pdev = pci_get_device(PCI_VENDOR_ID_PASEMI, 0xa007, NULL);
if (!mac->dma_pdev) { if (!mac->dma_pdev) {

View File

@ -286,7 +286,7 @@ void rmnet_vnd_setup(struct net_device *rmnet_dev)
rmnet_dev->needs_free_netdev = true; rmnet_dev->needs_free_netdev = true;
rmnet_dev->ethtool_ops = &rmnet_ethtool_ops; rmnet_dev->ethtool_ops = &rmnet_ethtool_ops;
rmnet_dev->features |= NETIF_F_LLTX; rmnet_dev->lltx = true;
/* This perm addr will be used as interface identifier by IPv6 */ /* This perm addr will be used as interface identifier by IPv6 */
rmnet_dev->addr_assign_type = NET_ADDR_RANDOM; rmnet_dev->addr_assign_type = NET_ADDR_RANDOM;

View File

@ -233,8 +233,8 @@ static struct efx_rep *efx_ef100_rep_create_netdev(struct efx_nic *efx,
net_dev->ethtool_ops = &efx_ef100_rep_ethtool_ops; net_dev->ethtool_ops = &efx_ef100_rep_ethtool_ops;
net_dev->min_mtu = EFX_MIN_MTU; net_dev->min_mtu = EFX_MIN_MTU;
net_dev->max_mtu = EFX_MAX_MTU; net_dev->max_mtu = EFX_MAX_MTU;
net_dev->features |= NETIF_F_LLTX; net_dev->lltx = true;
net_dev->hw_features |= NETIF_F_LLTX;
return efv; return efv;
fail1: fail1:
free_netdev(net_dev); free_netdev(net_dev);

View File

@ -1671,7 +1671,7 @@ static netdev_tx_t bdx_tx_transmit(struct sk_buff *skb,
#endif #endif
#ifdef BDX_LLTX #ifdef BDX_LLTX
netif_trans_update(ndev); /* NETIF_F_LLTX driver :( */ netif_trans_update(ndev); /* dev->lltx driver :( */
#endif #endif
ndev->stats.tx_packets++; ndev->stats.tx_packets++;
ndev->stats.tx_bytes += skb->len; ndev->stats.tx_bytes += skb->len;
@ -2019,7 +2019,7 @@ bdx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
* set multicast list callback has to use priv->tx_lock. * set multicast list callback has to use priv->tx_lock.
*/ */
#ifdef BDX_LLTX #ifdef BDX_LLTX
ndev->features |= NETIF_F_LLTX; ndev->lltx = true;
#endif #endif
/* MTU range: 60 - 16384 */ /* MTU range: 60 - 16384 */
ndev->min_mtu = ETH_ZLEN; ndev->min_mtu = ETH_ZLEN;

View File

@ -260,7 +260,7 @@ struct bdx_priv {
int tx_update_mark; int tx_update_mark;
int tx_noupd; int tx_noupd;
#endif #endif
spinlock_t tx_lock; /* NETIF_F_LLTX mode */ spinlock_t tx_lock; /* dev->lltx mode */
/* rarely used */ /* rarely used */
u8 port; u8 port;

View File

@ -2277,10 +2277,11 @@ spider_net_setup_netdev(struct spider_net_card *card)
netdev->hw_features = NETIF_F_RXCSUM | NETIF_F_IP_CSUM; netdev->hw_features = NETIF_F_RXCSUM | NETIF_F_IP_CSUM;
if (SPIDER_NET_RX_CSUM_DEFAULT) if (SPIDER_NET_RX_CSUM_DEFAULT)
netdev->features |= NETIF_F_RXCSUM; netdev->features |= NETIF_F_RXCSUM;
netdev->features |= NETIF_F_IP_CSUM | NETIF_F_LLTX; netdev->features |= NETIF_F_IP_CSUM;
/* some time: NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX | /* some time: NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX |
* NETIF_F_HW_VLAN_CTAG_FILTER * NETIF_F_HW_VLAN_CTAG_FILTER
*/ */
netdev->lltx = true;
/* MTU range: 64 - 2294 */ /* MTU range: 64 - 2294 */
netdev->min_mtu = SPIDER_NET_MIN_MTU; netdev->min_mtu = SPIDER_NET_MIN_MTU;

View File

@ -1194,7 +1194,6 @@ static void geneve_setup(struct net_device *dev)
SET_NETDEV_DEVTYPE(dev, &geneve_type); SET_NETDEV_DEVTYPE(dev, &geneve_type);
dev->features |= NETIF_F_LLTX;
dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST; dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
dev->features |= NETIF_F_RXCSUM; dev->features |= NETIF_F_RXCSUM;
dev->features |= NETIF_F_GSO_SOFTWARE; dev->features |= NETIF_F_GSO_SOFTWARE;
@ -1215,6 +1214,7 @@ static void geneve_setup(struct net_device *dev)
netif_keep_dst(dev); netif_keep_dst(dev);
dev->priv_flags &= ~IFF_TX_SKB_SHARING; dev->priv_flags &= ~IFF_TX_SKB_SHARING;
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE; dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
dev->lltx = true;
eth_hw_addr_random(dev); eth_hw_addr_random(dev);
} }

View File

@ -1356,7 +1356,7 @@ static void gtp_link_setup(struct net_device *dev)
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS; dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
dev->priv_flags |= IFF_NO_QUEUE; dev->priv_flags |= IFF_NO_QUEUE;
dev->features |= NETIF_F_LLTX; dev->lltx = true;
netif_keep_dst(dev); netif_keep_dst(dev);
dev->needed_headroom = LL_MAX_HEADER + GTP_IPV4_MAXLEN; dev->needed_headroom = LL_MAX_HEADER + GTP_IPV4_MAXLEN;

View File

@ -458,7 +458,7 @@ static void bpq_setup(struct net_device *dev)
dev->needs_free_netdev = true; dev->needs_free_netdev = true;
dev->flags = 0; dev->flags = 0;
dev->features = NETIF_F_LLTX; /* Allow recursion */ dev->lltx = true; /* Allow recursion */
#if IS_ENABLED(CONFIG_AX25) #if IS_ENABLED(CONFIG_AX25)
dev->header_ops = &ax25_header_ops; dev->header_ops = &ax25_header_ops;

View File

@ -114,7 +114,7 @@ static void ipvlan_port_destroy(struct net_device *dev)
NETIF_F_GSO_ROBUST | NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ENCAP_ALL) NETIF_F_GSO_ROBUST | NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ENCAP_ALL)
#define IPVLAN_ALWAYS_ON \ #define IPVLAN_ALWAYS_ON \
(IPVLAN_ALWAYS_ON_OFLOADS | NETIF_F_LLTX | NETIF_F_VLAN_CHALLENGED) (IPVLAN_ALWAYS_ON_OFLOADS | NETIF_F_VLAN_CHALLENGED)
#define IPVLAN_FEATURES \ #define IPVLAN_FEATURES \
(NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | \ (NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | \
@ -141,6 +141,7 @@ static int ipvlan_init(struct net_device *dev)
dev->vlan_features = phy_dev->vlan_features & IPVLAN_FEATURES; dev->vlan_features = phy_dev->vlan_features & IPVLAN_FEATURES;
dev->vlan_features |= IPVLAN_ALWAYS_ON_OFLOADS; dev->vlan_features |= IPVLAN_ALWAYS_ON_OFLOADS;
dev->hw_enc_features |= dev->features; dev->hw_enc_features |= dev->features;
dev->lltx = true;
netif_inherit_tso_max(dev, phy_dev); netif_inherit_tso_max(dev, phy_dev);
dev->hard_header_len = phy_dev->hard_header_len; dev->hard_header_len = phy_dev->hard_header_len;

View File

@ -171,6 +171,7 @@ static void gen_lo_setup(struct net_device *dev,
dev->type = ARPHRD_LOOPBACK; /* 0x0001*/ dev->type = ARPHRD_LOOPBACK; /* 0x0001*/
dev->flags = IFF_LOOPBACK; dev->flags = IFF_LOOPBACK;
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE; dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
dev->lltx = true;
netif_keep_dst(dev); netif_keep_dst(dev);
dev->hw_features = NETIF_F_GSO_SOFTWARE; dev->hw_features = NETIF_F_GSO_SOFTWARE;
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST dev->features = NETIF_F_SG | NETIF_F_FRAGLIST
@ -179,7 +180,6 @@ static void gen_lo_setup(struct net_device *dev,
| NETIF_F_RXCSUM | NETIF_F_RXCSUM
| NETIF_F_SCTP_CRC | NETIF_F_SCTP_CRC
| NETIF_F_HIGHDMA | NETIF_F_HIGHDMA
| NETIF_F_LLTX
| NETIF_F_NETNS_LOCAL | NETIF_F_NETNS_LOCAL
| NETIF_F_VLAN_CHALLENGED | NETIF_F_VLAN_CHALLENGED
| NETIF_F_LOOPBACK; | NETIF_F_LOOPBACK;

View File

@ -3550,7 +3550,8 @@ static int macsec_dev_init(struct net_device *dev)
return err; return err;
dev->features = real_dev->features & MACSEC_FEATURES; dev->features = real_dev->features & MACSEC_FEATURES;
dev->features |= NETIF_F_LLTX | NETIF_F_GSO_SOFTWARE; dev->features |= NETIF_F_GSO_SOFTWARE;
dev->lltx = true;
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS; dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
macsec_set_head_tail_room(dev); macsec_set_head_tail_room(dev);
@ -3581,7 +3582,6 @@ static netdev_features_t macsec_fix_features(struct net_device *dev,
features &= (real_dev->features & MACSEC_FEATURES) | features &= (real_dev->features & MACSEC_FEATURES) |
NETIF_F_GSO_SOFTWARE | NETIF_F_SOFT_FEATURES; NETIF_F_GSO_SOFTWARE | NETIF_F_SOFT_FEATURES;
features |= NETIF_F_LLTX;
return features; return features;
} }

View File

@ -900,7 +900,7 @@ static struct lock_class_key macvlan_netdev_addr_lock_key;
(NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE | \ (NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE | \
NETIF_F_GSO_ROBUST | NETIF_F_GSO_ENCAP_ALL) NETIF_F_GSO_ROBUST | NETIF_F_GSO_ENCAP_ALL)
#define ALWAYS_ON_FEATURES (ALWAYS_ON_OFFLOADS | NETIF_F_LLTX) #define ALWAYS_ON_FEATURES ALWAYS_ON_OFFLOADS
#define MACVLAN_FEATURES \ #define MACVLAN_FEATURES \
(NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | \ (NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | \
@ -932,6 +932,7 @@ static int macvlan_init(struct net_device *dev)
dev->vlan_features = lowerdev->vlan_features & MACVLAN_FEATURES; dev->vlan_features = lowerdev->vlan_features & MACVLAN_FEATURES;
dev->vlan_features |= ALWAYS_ON_OFFLOADS; dev->vlan_features |= ALWAYS_ON_OFFLOADS;
dev->hw_enc_features |= dev->features; dev->hw_enc_features |= dev->features;
dev->lltx = true;
netif_inherit_tso_max(dev, lowerdev); netif_inherit_tso_max(dev, lowerdev);
dev->hard_header_len = lowerdev->hard_header_len; dev->hard_header_len = lowerdev->hard_header_len;
macvlan_set_lockdep_class(dev); macvlan_set_lockdep_class(dev);

View File

@ -731,7 +731,7 @@ struct failover *net_failover_create(struct net_device *standby_dev)
IFF_TX_SKB_SHARING); IFF_TX_SKB_SHARING);
/* don't acquire failover netdev's netif_tx_lock when transmitting */ /* don't acquire failover netdev's netif_tx_lock when transmitting */
failover_dev->features |= NETIF_F_LLTX; failover_dev->lltx = true;
/* Don't allow failover devices to change network namespaces. */ /* Don't allow failover devices to change network namespaces. */
failover_dev->features |= NETIF_F_NETNS_LOCAL; failover_dev->features |= NETIF_F_NETNS_LOCAL;

View File

@ -255,11 +255,12 @@ static void netkit_setup(struct net_device *dev)
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE; dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
dev->priv_flags |= IFF_PHONY_HEADROOM; dev->priv_flags |= IFF_PHONY_HEADROOM;
dev->priv_flags |= IFF_NO_QUEUE; dev->priv_flags |= IFF_NO_QUEUE;
dev->lltx = true;
dev->ethtool_ops = &netkit_ethtool_ops; dev->ethtool_ops = &netkit_ethtool_ops;
dev->netdev_ops = &netkit_netdev_ops; dev->netdev_ops = &netkit_netdev_ops;
dev->features |= netkit_features | NETIF_F_LLTX; dev->features |= netkit_features;
dev->hw_features = netkit_features; dev->hw_features = netkit_features;
dev->hw_enc_features = netkit_features; dev->hw_enc_features = netkit_features;
dev->mpls_features = NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE; dev->mpls_features = NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE;

View File

@ -63,13 +63,13 @@ static void nlmon_setup(struct net_device *dev)
{ {
dev->type = ARPHRD_NETLINK; dev->type = ARPHRD_NETLINK;
dev->priv_flags |= IFF_NO_QUEUE; dev->priv_flags |= IFF_NO_QUEUE;
dev->lltx = true;
dev->netdev_ops = &nlmon_ops; dev->netdev_ops = &nlmon_ops;
dev->ethtool_ops = &nlmon_ethtool_ops; dev->ethtool_ops = &nlmon_ethtool_ops;
dev->needs_free_netdev = true; dev->needs_free_netdev = true;
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA;
NETIF_F_HIGHDMA | NETIF_F_LLTX;
dev->flags = IFF_NOARP; dev->flags = IFF_NOARP;
dev->pcpu_stat_type = NETDEV_PCPU_STAT_LSTATS; dev->pcpu_stat_type = NETDEV_PCPU_STAT_LSTATS;

View File

@ -1631,7 +1631,7 @@ static void ppp_setup(struct net_device *dev)
dev->netdev_ops = &ppp_netdev_ops; dev->netdev_ops = &ppp_netdev_ops;
SET_NETDEV_DEVTYPE(dev, &ppp_type); SET_NETDEV_DEVTYPE(dev, &ppp_type);
dev->features |= NETIF_F_LLTX; dev->lltx = true;
dev->hard_header_len = PPP_HDRLEN; dev->hard_header_len = PPP_HDRLEN;
dev->mtu = PPP_MRU; dev->mtu = PPP_MRU;

View File

@ -515,7 +515,7 @@ static int rionet_setup_netdev(struct rio_mport *mport, struct net_device *ndev)
/* MTU range: 68 - 4082 */ /* MTU range: 68 - 4082 */
ndev->min_mtu = ETH_MIN_MTU; ndev->min_mtu = ETH_MIN_MTU;
ndev->max_mtu = RIONET_MAX_MTU; ndev->max_mtu = RIONET_MAX_MTU;
ndev->features = NETIF_F_LLTX; ndev->lltx = true;
SET_NETDEV_DEV(ndev, &mport->dev); SET_NETDEV_DEV(ndev, &mport->dev);
ndev->ethtool_ops = &rionet_ethtool_ops; ndev->ethtool_ops = &rionet_ethtool_ops;

View File

@ -2189,8 +2189,8 @@ static void team_setup(struct net_device *dev)
* Let this up to underlay drivers. * Let this up to underlay drivers.
*/ */
dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIVE_ADDR_CHANGE; dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIVE_ADDR_CHANGE;
dev->lltx = true;
dev->features |= NETIF_F_LLTX;
dev->features |= NETIF_F_GRO; dev->features |= NETIF_F_GRO;
/* Don't allow team devices to change network namespaces. */ /* Don't allow team devices to change network namespaces. */

View File

@ -990,10 +990,11 @@ static int tun_net_init(struct net_device *dev)
dev->hw_features = NETIF_F_SG | NETIF_F_FRAGLIST | dev->hw_features = NETIF_F_SG | NETIF_F_FRAGLIST |
TUN_USER_FEATURES | NETIF_F_HW_VLAN_CTAG_TX | TUN_USER_FEATURES | NETIF_F_HW_VLAN_CTAG_TX |
NETIF_F_HW_VLAN_STAG_TX; NETIF_F_HW_VLAN_STAG_TX;
dev->features = dev->hw_features | NETIF_F_LLTX; dev->features = dev->hw_features;
dev->vlan_features = dev->features & dev->vlan_features = dev->features &
~(NETIF_F_HW_VLAN_CTAG_TX | ~(NETIF_F_HW_VLAN_CTAG_TX |
NETIF_F_HW_VLAN_STAG_TX); NETIF_F_HW_VLAN_STAG_TX);
dev->lltx = true;
tun->flags = (tun->flags & ~TUN_FEATURES) | tun->flags = (tun->flags & ~TUN_FEATURES) |
(ifr->ifr_flags & TUN_FEATURES); (ifr->ifr_flags & TUN_FEATURES);
@ -1129,7 +1130,7 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
goto drop; goto drop;
} }
/* NETIF_F_LLTX requires to do our own update of trans_start */ /* dev->lltx requires to do our own update of trans_start */
queue = netdev_get_tx_queue(dev, txq); queue = netdev_get_tx_queue(dev, txq);
txq_trans_cond_update(queue); txq_trans_cond_update(queue);

View File

@ -1697,11 +1697,11 @@ static void veth_setup(struct net_device *dev)
dev->priv_flags |= IFF_NO_QUEUE; dev->priv_flags |= IFF_NO_QUEUE;
dev->priv_flags |= IFF_PHONY_HEADROOM; dev->priv_flags |= IFF_PHONY_HEADROOM;
dev->priv_flags |= IFF_DISABLE_NETPOLL; dev->priv_flags |= IFF_DISABLE_NETPOLL;
dev->lltx = true;
dev->netdev_ops = &veth_netdev_ops; dev->netdev_ops = &veth_netdev_ops;
dev->xdp_metadata_ops = &veth_xdp_metadata_ops; dev->xdp_metadata_ops = &veth_xdp_metadata_ops;
dev->ethtool_ops = &veth_ethtool_ops; dev->ethtool_ops = &veth_ethtool_ops;
dev->features |= NETIF_F_LLTX;
dev->features |= VETH_FEATURES; dev->features |= VETH_FEATURES;
dev->vlan_features = dev->features & dev->vlan_features = dev->features &
~(NETIF_F_HW_VLAN_CTAG_TX | ~(NETIF_F_HW_VLAN_CTAG_TX |

View File

@ -1635,7 +1635,7 @@ static void vrf_setup(struct net_device *dev)
eth_hw_addr_random(dev); eth_hw_addr_random(dev);
/* don't acquire vrf device's netif_tx_lock when transmitting */ /* don't acquire vrf device's netif_tx_lock when transmitting */
dev->features |= NETIF_F_LLTX; dev->lltx = true;
/* don't allow vrf devices to change network namespaces. */ /* don't allow vrf devices to change network namespaces. */
dev->features |= NETIF_F_NETNS_LOCAL; dev->features |= NETIF_F_NETNS_LOCAL;

View File

@ -83,13 +83,13 @@ static void vsockmon_setup(struct net_device *dev)
{ {
dev->type = ARPHRD_VSOCKMON; dev->type = ARPHRD_VSOCKMON;
dev->priv_flags |= IFF_NO_QUEUE; dev->priv_flags |= IFF_NO_QUEUE;
dev->lltx = true;
dev->netdev_ops = &vsockmon_ops; dev->netdev_ops = &vsockmon_ops;
dev->ethtool_ops = &vsockmon_ethtool_ops; dev->ethtool_ops = &vsockmon_ethtool_ops;
dev->needs_free_netdev = true; dev->needs_free_netdev = true;
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA;
NETIF_F_HIGHDMA | NETIF_F_LLTX;
dev->flags = IFF_NOARP; dev->flags = IFF_NOARP;

View File

@ -3321,7 +3321,6 @@ static void vxlan_setup(struct net_device *dev)
dev->needs_free_netdev = true; dev->needs_free_netdev = true;
SET_NETDEV_DEVTYPE(dev, &vxlan_type); SET_NETDEV_DEVTYPE(dev, &vxlan_type);
dev->features |= NETIF_F_LLTX;
dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST; dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
dev->features |= NETIF_F_RXCSUM; dev->features |= NETIF_F_RXCSUM;
dev->features |= NETIF_F_GSO_SOFTWARE; dev->features |= NETIF_F_GSO_SOFTWARE;
@ -3333,6 +3332,7 @@ static void vxlan_setup(struct net_device *dev)
netif_keep_dst(dev); netif_keep_dst(dev);
dev->priv_flags |= IFF_NO_QUEUE; dev->priv_flags |= IFF_NO_QUEUE;
dev->change_proto_down = true; dev->change_proto_down = true;
dev->lltx = true;
/* MTU range: 68 - 65535 */ /* MTU range: 68 - 65535 */
dev->min_mtu = ETH_MIN_MTU; dev->min_mtu = ETH_MIN_MTU;

View File

@ -289,7 +289,7 @@ static void wg_setup(struct net_device *dev)
dev->type = ARPHRD_NONE; dev->type = ARPHRD_NONE;
dev->flags = IFF_POINTOPOINT | IFF_NOARP; dev->flags = IFF_POINTOPOINT | IFF_NOARP;
dev->priv_flags |= IFF_NO_QUEUE; dev->priv_flags |= IFF_NO_QUEUE;
dev->features |= NETIF_F_LLTX; dev->lltx = true;
dev->features |= WG_NETDEV_FEATURES; dev->features |= WG_NETDEV_FEATURES;
dev->hw_features |= WG_NETDEV_FEATURES; dev->hw_features |= WG_NETDEV_FEATURES;
dev->hw_enc_features |= WG_NETDEV_FEATURES; dev->hw_enc_features |= WG_NETDEV_FEATURES;

View File

@ -425,7 +425,7 @@ int cvm_oct_common_init(struct net_device *dev)
dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
/* We do our own locking, Linux doesn't need to */ /* We do our own locking, Linux doesn't need to */
dev->features |= NETIF_F_LLTX; dev->lltx = true;
dev->ethtool_ops = &cvm_oct_ethtool_ops; dev->ethtool_ops = &cvm_oct_ethtool_ops;
cvm_oct_set_mac_filter(dev); cvm_oct_set_mac_filter(dev);

View File

@ -24,8 +24,7 @@ enum {
NETIF_F_HW_VLAN_CTAG_FILTER_BIT,/* Receive filtering on VLAN CTAGs */ NETIF_F_HW_VLAN_CTAG_FILTER_BIT,/* Receive filtering on VLAN CTAGs */
NETIF_F_VLAN_CHALLENGED_BIT, /* Device cannot handle VLAN packets */ NETIF_F_VLAN_CHALLENGED_BIT, /* Device cannot handle VLAN packets */
NETIF_F_GSO_BIT, /* Enable software GSO. */ NETIF_F_GSO_BIT, /* Enable software GSO. */
NETIF_F_LLTX_BIT, /* LockLess TX - deprecated. Please */ __UNUSED_NETIF_F_12,
/* do not use LLTX in new drivers */
NETIF_F_NETNS_LOCAL_BIT, /* Does not change network namespaces */ NETIF_F_NETNS_LOCAL_BIT, /* Does not change network namespaces */
NETIF_F_GRO_BIT, /* Generic receive offload */ NETIF_F_GRO_BIT, /* Generic receive offload */
NETIF_F_LRO_BIT, /* large receive offload */ NETIF_F_LRO_BIT, /* large receive offload */
@ -120,7 +119,6 @@ enum {
#define NETIF_F_HW_VLAN_CTAG_TX __NETIF_F(HW_VLAN_CTAG_TX) #define NETIF_F_HW_VLAN_CTAG_TX __NETIF_F(HW_VLAN_CTAG_TX)
#define NETIF_F_IP_CSUM __NETIF_F(IP_CSUM) #define NETIF_F_IP_CSUM __NETIF_F(IP_CSUM)
#define NETIF_F_IPV6_CSUM __NETIF_F(IPV6_CSUM) #define NETIF_F_IPV6_CSUM __NETIF_F(IPV6_CSUM)
#define NETIF_F_LLTX __NETIF_F(LLTX)
#define NETIF_F_LOOPBACK __NETIF_F(LOOPBACK) #define NETIF_F_LOOPBACK __NETIF_F(LOOPBACK)
#define NETIF_F_LRO __NETIF_F(LRO) #define NETIF_F_LRO __NETIF_F(LRO)
#define NETIF_F_NETNS_LOCAL __NETIF_F(NETNS_LOCAL) #define NETIF_F_NETNS_LOCAL __NETIF_F(NETNS_LOCAL)
@ -193,7 +191,7 @@ static inline int find_next_netdev_feature(u64 feature, unsigned long start)
/* Features valid for ethtool to change */ /* Features valid for ethtool to change */
/* = all defined minus driver/device-class-related */ /* = all defined minus driver/device-class-related */
#define NETIF_F_NEVER_CHANGE (NETIF_F_VLAN_CHALLENGED | \ #define NETIF_F_NEVER_CHANGE (NETIF_F_VLAN_CHALLENGED | \
NETIF_F_LLTX | NETIF_F_NETNS_LOCAL) NETIF_F_NETNS_LOCAL)
/* remember that ((t)1 << t_BITS) is undefined in C99 */ /* remember that ((t)1 << t_BITS) is undefined in C99 */
#define NETIF_F_ETHTOOL_BITS ((__NETIF_F_BIT(NETDEV_FEATURE_COUNT - 1) | \ #define NETIF_F_ETHTOOL_BITS ((__NETIF_F_BIT(NETDEV_FEATURE_COUNT - 1) | \

View File

@ -1720,6 +1720,9 @@ enum netdev_reg_state {
* *
* @priv_flags: flags invisible to userspace defined as bits, see * @priv_flags: flags invisible to userspace defined as bits, see
* enum netdev_priv_flags for the definitions * enum netdev_priv_flags for the definitions
* @lltx: device supports lockless Tx. Deprecated for real HW
* drivers. Mainly used by logical interfaces, such as
* bonding and tunnels
* *
* @name: This is the first field of the "visible" part of this structure * @name: This is the first field of the "visible" part of this structure
* (i.e. as seen by users in the "Space.c" file). It is the name * (i.e. as seen by users in the "Space.c" file). It is the name
@ -2018,6 +2021,7 @@ struct net_device {
__cacheline_group_begin(net_device_read_tx); __cacheline_group_begin(net_device_read_tx);
struct_group(priv_flags_fast, struct_group(priv_flags_fast,
unsigned long priv_flags:32; unsigned long priv_flags:32;
unsigned long lltx:1;
); );
const struct net_device_ops *netdev_ops; const struct net_device_ops *netdev_ops;
const struct header_ops *header_ops; const struct header_ops *header_ops;
@ -4433,7 +4437,7 @@ static inline void netif_tx_unlock_bh(struct net_device *dev)
} }
#define HARD_TX_LOCK(dev, txq, cpu) { \ #define HARD_TX_LOCK(dev, txq, cpu) { \
if ((dev->features & NETIF_F_LLTX) == 0) { \ if (!(dev)->lltx) { \
__netif_tx_lock(txq, cpu); \ __netif_tx_lock(txq, cpu); \
} else { \ } else { \
__netif_tx_acquire(txq); \ __netif_tx_acquire(txq); \
@ -4441,12 +4445,12 @@ static inline void netif_tx_unlock_bh(struct net_device *dev)
} }
#define HARD_TX_TRYLOCK(dev, txq) \ #define HARD_TX_TRYLOCK(dev, txq) \
(((dev->features & NETIF_F_LLTX) == 0) ? \ (!(dev)->lltx ? \
__netif_tx_trylock(txq) : \ __netif_tx_trylock(txq) : \
__netif_tx_acquire(txq)) __netif_tx_acquire(txq))
#define HARD_TX_UNLOCK(dev, txq) { \ #define HARD_TX_UNLOCK(dev, txq) { \
if ((dev->features & NETIF_F_LLTX) == 0) { \ if (!(dev)->lltx) { \
__netif_tx_unlock(txq); \ __netif_tx_unlock(txq); \
} else { \ } else { \
__netif_tx_release(txq); \ __netif_tx_release(txq); \

View File

@ -15077,8 +15077,7 @@ static struct skb_segment_test skb_segment_tests[] __initconst = {
.build_skb = build_test_skb_linear_no_head_frag, .build_skb = build_test_skb_linear_no_head_frag,
.features = NETIF_F_SG | NETIF_F_FRAGLIST | .features = NETIF_F_SG | NETIF_F_FRAGLIST |
NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_GSO | NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_GSO |
NETIF_F_LLTX | NETIF_F_GRO | NETIF_F_GRO | NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM |
NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM |
NETIF_F_HW_VLAN_STAG_TX NETIF_F_HW_VLAN_STAG_TX
} }
}; };

View File

@ -569,7 +569,8 @@ static int vlan_dev_init(struct net_device *dev)
if (real_dev->vlan_features & NETIF_F_HW_MACSEC) if (real_dev->vlan_features & NETIF_F_HW_MACSEC)
dev->hw_features |= NETIF_F_HW_MACSEC; dev->hw_features |= NETIF_F_HW_MACSEC;
dev->features |= dev->hw_features | NETIF_F_LLTX; dev->features |= dev->hw_features;
dev->lltx = true;
netif_inherit_tso_max(dev, real_dev); netif_inherit_tso_max(dev, real_dev);
if (dev->features & NETIF_F_VLAN_FEATURES) if (dev->features & NETIF_F_VLAN_FEATURES)
netdev_warn(real_dev, "VLAN features are set incorrectly. Q-in-Q configurations may not work correctly.\n"); netdev_warn(real_dev, "VLAN features are set incorrectly. Q-in-Q configurations may not work correctly.\n");
@ -655,7 +656,6 @@ static netdev_features_t vlan_dev_fix_features(struct net_device *dev,
lower_features |= NETIF_F_HW_CSUM; lower_features |= NETIF_F_HW_CSUM;
features = netdev_intersect_features(features, lower_features); features = netdev_intersect_features(features, lower_features);
features |= old_features & (NETIF_F_SOFT_FEATURES | NETIF_F_GSO_SOFTWARE); features |= old_features & (NETIF_F_SOFT_FEATURES | NETIF_F_GSO_SOFTWARE);
features |= NETIF_F_LLTX;
return features; return features;
} }

View File

@ -1021,8 +1021,8 @@ static void batadv_softif_init_early(struct net_device *dev)
dev->needs_free_netdev = true; dev->needs_free_netdev = true;
dev->priv_destructor = batadv_softif_free; dev->priv_destructor = batadv_softif_free;
dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_NETNS_LOCAL; dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_NETNS_LOCAL;
dev->features |= NETIF_F_LLTX;
dev->priv_flags |= IFF_NO_QUEUE; dev->priv_flags |= IFF_NO_QUEUE;
dev->lltx = true;
/* can't call min_mtu, because the needed variables /* can't call min_mtu, because the needed variables
* have not been initialized yet * have not been initialized yet

View File

@ -487,8 +487,9 @@ void br_dev_setup(struct net_device *dev)
dev->ethtool_ops = &br_ethtool_ops; dev->ethtool_ops = &br_ethtool_ops;
SET_NETDEV_DEVTYPE(dev, &br_type); SET_NETDEV_DEVTYPE(dev, &br_type);
dev->priv_flags = IFF_EBRIDGE | IFF_NO_QUEUE; dev->priv_flags = IFF_EBRIDGE | IFF_NO_QUEUE;
dev->lltx = true;
dev->features = COMMON_FEATURES | NETIF_F_LLTX | NETIF_F_NETNS_LOCAL | dev->features = COMMON_FEATURES | NETIF_F_NETNS_LOCAL |
NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX; NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX;
dev->hw_features = COMMON_FEATURES | NETIF_F_HW_VLAN_CTAG_TX | dev->hw_features = COMMON_FEATURES | NETIF_F_HW_VLAN_CTAG_TX |
NETIF_F_HW_VLAN_STAG_TX; NETIF_F_HW_VLAN_STAG_TX;

View File

@ -1764,8 +1764,7 @@ static const struct kobj_type netdev_queue_ktype = {
static bool netdev_uses_bql(const struct net_device *dev) static bool netdev_uses_bql(const struct net_device *dev)
{ {
if (dev->features & NETIF_F_LLTX || if (dev->lltx || (dev->priv_flags & IFF_NO_QUEUE))
dev->priv_flags & IFF_NO_QUEUE)
return false; return false;
return IS_ENABLED(CONFIG_BQL); return IS_ENABLED(CONFIG_BQL);

View File

@ -2642,11 +2642,12 @@ void dsa_user_setup_tagger(struct net_device *user)
user->features = conduit->vlan_features | NETIF_F_HW_TC; user->features = conduit->vlan_features | NETIF_F_HW_TC;
user->hw_features |= NETIF_F_HW_TC; user->hw_features |= NETIF_F_HW_TC;
user->features |= NETIF_F_LLTX;
if (user->needed_tailroom) if (user->needed_tailroom)
user->features &= ~(NETIF_F_SG | NETIF_F_FRAGLIST); user->features &= ~(NETIF_F_SG | NETIF_F_FRAGLIST);
if (ds->needs_standalone_vlan_filtering) if (ds->needs_standalone_vlan_filtering)
user->features |= NETIF_F_HW_VLAN_CTAG_FILTER; user->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
user->lltx = true;
} }
int dsa_user_suspend(struct net_device *user_dev) int dsa_user_suspend(struct net_device *user_dev)

View File

@ -25,7 +25,6 @@ const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = {
[NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter", [NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter",
[NETIF_F_VLAN_CHALLENGED_BIT] = "vlan-challenged", [NETIF_F_VLAN_CHALLENGED_BIT] = "vlan-challenged",
[NETIF_F_GSO_BIT] = "tx-generic-segmentation", [NETIF_F_GSO_BIT] = "tx-generic-segmentation",
[NETIF_F_LLTX_BIT] = "tx-lockless",
[NETIF_F_NETNS_LOCAL_BIT] = "netns-local", [NETIF_F_NETNS_LOCAL_BIT] = "netns-local",
[NETIF_F_GRO_BIT] = "rx-gro", [NETIF_F_GRO_BIT] = "rx-gro",
[NETIF_F_GRO_HW_BIT] = "rx-gro-hw", [NETIF_F_GRO_HW_BIT] = "rx-gro-hw",

View File

@ -554,6 +554,8 @@ void hsr_dev_setup(struct net_device *dev)
dev->netdev_ops = &hsr_device_ops; dev->netdev_ops = &hsr_device_ops;
SET_NETDEV_DEVTYPE(dev, &hsr_type); SET_NETDEV_DEVTYPE(dev, &hsr_type);
dev->priv_flags |= IFF_NO_QUEUE | IFF_DISABLE_NETPOLL; dev->priv_flags |= IFF_NO_QUEUE | IFF_DISABLE_NETPOLL;
/* Prevent recursive tx locking */
dev->lltx = true;
dev->needs_free_netdev = true; dev->needs_free_netdev = true;
@ -563,8 +565,6 @@ void hsr_dev_setup(struct net_device *dev)
dev->features = dev->hw_features; dev->features = dev->hw_features;
/* Prevent recursive tx locking */
dev->features |= NETIF_F_LLTX;
/* VLAN on top of HSR needs testing and probably some work on /* VLAN on top of HSR needs testing and probably some work on
* hsr_header_create() etc. * hsr_header_create() etc.
*/ */

View File

@ -996,7 +996,7 @@ static void __gre_tunnel_init(struct net_device *dev)
tunnel->hlen = tunnel->tun_hlen + tunnel->encap_hlen; tunnel->hlen = tunnel->tun_hlen + tunnel->encap_hlen;
dev->needed_headroom = tunnel->hlen + sizeof(tunnel->parms.iph); dev->needed_headroom = tunnel->hlen + sizeof(tunnel->parms.iph);
dev->features |= GRE_FEATURES | NETIF_F_LLTX; dev->features |= GRE_FEATURES;
dev->hw_features |= GRE_FEATURES; dev->hw_features |= GRE_FEATURES;
/* TCP offload with GRE SEQ is not supported, nor can we support 2 /* TCP offload with GRE SEQ is not supported, nor can we support 2
@ -1010,6 +1010,8 @@ static void __gre_tunnel_init(struct net_device *dev)
dev->features |= NETIF_F_GSO_SOFTWARE; dev->features |= NETIF_F_GSO_SOFTWARE;
dev->hw_features |= NETIF_F_GSO_SOFTWARE; dev->hw_features |= NETIF_F_GSO_SOFTWARE;
dev->lltx = true;
} }
static int ipgre_tunnel_init(struct net_device *dev) static int ipgre_tunnel_init(struct net_device *dev)

View File

@ -443,7 +443,7 @@ static int vti_tunnel_init(struct net_device *dev)
dev->flags = IFF_NOARP; dev->flags = IFF_NOARP;
dev->addr_len = 4; dev->addr_len = 4;
dev->features |= NETIF_F_LLTX; dev->lltx = true;
netif_keep_dst(dev); netif_keep_dst(dev);
return ip_tunnel_init(dev); return ip_tunnel_init(dev);

View File

@ -378,7 +378,7 @@ static void ipip_tunnel_setup(struct net_device *dev)
dev->type = ARPHRD_TUNNEL; dev->type = ARPHRD_TUNNEL;
dev->flags = IFF_NOARP; dev->flags = IFF_NOARP;
dev->addr_len = 4; dev->addr_len = 4;
dev->features |= NETIF_F_LLTX; dev->lltx = true;
netif_keep_dst(dev); netif_keep_dst(dev);
dev->features |= IPIP_FEATURES; dev->features |= IPIP_FEATURES;

View File

@ -1471,7 +1471,7 @@ static void ip6gre_tnl_init_features(struct net_device *dev)
{ {
struct ip6_tnl *nt = netdev_priv(dev); struct ip6_tnl *nt = netdev_priv(dev);
dev->features |= GRE6_FEATURES | NETIF_F_LLTX; dev->features |= GRE6_FEATURES;
dev->hw_features |= GRE6_FEATURES; dev->hw_features |= GRE6_FEATURES;
/* TCP offload with GRE SEQ is not supported, nor can we support 2 /* TCP offload with GRE SEQ is not supported, nor can we support 2
@ -1485,6 +1485,8 @@ static void ip6gre_tnl_init_features(struct net_device *dev)
dev->features |= NETIF_F_GSO_SOFTWARE; dev->features |= NETIF_F_GSO_SOFTWARE;
dev->hw_features |= NETIF_F_GSO_SOFTWARE; dev->hw_features |= NETIF_F_GSO_SOFTWARE;
dev->lltx = true;
} }
static int ip6gre_tunnel_init_common(struct net_device *dev) static int ip6gre_tunnel_init_common(struct net_device *dev)

View File

@ -1849,7 +1849,7 @@ static void ip6_tnl_dev_setup(struct net_device *dev)
dev->type = ARPHRD_TUNNEL6; dev->type = ARPHRD_TUNNEL6;
dev->flags |= IFF_NOARP; dev->flags |= IFF_NOARP;
dev->addr_len = sizeof(struct in6_addr); dev->addr_len = sizeof(struct in6_addr);
dev->features |= NETIF_F_LLTX; dev->lltx = true;
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS; dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
netif_keep_dst(dev); netif_keep_dst(dev);

View File

@ -1436,7 +1436,7 @@ static void ipip6_tunnel_setup(struct net_device *dev)
dev->flags = IFF_NOARP; dev->flags = IFF_NOARP;
netif_keep_dst(dev); netif_keep_dst(dev);
dev->addr_len = 4; dev->addr_len = 4;
dev->features |= NETIF_F_LLTX; dev->lltx = true;
dev->features |= SIT_FEATURES; dev->features |= SIT_FEATURES;
dev->hw_features |= SIT_FEATURES; dev->hw_features |= SIT_FEATURES;
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS; dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;

View File

@ -97,7 +97,7 @@ static void l2tp_eth_dev_setup(struct net_device *dev)
SET_NETDEV_DEVTYPE(dev, &l2tpeth_type); SET_NETDEV_DEVTYPE(dev, &l2tpeth_type);
ether_setup(dev); ether_setup(dev);
dev->priv_flags &= ~IFF_TX_SKB_SHARING; dev->priv_flags &= ~IFF_TX_SKB_SHARING;
dev->features |= NETIF_F_LLTX; dev->lltx = true;
dev->netdev_ops = &l2tp_eth_netdev_ops; dev->netdev_ops = &l2tp_eth_netdev_ops;
dev->needs_free_netdev = true; dev->needs_free_netdev = true;
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS; dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;

View File

@ -102,19 +102,20 @@ static void do_setup(struct net_device *netdev)
netdev->priv_flags &= ~IFF_TX_SKB_SHARING; netdev->priv_flags &= ~IFF_TX_SKB_SHARING;
netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_OPENVSWITCH | netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_OPENVSWITCH |
IFF_NO_QUEUE; IFF_NO_QUEUE;
netdev->lltx = true;
netdev->needs_free_netdev = true; netdev->needs_free_netdev = true;
netdev->priv_destructor = NULL; netdev->priv_destructor = NULL;
netdev->ethtool_ops = &internal_dev_ethtool_ops; netdev->ethtool_ops = &internal_dev_ethtool_ops;
netdev->rtnl_link_ops = &internal_dev_link_ops; netdev->rtnl_link_ops = &internal_dev_link_ops;
netdev->features = NETIF_F_LLTX | NETIF_F_SG | NETIF_F_FRAGLIST | netdev->features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA |
NETIF_F_HIGHDMA | NETIF_F_HW_CSUM | NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE |
NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ENCAP_ALL; NETIF_F_GSO_ENCAP_ALL;
netdev->vlan_features = netdev->features; netdev->vlan_features = netdev->features;
netdev->hw_enc_features = netdev->features; netdev->hw_enc_features = netdev->features;
netdev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX; netdev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX;
netdev->hw_features = netdev->features & ~NETIF_F_LLTX; netdev->hw_features = netdev->features;
eth_hw_addr_random(netdev); eth_hw_addr_random(netdev);
} }

View File

@ -769,7 +769,7 @@ static int xfrmi_dev_init(struct net_device *dev)
if (err) if (err)
return err; return err;
dev->features |= NETIF_F_LLTX; dev->lltx = true;
dev->features |= XFRMI_FEATURES; dev->features |= XFRMI_FEATURES;
dev->hw_features |= XFRMI_FEATURES; dev->hw_features |= XFRMI_FEATURES;