Skip to content

Commit f87d643

Browse files
committed
Merge tag 'net-5.14-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Jakub Kicinski: "Networking fixes, including fixes from bpf, wireless and mac80211 trees. Current release - regressions: - tipc: call tipc_wait_for_connect only when dlen is not 0 - mac80211: fix locking in ieee80211_restart_work() Current release - new code bugs: - bpf: add rcu_read_lock in bpf_get_current_[ancestor_]cgroup_id() - ethernet: ice: fix perout start time rounding - wwan: iosm: prevent underflow in ipc_chnl_cfg_get() Previous releases - regressions: - bpf: clear zext_dst of dead insns - sch_cake: fix srchost/dsthost hashing mode - vrf: reset skb conntrack connection on VRF rcv - net/rds: dma_map_sg is entitled to merge entries Previous releases - always broken: - ethernet: bnxt: fix Tx path locking and races, add Rx path barriers" * tag 'net-5.14-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (42 commits) net: dpaa2-switch: disable the control interface on error path Revert "flow_offload: action should not be NULL when it is referenced" iavf: Fix ping is lost after untrusted VF had tried to change MAC i40e: Fix ATR queue selection r8152: fix the maximum number of PLA bp for RTL8153C r8152: fix writing USB_BP2_EN mptcp: full fully established support after ADD_ADDR mptcp: fix memory leak on address flush net/rds: dma_map_sg is entitled to merge entries net: mscc: ocelot: allow forwarding from bridge ports to the tag_8021q CPU port net: asix: fix uninit value bugs ovs: clear skb->tstamp in forwarding path net: mdio-mux: Handle -EPROBE_DEFER correctly net: mdio-mux: Don't ignore memory allocation errors net: mdio-mux: Delete unnecessary devm_kfree net: dsa: sja1105: fix use-after-free after calling of_find_compatible_node, or worse sch_cake: fix srchost/dsthost hashing mode ixgbe, xsk: clean up the resources in ixgbe_xsk_pool_enable error path net: qlcnic: add missed unlock in qlcnic_83xx_flash_read32 mac80211: fix locking in ieee80211_restart_work() ...
2 parents e649e4c + cd0a719 commit f87d643

File tree

39 files changed

+418
-206
lines changed

39 files changed

+418
-206
lines changed

drivers/net/dsa/sja1105/sja1105_mdio.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -284,8 +284,7 @@ static int sja1105_mdiobus_base_tx_register(struct sja1105_private *priv,
284284
struct mii_bus *bus;
285285
int rc = 0;
286286

287-
np = of_find_compatible_node(mdio_node, NULL,
288-
"nxp,sja1110-base-tx-mdio");
287+
np = of_get_compatible_child(mdio_node, "nxp,sja1110-base-tx-mdio");
289288
if (!np)
290289
return 0;
291290

@@ -339,8 +338,7 @@ static int sja1105_mdiobus_base_t1_register(struct sja1105_private *priv,
339338
struct mii_bus *bus;
340339
int rc = 0;
341340

342-
np = of_find_compatible_node(mdio_node, NULL,
343-
"nxp,sja1110-base-t1-mdio");
341+
np = of_get_compatible_child(mdio_node, "nxp,sja1110-base-t1-mdio");
344342
if (!np)
345343
return 0;
346344

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

Lines changed: 76 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@
7272
#include "bnxt_debugfs.h"
7373

7474
#define BNXT_TX_TIMEOUT (5 * HZ)
75-
#define BNXT_DEF_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_HW)
75+
#define BNXT_DEF_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_HW | \
76+
NETIF_MSG_TX_ERR)
7677

7778
MODULE_LICENSE("GPL");
7879
MODULE_DESCRIPTION("Broadcom BCM573xx network driver");
@@ -365,6 +366,33 @@ static u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb)
365366
return md_dst->u.port_info.port_id;
366367
}
367368

