Skip to content

Commit 3822d06

Browse files
chelsiocudbgdavem330
authored andcommitted
cxgb4: avoid link re-train during TC-MQPRIO configuration
When configuring TC-MQPRIO offload, only turn off netdev carrier and don't bring physical link down in hardware. Otherwise, when the physical link is brought up again after configuration, it gets re-trained and stalls ongoing traffic. Also, when firmware is no longer accessible or crashed, avoid sending FLOWC and waiting for reply that will never come. Fix following hung_task_timeout_secs trace seen in these cases. INFO: task tc:20807 blocked for more than 122 seconds. Tainted: G S 5.13.0-rc3+ #122 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. task:tc state:D stack:14768 pid:20807 ppid: 19366 flags:0x00000000 Call Trace: __schedule+0x27b/0x6a0 schedule+0x37/0xa0 schedule_preempt_disabled+0x5/0x10 __mutex_lock.isra.14+0x2a0/0x4a0 ? netlink_lookup+0x120/0x1a0 ? rtnl_fill_ifinfo+0x10f0/0x10f0 __netlink_dump_start+0x70/0x250 rtnetlink_rcv_msg+0x28b/0x380 ? rtnl_fill_ifinfo+0x10f0/0x10f0 ? rtnl_calcit.isra.42+0x120/0x120 netlink_rcv_skb+0x4b/0xf0 netlink_unicast+0x1a0/0x280 netlink_sendmsg+0x216/0x440 sock_sendmsg+0x56/0x60 __sys_sendto+0xe9/0x150 ? handle_mm_fault+0x6d/0x1b0 ? do_user_addr_fault+0x1c5/0x620 __x64_sys_sendto+0x1f/0x30 do_syscall_64+0x3c/0x80 entry_SYSCALL_64_after_hwframe+0x44/0xae RIP: 0033:0x7f7f73218321 RSP: 002b:00007ffd19626208 EFLAGS: 00000246 ORIG_RAX: 000000000000002c RAX: ffffffffffffffda RBX: 000055b7c0a8b240 RCX: 00007f7f73218321 RDX: 0000000000000028 RSI: 00007ffd19626210 RDI: 0000000000000003 RBP: 000055b7c08680ff R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 000055b7c085f5f6 R13: 000055b7c085f60a R14: 00007ffd19636470 R15: 00007ffd196262a0 Fixes: b1396c2 ("cxgb4: parse and configure TC-MQPRIO offload") Signed-off-by: Rahul Lakkireddy <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 944d671 commit 3822d06

File tree

4 files changed

+14
-7
lines changed

4 files changed

+14
-7
lines changed

drivers/net/ethernet/chelsio/cxgb4/cxgb4.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2177,8 +2177,6 @@ int cxgb4_update_mac_filt(struct port_info *pi, unsigned int viid,
21772177
bool persistent, u8 *smt_idx);
21782178
int cxgb4_get_msix_idx_from_bmap(struct adapter *adap);
21792179
void cxgb4_free_msix_idx_in_bmap(struct adapter *adap, u32 msix_idx);
2180-
int cxgb_open(struct net_device *dev);
2181-
int cxgb_close(struct net_device *dev);
21822180
void cxgb4_enable_rx(struct adapter *adap, struct sge_rspq *q);
21832181
void cxgb4_quiesce_rx(struct sge_rspq *q);
21842182
int cxgb4_port_mirror_alloc(struct net_device *dev);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2834,7 +2834,7 @@ static void cxgb_down(struct adapter *adapter)
28342834
/*
28352835
* net_device operations
28362836
*/
2837-
int cxgb_open(struct net_device *dev)
2837+
static int cxgb_open(struct net_device *dev)
28382838
{
28392839
struct port_info *pi = netdev_priv(dev);
28402840
struct adapter *adapter = pi->adapter;
@@ -2882,7 +2882,7 @@ int cxgb_open(struct net_device *dev)
28822882
return err;
28832883
}
28842884

2885-
int cxgb_close(struct net_device *dev)
2885+
static int cxgb_close(struct net_device *dev)
28862886
{
28872887
struct port_info *pi = netdev_priv(dev);
28882888
struct adapter *adapter = pi->adapter;

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,8 @@ int cxgb4_setup_tc_mqprio(struct net_device *dev,
589589
* down before configuring tc params.
590590
*/
591591
if (netif_running(dev)) {
592-
cxgb_close(dev);
592+
netif_tx_stop_all_queues(dev);
593+
netif_carrier_off(dev);
593594
needs_bring_up = true;
594595
}
595596

@@ -615,8 +616,10 @@ int cxgb4_setup_tc_mqprio(struct net_device *dev,
615616
}
616617

617618
out:
618-
if (needs_bring_up)
619-
cxgb_open(dev);
619+
if (needs_bring_up) {
620+
netif_tx_start_all_queues(dev);
621+
netif_carrier_on(dev);
622+
}
620623

621624
mutex_unlock(&adap->tc_mqprio->mqprio_mutex);
622625
return ret;

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2556,6 +2556,12 @@ int cxgb4_ethofld_send_flowc(struct net_device *dev, u32 eotid, u32 tc)
25562556
if (!eosw_txq)
25572557
return -ENOMEM;
25582558

2559+
if (!(adap->flags & CXGB4_FW_OK)) {
2560+
/* Don't stall caller when access to FW is lost */
2561+
complete(&eosw_txq->completion);
2562+
return -EIO;
2563+
}
2564+
25592565
skb = alloc_skb(len, GFP_KERNEL);
25602566
if (!skb)
25612567
return -ENOMEM;

0 commit comments

Comments
 (0)