Skip to content

Commit e32f55f

Browse files
committed
Merge branch '10GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/next-queue
Jeff Kirsher says: ==================== L2 Fwd Offload & 10GbE Intel Driver Updates 2018-07-09 This patch series is meant to allow support for the L2 forward offload, aka MACVLAN offload without the need for using ndo_select_queue. The existing solution currently requires that we use ndo_select_queue in the transmit path if we want to associate specific Tx queues with a given MACVLAN interface. In order to get away from this we need to repurpose the tc_to_txq array and XPS pointer for the MACVLAN interface and use those as a means of accessing the queues on the lower device. As a result we cannot offload a device that is configured as multiqueue, however it doesn't really make sense to configure a macvlan interfaced as being multiqueue anyway since it doesn't really have a qdisc of its own in the first place. The big changes in this set are: Allow lower device to update tc_to_txq and XPS map of offloaded MACVLAN Disable XPS for single queue devices Replace accel_priv with sb_dev in ndo_select_queue Add sb_dev parameter to fallback function for ndo_select_queue Consolidated ndo_select_queue functions that appeared to be duplicates ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 4929c94 + 8ec56fc commit e32f55f

File tree

35 files changed

+312
-131
lines changed

35 files changed

+312
-131
lines changed

drivers/infiniband/hw/hfi1/vnic_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ static netdev_tx_t hfi1_netdev_start_xmit(struct sk_buff *skb,
423423

424424
static u16 hfi1_vnic_select_queue(struct net_device *netdev,
425425
struct sk_buff *skb,
426-
void *accel_priv,
426+
struct net_device *sb_dev,
427427
select_queue_fallback_t fallback)
428428
{
429429
struct hfi1_vnic_vport_info *vinfo = opa_vnic_dev_priv(netdev);

drivers/infiniband/ulp/opa_vnic/opa_vnic_netdev.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ static netdev_tx_t opa_netdev_start_xmit(struct sk_buff *skb,
9595
}
9696

9797
static u16 opa_vnic_select_queue(struct net_device *netdev, struct sk_buff *skb,
98-
void *accel_priv,
98+
struct net_device *sb_dev,
9999
select_queue_fallback_t fallback)
100100
{
101101
struct opa_vnic_adapter *adapter = opa_vnic_priv(netdev);
@@ -107,7 +107,7 @@ static u16 opa_vnic_select_queue(struct net_device *netdev, struct sk_buff *skb,
107107
mdata->entropy = opa_vnic_calc_entropy(skb);
108108
mdata->vl = opa_vnic_get_vl(adapter, skb);
109109
rc = adapter->rn_ops->ndo_select_queue(netdev, skb,
110-
accel_priv, fallback);
110+
sb_dev, fallback);
111111
skb_pull(skb, sizeof(*mdata));
112112
return rc;
113113
}

drivers/net/bonding/bond_main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4094,7 +4094,8 @@ static inline int bond_slave_override(struct bonding *bond,
40944094

40954095

40964096
static u16 bond_select_queue(struct net_device *dev, struct sk_buff *skb,
4097-
void *accel_priv, select_queue_fallback_t fallback)
4097+
struct net_device *sb_dev,
4098+
select_queue_fallback_t fallback)
40984099
{
40994100
/* This helper function exists to help dev_pick_tx get the correct
41004101
* destination queue. Using a helper function skips a call to

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2213,7 +2213,8 @@ static void ena_netpoll(struct net_device *netdev)
22132213
#endif /* CONFIG_NET_POLL_CONTROLLER */
22142214

22152215
static u16 ena_select_queue(struct net_device *dev, struct sk_buff *skb,
2216-
void *accel_priv, select_queue_fallback_t fallback)
2216+
struct net_device *sb_dev,
2217+
select_queue_fallback_t fallback)
22172218
{
22182219
u16 qid;
22192220
/* we suspect that this is good for in--kernel network services that
@@ -2223,7 +2224,7 @@ static u16 ena_select_queue(struct net_device *dev, struct sk_buff *skb,
22232224
if (skb_rx_queue_recorded(skb))
22242225
qid = skb_get_rx_queue(skb);
22252226
else
2226-
qid = fallback(dev, skb);
2227+
qid = fallback(dev, skb, NULL);
22272228

22282229
return qid;
22292230
}

drivers/net/ethernet/broadcom/bcmsysport.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2107,7 +2107,7 @@ static const struct ethtool_ops bcm_sysport_ethtool_ops = {
21072107
};
21082108

21092109
static u16 bcm_sysport_select_queue(struct net_device *dev, struct sk_buff *skb,
2110-
void *accel_priv,
2110+
struct net_device *sb_dev,
21112111
select_queue_fallback_t fallback)
21122112
{
21132113
struct bcm_sysport_priv *priv = netdev_priv(dev);
@@ -2116,15 +2116,15 @@ static u16 bcm_sysport_select_queue(struct net_device *dev, struct sk_buff *skb,
21162116
unsigned int q, port;
21172117

21182118
if (!netdev_uses_dsa(dev))
2119-
return fallback(dev, skb);
2119+
return fallback(dev, skb, NULL);
21202120

21212121
/* DSA tagging layer will have configured the correct queue */
21222122
q = BRCM_TAG_GET_QUEUE(queue);
21232123
port = BRCM_TAG_GET_PORT(queue);
21242124
tx_ring = priv->ring_map[q + port * priv->per_port_num_tx_queues];
21252125

21262126
if (unlikely(!tx_ring))
2127-
return fallback(dev, skb);
2127+
return fallback(dev, skb, NULL);
21282128

21292129
return tx_ring->index;
21302130
}

drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1910,7 +1910,8 @@ void bnx2x_netif_stop(struct bnx2x *bp, int disable_hw)
19101910
}
19111911

19121912
u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb,
1913-
void *accel_priv, select_queue_fallback_t fallback)
1913+
struct net_device *sb_dev,
1914+
select_queue_fallback_t fallback)
19141915
{
19151916
struct bnx2x *bp = netdev_priv(dev);
19161917

@@ -1932,7 +1933,8 @@ u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb,
19321933
}
19331934