369+
static void bnxt_txr_db_kick(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
370+
u16 prod)
371+
{
372+
bnxt_db_write(bp, &txr->tx_db, prod);
373+
txr->kick_pending = 0;
374+
}
375+
376+
static bool bnxt_txr_netif_try_stop_queue(struct bnxt *bp,
377+
struct bnxt_tx_ring_info *txr,
378+
struct netdev_queue *txq)
379+
{
380+
netif_tx_stop_queue(txq);
381+
382+
/* netif_tx_stop_queue() must be done before checking
383+
* tx index in bnxt_tx_avail() below, because in
384+
* bnxt_tx_int(), we update tx index before checking for
385+
* netif_tx_queue_stopped().
386+
*/
387+
smp_mb();
388+
if (bnxt_tx_avail(bp, txr) > bp->tx_wake_thresh) {
389+
netif_tx_wake_queue(txq);
390+
return false;
391+
}
392+
393+
return true;
394+
}
395+
368396
static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
369397
{
370398
struct bnxt *bp = netdev_priv(dev);
@@ -384,6 +412,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
384412
i = skb_get_queue_mapping(skb);
385413
if (unlikely(i >= bp->tx_nr_rings)) {
386414
dev_kfree_skb_any(skb);
415+
atomic_long_inc(&dev->tx_dropped);
387416
return NETDEV_TX_OK;
388417
}
389418

@@ -393,8 +422,12 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
393422

394423
free_size = bnxt_tx_avail(bp, txr);
395424
if (unlikely(free_size < skb_shinfo(skb)->nr_frags + 2)) {
396-
netif_tx_stop_queue(txq);
397-
return NETDEV_TX_BUSY;
425+
/* We must have raced with NAPI cleanup */
426+
if (net_ratelimit() && txr->kick_pending)
427+
netif_warn(bp, tx_err, dev,
428+
"bnxt: ring busy w/ flush pending!\n");
429+
if (bnxt_txr_netif_try_stop_queue(bp, txr, txq))
430+
return NETDEV_TX_BUSY;
398431
}
399432

400433
length = skb->len;
@@ -517,21 +550,16 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
517550
normal_tx:
518551
if (length < BNXT_MIN_PKT_SIZE) {
519552
pad = BNXT_MIN_PKT_SIZE - length;
520-
if (skb_pad(skb, pad)) {
553+
if (skb_pad(skb, pad))
521554
/* SKB already freed. */
522-
tx_buf->skb = NULL;
523-
return NETDEV_TX_OK;
524-
}
555+
goto tx_kick_pending;
525556
length = BNXT_MIN_PKT_SIZE;
526557
}
527558

528559
mapping = dma_map_single(&pdev->dev, skb->data, len, DMA_TO_DEVICE);
529560

530-
if (unlikely(dma_mapping_error(&pdev->dev, mapping))) {
531-
dev_kfree_skb_any(skb);
532-
tx_buf->skb = NULL;
533-
return NETDEV_TX_OK;
534-
}
561+
if (unlikely(dma_mapping_error(&pdev->dev, mapping)))
562+
goto tx_free;
535563

536564
dma_unmap_addr_set(tx_buf, mapping, mapping);
537565
flags = (len << TX_BD_LEN_SHIFT) | TX_BD_TYPE_LONG_TX_BD |
@@ -618,24 +646,17 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
618646
txr->tx_prod = prod;
619647

620648
if (!netdev_xmit_more() || netif_xmit_stopped(txq))
621-
bnxt_db_write(bp, &txr->tx_db, prod);
649+
bnxt_txr_db_kick(bp, txr, prod);
650+
else
651+
txr->kick_pending = 1;
622652

623653
tx_done:
624654

625655
if (unlikely(bnxt_tx_avail(bp, txr) <= MAX_SKB_FRAGS + 1)) {
626656
if (netdev_xmit_more() && !tx_buf->is_push)
627-
bnxt_db_write(bp, &txr->tx_db, prod);
628-
629-
netif_tx_stop_queue(txq);
657+
bnxt_txr_db_kick(bp, txr, prod);
630658

631-
/* netif_tx_stop_queue() must be done before checking
632-
* tx index in bnxt_tx_avail() below, because in
633-
* bnxt_tx_int(), we update tx index before checking for
634-
* netif_tx_queue_stopped().
635-
*/
636-
smp_mb();
637-
if (bnxt_tx_avail(bp, txr) > bp->tx_wake_thresh)
638-
netif_tx_wake_queue(txq);
659+
bnxt_txr_netif_try_stop_queue(bp, txr, txq);
639660
}
640661
return NETDEV_TX_OK;
641662

@@ -648,7 +669,6 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
648669
/* start back at beginning and unmap skb */
649670
prod = txr->tx_prod;
650671
tx_buf = &txr->tx_buf_ring[prod];
651-
tx_buf->skb = NULL;
652672
dma_unmap_single(&pdev->dev, dma_unmap_addr(tx_buf, mapping),
653673
skb_headlen(skb), PCI_DMA_TODEVICE);
654674
prod = NEXT_TX(prod);
@@ -662,7 +682,13 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
662682
PCI_DMA_TODEVICE);
663683
}
664684