19341935
/* select a non-FCoE queue */
1935-
return fallback(dev, skb) % (BNX2X_NUM_ETH_QUEUES(bp) * bp->max_cos);
1936+
return fallback(dev, skb, NULL) %
1937+
(BNX2X_NUM_ETH_QUEUES(bp) * bp->max_cos);
19361938
}
19371939

19381940
void bnx2x_set_num_queues(struct bnx2x *bp)

drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,8 @@ int bnx2x_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan, u8 qos,
497497

498498
/* select_queue callback */
499499
u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb,
500-
void *accel_priv, select_queue_fallback_t fallback);
500+
struct net_device *sb_dev,
501+
select_queue_fallback_t fallback);
501502

502503
static inline void bnx2x_update_rx_prod(struct bnx2x *bp,
503504
struct bnx2x_fastpath *fp,

drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -930,7 +930,8 @@ static int setup_sge_queues(struct adapter *adap)
930930
}
931931

932932
static u16 cxgb_select_queue(struct net_device *dev, struct sk_buff *skb,
933-
void *accel_priv, select_queue_fallback_t fallback)
933+
struct net_device *sb_dev,
934+
select_queue_fallback_t fallback)
934935
{
935936
int txq;
936937

@@ -972,7 +973,7 @@ static u16 cxgb_select_queue(struct net_device *dev, struct sk_buff *skb,
972973
return txq;
973974
}
974975

975-
return fallback(dev, skb) % dev->real_num_tx_queues;
976+
return fallback(dev, skb, NULL) % dev->real_num_tx_queues;
976977
}
977978

978979
static int closest_timer(const struct sge *s, int time)

drivers/net/ethernet/hisilicon/hns/hns_enet.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2022,7 +2022,8 @@ static void hns_nic_get_stats64(struct net_device *ndev,
20222022

20232023
static u16
20242024
hns_nic_select_queue(struct net_device *ndev, struct sk_buff *skb,
2025-
void *accel_priv, select_queue_fallback_t fallback)
2025+
struct net_device *sb_dev,
2026+
select_queue_fallback_t fallback)
20262027
{
20272028
struct ethhdr *eth_hdr = (struct ethhdr *)skb->data;
20282029
struct hns_nic_priv *priv = netdev_priv(ndev);
@@ -2032,7 +2033,7 @@ hns_nic_select_queue(struct net_device *ndev, struct sk_buff *skb,
20322033
is_multicast_ether_addr(eth_hdr->h_dest))
20332034
return 0;
20342035
else
2035-
return fallback(ndev, skb);
2036+
return fallback(ndev, skb, NULL);
20362037
}
20372038

20382039
static const struct net_device_ops hns_nic_netdev_ops = {

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

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5275,6 +5275,8 @@ static void ixgbe_clean_rx_ring(struct ixgbe_ring *rx_ring)
52755275
static int ixgbe_fwd_ring_up(struct ixgbe_adapter *adapter,
52765276
struct ixgbe_fwd_adapter *accel)
52775277
{
5278+
u16 rss_i = adapter->ring_feature[RING_F_RSS].indices;
5279+
int num_tc = netdev_get_num_tc(adapter->netdev);
52785280
struct net_device *vdev = accel->netdev;
52795281
int i, baseq, err;
52805282

@@ -5286,6 +5288,11 @@ static int ixgbe_fwd_ring_up(struct ixgbe_adapter *adapter,
52865288
accel->rx_base_queue = baseq;
52875289
accel->tx_base_queue = baseq;
52885290

5291+
/* record configuration for macvlan interface in vdev */
5292+
for (i = 0; i < num_tc; i++)
5293+
netdev_bind_sb_channel_queue(adapter->netdev, vdev,
5294+
i, rss_i, baseq + (rss_i * i));
5295+
52895296
for (i = 0; i < adapter->num_rx_queues_per_pool; i++)
52905297
adapter->rx_ring[baseq + i]->netdev = vdev;
52915298

@@ -5310,6 +5317,10 @@ static int ixgbe_fwd_ring_up(struct ixgbe_adapter *adapter,
53105317

53115318
netdev_err(vdev, "L2FW offload disabled due to L2 filter error\n");
53125319

5320+
/* unbind the queues and drop the subordinate channel config */
5321+
netdev_unbind_sb_channel(adapter->netdev, vdev);
5322+
netdev_set_sb_channel(vdev, 0);
5323+
53135324
clear_bit(accel->pool, adapter->fwd_bitmask);
53145325
kfree(accel);
53155326

@@ -8197,25 +8208,25 @@ static void ixgbe_atr(struct ixgbe_ring *ring,
81978208
input, common, ring->queue_index);
81988209
}
81998210

8211+
#ifdef IXGBE_FCOE
82008212
static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb,
8201-
void *accel_priv, select_queue_fallback_t fallback)
8213+
struct net_device *sb_dev,
8214+
select_queue_fallback_t fallback)
82028215
{
8203-
struct ixgbe_fwd_adapter *fwd_adapter = accel_priv;
82048216
struct ixgbe_adapter *adapter;
8205-
int txq;
8206-
#ifdef IXGBE_FCOE
82078217
struct ixgbe_ring_feature *f;
8208-
#endif
8218+
int txq;
82098219

8210-
if (fwd_adapter) {
8211-
adapter = netdev_priv(dev);
8212-
txq = reciprocal_scale(skb_get_hash(skb),
8213-
adapter->num_rx_queues_per_pool);
8220+
if (sb_dev) {
8221+
u8 tc = netdev_get_prio_tc_map(dev, skb->priority);
8222+
struct net_device *vdev = sb_dev;
82148223

8215-
return txq + fwd_adapter->tx_base_queue;
8216-
}
8224+
txq = vdev->tc_to_txq[tc].offset;
8225+
txq += reciprocal_scale(skb_get_hash(skb),
8226+
vdev->tc_to_txq[tc].count);
82178227

8218-
#ifdef IXGBE_FCOE
8228+
return txq;
8229+
}
82198230

82208231
/*
82218232
* only execute the code below if protocol is FCoE
@@ -8226,11 +8237,11 @@ static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb,
82268237
case htons(ETH_P_FIP):
82278238
adapter = netdev_priv(dev);
82288239

8229-
if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED)
8240+
if (!sb_dev && (adapter->flags & IXGBE_FLAG_FCOE_ENABLED))
82308241
break;
82318242
/* fall through */
82328243
default:
8233-
return fallback(dev, skb);
8244+
return fallback(dev, skb, sb_dev);
82348245
}
82358246

82368247
f = &adapter->ring_feature[RING_F_FCOE];
@@ -8242,11 +8253,9 @@ static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb,
82428253
txq -= f->indices;
82438254

82448255
return txq + f->offset;
8245-
#else
8246-
return fallback(dev, skb);
8247-
#endif
82488256
}
82498257