685+
tx_free:
665686
dev_kfree_skb_any(skb);
687+
tx_kick_pending:
688+
if (txr->kick_pending)
689+
bnxt_txr_db_kick(bp, txr, txr->tx_prod);
690+
txr->tx_buf_ring[txr->tx_prod].skb = NULL;
691+
atomic_long_inc(&dev->tx_dropped);
666692
return NETDEV_TX_OK;
667693
}
668694

@@ -732,14 +758,9 @@ static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int nr_pkts)
732758
smp_mb();
733759

734760
if (unlikely(netif_tx_queue_stopped(txq)) &&
735-
(bnxt_tx_avail(bp, txr) > bp->tx_wake_thresh)) {
736-
__netif_tx_lock(txq, smp_processor_id());
737-
if (netif_tx_queue_stopped(txq) &&
738-
bnxt_tx_avail(bp, txr) > bp->tx_wake_thresh &&
739-
txr->dev_state != BNXT_DEV_STATE_CLOSING)
740-
netif_tx_wake_queue(txq);
741-
__netif_tx_unlock(txq);
742-
}
761+
bnxt_tx_avail(bp, txr) > bp->tx_wake_thresh &&
762+
READ_ONCE(txr->dev_state) != BNXT_DEV_STATE_CLOSING)
763+
netif_tx_wake_queue(txq);
743764
}
744765