8258+
#endif
82508259
static int ixgbe_xmit_xdp_ring(struct ixgbe_adapter *adapter,
82518260
struct xdp_frame *xdpf)
82528261
{
@@ -8766,6 +8775,11 @@ static int ixgbe_reassign_macvlan_pool(struct net_device *vdev, void *data)
87668775
/* if we cannot find a free pool then disable the offload */
87678776
netdev_err(vdev, "L2FW offload disabled due to lack of queue resources\n");
87688777
macvlan_release_l2fw_offload(vdev);
8778+
8779+
/* unbind the queues and drop the subordinate channel config */
8780+
netdev_unbind_sb_channel(adapter->netdev, vdev);
8781+
netdev_set_sb_channel(vdev, 0);
8782+
87698783
kfree(accel);
87708784

87718785
return 0;
@@ -9769,6 +9783,13 @@ static void *ixgbe_fwd_add(struct net_device *pdev, struct net_device *vdev)
97699783
if (!macvlan_supports_dest_filter(vdev))
97709784
return ERR_PTR(-EMEDIUMTYPE);
97719785

9786+
/* We need to lock down the macvlan to be a single queue device so that
9787+
* we can reuse the tc_to_txq field in the macvlan netdev to represent
9788+
* the queue mapping to our netdev.
9789+
*/
9790+
if (netif_is_multiqueue(vdev))
9791+
return ERR_PTR(-ERANGE);
9792+
97729793
pool = find_first_zero_bit(adapter->fwd_bitmask, adapter->num_rx_pools);
97739794
if (pool == adapter->num_rx_pools) {
97749795
u16 used_pools = adapter->num_vfs + adapter->num_rx_pools;
@@ -9825,6 +9846,7 @@ static void *ixgbe_fwd_add(struct net_device *pdev, struct net_device *vdev)
98259846
return ERR_PTR(-ENOMEM);
98269847

98279848
set_bit(pool, adapter->fwd_bitmask);
9849+
netdev_set_sb_channel(vdev, pool);
98289850
accel->pool = pool;
98299851
accel->netdev = vdev;
98309852

@@ -9866,6 +9888,10 @@ static void ixgbe_fwd_del(struct net_device *pdev, void *priv)
98669888
ring->netdev = NULL;
98679889
}
98689890

9891+
/* unbind the queues and drop the subordinate channel config */
9892+
netdev_unbind_sb_channel(pdev, accel->netdev);
9893+
netdev_set_sb_channel(accel->netdev, 0);
9894+
98699895
clear_bit(accel->pool, adapter->fwd_bitmask);
98709896
kfree(accel);
98719897
}
@@ -10026,7 +10052,6 @@ static const struct net_device_ops ixgbe_netdev_ops = {
1002610052
.ndo_open = ixgbe_open,
1002710053
.ndo_stop = ixgbe_close,
1002810054
.ndo_start_xmit = ixgbe_xmit_frame,
10029-
.ndo_select_queue = ixgbe_select_queue,
1003010055
.ndo_set_rx_mode = ixgbe_set_rx_mode,
1003110056
.ndo_validate_addr = eth_validate_addr,
1003210057
.ndo_set_mac_address = ixgbe_set_mac,
@@ -10049,6 +10074,7 @@ static const struct net_device_ops ixgbe_netdev_ops = {
1004910074
.ndo_poll_controller = ixgbe_netpoll,
1005010075
#endif
1005110076
#ifdef IXGBE_FCOE
10077+
.ndo_select_queue = ixgbe_select_queue,
1005210078
.ndo_fcoe_ddp_setup = ixgbe_fcoe_ddp_get,
1005310079
.ndo_fcoe_ddp_target = ixgbe_fcoe_ddp_target,
1005410080
.ndo_fcoe_ddp_done = ixgbe_fcoe_ddp_put,

drivers/net/ethernet/lantiq_etop.c

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -563,14 +563,6 @@ ltq_etop_set_multicast_list(struct net_device *dev)
563563
spin_unlock_irqrestore(&priv->lock, flags);
564564
}
565565

566-
static u16
567-
ltq_etop_select_queue(struct net_device *dev, struct sk_buff *skb,
568-
void *accel_priv, select_queue_fallback_t fallback)
569-
{
570-
/* we are currently only using the first queue */
571-
return 0;
572-
}
573-
574566
static int
575567
ltq_etop_init(struct net_device *dev)
576568
{
@@ -641,7 +633,7 @@ static const struct net_device_ops ltq_eth_netdev_ops = {
641633
.ndo_set_mac_address = ltq_etop_set_mac_address,
642634
.ndo_validate_addr = eth_validate_addr,
643635
.ndo_set_rx_mode = ltq_etop_set_multicast_list,
644-
.ndo_select_queue = ltq_etop_select_queue,
636+
.ndo_select_queue = dev_pick_tx_zero,
645637
.ndo_init = ltq_etop_init,
646638
.ndo_tx_timeout = ltq_etop_tx_timeout,
647639
};

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -688,15 +688,16 @@ static void build_inline_wqe(struct mlx4_en_tx_desc *tx_desc,
688688
}
689689

690690
u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb,
691-
void *accel_priv, select_queue_fallback_t fallback)
691+
struct net_device *sb_dev,
692+
select_queue_fallback_t fallback)
692693
{
693694
struct mlx4_en_priv *priv = netdev_priv(dev);
694695
u16 rings_p_up = priv->num_tx_rings_p_up;
695696

696697
if (netdev_get_num_tc(dev))
697-
return fallback(dev, skb);
698+
return fallback(dev, skb, NULL);
698699

699-
return fallback(dev, skb) % rings_p_up;
700+
return fallback(dev, skb, NULL) % rings_p_up;
700701
}
701702