745766
static struct page *__bnxt_alloc_rx_page(struct bnxt *bp, dma_addr_t *mapping,
@@ -1767,6 +1788,10 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
17671788
if (!RX_CMP_VALID(rxcmp1, tmp_raw_cons))
17681789
return -EBUSY;
17691790

1791+
/* The valid test of the entry must be done first before
1792+
* reading any further.
1793+
*/
1794+
dma_rmb();
17701795
prod = rxr->rx_prod;
17711796

17721797
if (cmp_type == CMP_TYPE_RX_L2_TPA_START_CMP) {
@@ -1989,6 +2014,10 @@ static int bnxt_force_rx_discard(struct bnxt *bp,
19892014
if (!RX_CMP_VALID(rxcmp1, tmp_raw_cons))
19902015
return -EBUSY;
19912016

2017+
/* The valid test of the entry must be done first before
2018+
* reading any further.
2019+
*/
2020+
dma_rmb();
19922021
cmp_type = RX_CMP_TYPE(rxcmp);
19932022
if (cmp_type == CMP_TYPE_RX_L2_CMP) {
19942023
rxcmp1->rx_cmp_cfa_code_errors_v2 |=
@@ -2454,6 +2483,10 @@ static int bnxt_poll_nitroa0(struct napi_struct *napi, int budget)
24542483
if (!TX_CMP_VALID(txcmp, raw_cons))
24552484
break;
24562485

2486+
/* The valid test of the entry must be done first before
2487+
* reading any further.
2488+
*/
2489+
dma_rmb();
24572490
if ((TX_CMP_TYPE(txcmp) & 0x30) == 0x10) {
24582491
tmp_raw_cons = NEXT_RAW_CMP(raw_cons);
24592492
cp_cons = RING_CMP(tmp_raw_cons);
@@ -9128,10 +9161,9 @@ static void bnxt_disable_napi(struct bnxt *bp)
91289161
for (i = 0; i < bp->cp_nr_rings; i++) {
91299162
struct bnxt_cp_ring_info *cpr = &bp->bnapi[i]->cp_ring;
91309163

9164+
napi_disable(&bp->bnapi[i]->napi);
91319165
if (bp->bnapi[i]->rx_ring)
91329166
cancel_work_sync(&cpr->dim.work);
9133-
9134-
napi_disable(&bp->bnapi[i]->napi);
91359167
}
91369168
}
91379169

@@ -9165,9 +9197,11 @@ void bnxt_tx_disable(struct bnxt *bp)
91659197
if (bp->tx_ring) {
91669198
for (i = 0; i < bp->tx_nr_rings; i++) {
91679199
txr = &bp->tx_ring[i];
9168-
txr->dev_state = BNXT_DEV_STATE_CLOSING;
9200+
WRITE_ONCE(txr->dev_state, BNXT_DEV_STATE_CLOSING);
91699201
}
91709202
}
9203+
/* Make sure napi polls see @dev_state change */
9204+
synchronize_net();
91719205
/* Drop carrier first to prevent TX timeout */
91729206
netif_carrier_off(bp->dev);
91739207
/* Stop all TX queues */
@@ -9181,8 +9215,10 @@ void bnxt_tx_enable(struct bnxt *bp)
91819215

91829216
for (i = 0; i < bp->tx_nr_rings; i++) {
91839217
txr = &bp->tx_ring[i];
9184-
txr->dev_state = 0;
9218+
WRITE_ONCE(txr->dev_state, 0);
91859219
}
9220+
/* Make sure napi polls see @dev_state change */
9221+
synchronize_net();
91869222
netif_tx_wake_all_queues(bp->dev);
91879223
if (bp->link_info.link_up)
91889224
netif_carrier_on(bp->dev);
@@ -10768,6 +10804,9 @@ static bool bnxt_rfs_supported(struct bnxt *bp)
1076810804
return true;
1076910805
return false;
1077010806
}
10807+
/* 212 firmware is broken for aRFS */
10808+
if (BNXT_FW_MAJ(bp) == 212)
10809+
return false;
1077110810
if (BNXT_PF(bp) && !BNXT_CHIP_TYPE_NITRO_A0(bp))
1077210811
return true;
1077310812
if (bp->flags & BNXT_FLAG_NEW_RSS_CAP)

drivers/net/ethernet/broadcom/bnxt/bnxt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,7 @@ struct bnxt_tx_ring_info {
786786
u16 tx_prod;
787787
u16 tx_cons;
788788
u16 txq_index;
789+
u8 kick_pending;
789790
struct bnxt_db_info tx_db;
790791

791792
struct tx_bd *tx_desc_ring[MAX_TX_PAGES];

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

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3038,26 +3038,30 @@ static int dpaa2_switch_port_init(struct ethsw_port_priv *port_priv, u16 port)
30383038
return err;
30393039
}
30403040

3041-
static void dpaa2_switch_takedown(struct fsl_mc_device *sw_dev)
3041+
static void dpaa2_switch_ctrl_if_teardown(struct ethsw_core *ethsw)
3042+
{
3043+
dpsw_ctrl_if_disable(ethsw->mc_io, 0, ethsw->dpsw_handle);
3044+
dpaa2_switch_free_dpio(ethsw);
3045+
dpaa2_switch_destroy_rings(ethsw);
3046+
dpaa2_switch_drain_bp(ethsw);
3047+
dpaa2_switch_free_dpbp(ethsw);
3048+
}
3049+
3050+
static void dpaa2_switch_teardown(struct fsl_mc_device *sw_dev)
30423051
{
30433052
struct device *dev = &sw_dev->dev;
30443053
struct ethsw_core *ethsw = dev_get_drvdata(dev);
30453054
int err;
30463055

3056+
dpaa2_switch_ctrl_if_teardown(ethsw);
3057+
3058+
destroy_workqueue(ethsw->workqueue);
3059+
30473060
err = dpsw_close(ethsw->mc_io, 0, ethsw->dpsw_handle);
30483061
if (err)
30493062
dev_warn(dev, "dpsw_close err %d\n", err);
30503063
}
30513064

3052-
static void dpaa2_switch_ctrl_if_teardown(struct ethsw_core *ethsw)
3053-
{
3054-
dpsw_ctrl_if_disable(ethsw->mc_io, 0, ethsw->dpsw_handle);
3055-
dpaa2_switch_free_dpio(ethsw);
3056-
dpaa2_switch_destroy_rings(ethsw);
3057-
dpaa2_switch_drain_bp(ethsw);
3058-
dpaa2_switch_free_dpbp(ethsw);
3059-
}
3060-
30613065
static int dpaa2_switch_remove(struct fsl_mc_device *sw_dev)
30623066
{
30633067
struct ethsw_port_priv *port_priv;
@@ -3068,8 +3072,6 @@ static int dpaa2_switch_remove(struct fsl_mc_device *sw_dev)
30683072
dev = &sw_dev->dev;
30693073
ethsw = dev_get_drvdata(dev);
30703074

3071-
dpaa2_switch_ctrl_if_teardown(ethsw);
3072-
30733075
dpaa2_switch_teardown_irqs(sw_dev);
30743076

30753077
dpsw_disable(ethsw->mc_io, 0, ethsw->dpsw_handle);
@@ -3084,9 +3086,7 @@ static int dpaa2_switch_remove(struct fsl_mc_device *sw_dev)
30843086
kfree(ethsw->acls);
30853087
kfree(ethsw->ports);
30863088

3087-
dpaa2_switch_takedown(sw_dev);
3088-
3089-
destroy_workqueue(ethsw->workqueue);
3089+
dpaa2_switch_teardown(sw_dev);
30903090

30913091
fsl_mc_portal_free(ethsw->mc_io);
30923092

@@ -3199,7 +3199,7 @@ static int dpaa2_switch_probe(struct fsl_mc_device *sw_dev)
31993199
GFP_KERNEL);
32003200
if (!(ethsw->ports)) {
32013201
err = -ENOMEM;
3202-
goto err_takedown;
3202+
goto err_teardown;
32033203
}
32043204

32053205
ethsw->fdbs = kcalloc(ethsw->sw_attr.num_ifs, sizeof(*ethsw->fdbs),
@@ -3270,8 +3270,8 @@ static int dpaa2_switch_probe(struct fsl_mc_device *sw_dev)
32703270
err_free_ports:
32713271
kfree(ethsw->ports);
32723272

3273-
err_takedown:
3274-
dpaa2_switch_takedown(sw_dev);
3273+
err_teardown:
3274+
dpaa2_switch_teardown(sw_dev);
32753275

32763276
err_free_cmdport:
32773277
fsl_mc_portal_free(ethsw->mc_io);

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3663,8 +3663,7 @@ u16 i40e_lan_select_queue(struct net_device *netdev,
36633663

36643664
/* is DCB enabled at all? */
36653665
if (vsi->tc_config.numtc == 1)
3666-
return i40e_swdcb_skb_tx_hash(netdev, skb,
3667-
netdev->real_num_tx_queues);
3666+
return netdev_pick_tx(netdev, skb, sb_dev);
36683667

36693668
prio = skb->priority;
36703669
hw = &vsi->back->hw;

drivers/net/ethernet/intel/iavf/iavf.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ struct iavf_q_vector {
136136
struct iavf_mac_filter {
137137
struct list_head list;
138138
u8 macaddr[ETH_ALEN];
139+
bool is_new_mac; /* filter is new, wait for PF decision */
139140
bool remove; /* filter needs to be removed */
140141
bool add; /* filter needs to be added */
141142
};

drivers/net/ethernet/intel/iavf/iavf_main.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -751,6 +751,7 @@ struct iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter,
751751

752752
list_add_tail(&f->list, &adapter->mac_filter_list);
753753
f->add = true;
754+
f->is_new_mac = true;
754755
adapter->aq_required |= IAVF_FLAG_AQ_ADD_MAC_FILTER;
755756
} else {
756757
f->remove = false;

0 commit comments

Comments
 (0)