702703
static void mlx4_bf_copy(void __iomem *dst, const void *src,

drivers/net/ethernet/mellanox/mlx4/mlx4_en.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,8 @@ void mlx4_en_arm_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq);
699699

700700
void mlx4_en_tx_irq(struct mlx4_cq *mcq);
701701
u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb,
702-
void *accel_priv, select_queue_fallback_t fallback);
702+
struct net_device *sb_dev,
703+
select_queue_fallback_t fallback);
703704
netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev);
704705
netdev_tx_t mlx4_en_xmit_frame(struct mlx4_en_rx_ring *rx_ring,
705706
struct mlx4_en_rx_alloc *frame,

drivers/net/ethernet/mellanox/mlx5/core/en.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -865,7 +865,8 @@ struct mlx5e_profile {
865865
void mlx5e_build_ptys2ethtool_map(void);
866866

867867
u16 mlx5e_select_queue(struct net_device *dev, struct sk_buff *skb,
868-
void *accel_priv, select_queue_fallback_t fallback);
868+
struct net_device *sb_dev,
869+
select_queue_fallback_t fallback);
869870
netdev_tx_t mlx5e_xmit(struct sk_buff *skb, struct net_device *dev);
870871
netdev_tx_t mlx5e_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
871872
struct mlx5e_tx_wqe *wqe, u16 pi);

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,11 @@ static inline int mlx5e_get_dscp_up(struct mlx5e_priv *priv, struct sk_buff *skb
111111
#endif
112112

113113
u16 mlx5e_select_queue(struct net_device *dev, struct sk_buff *skb,
114-
void *accel_priv, select_queue_fallback_t fallback)
114+
struct net_device *sb_dev,
115+
select_queue_fallback_t fallback)
115116
{
116117
struct mlx5e_priv *priv = netdev_priv(dev);
117-
int channel_ix = fallback(dev, skb);
118+
int channel_ix = fallback(dev, skb, NULL);
118119
u16 num_channels;
119120
int up = 0;
120121

drivers/net/ethernet/renesas/ravb_main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1656,7 +1656,8 @@ static netdev_tx_t ravb_start_xmit(struct sk_buff *skb, struct net_device *ndev)
16561656
}
16571657

16581658
static u16 ravb_select_queue(struct net_device *ndev, struct sk_buff *skb,
1659-
void *accel_priv, select_queue_fallback_t fallback)
1659+
struct net_device *sb_dev,
1660+
select_queue_fallback_t fallback)
16601661
{
16611662
/* If skb needs TX timestamp, it is handled in network control queue */
16621663
return (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) ? RAVB_NC :

0 commit comments

Comments
 (0)