mirror of
https://github.com/torvalds/linux.git
synced 2024-12-04 18:13:04 +00:00
net: thunderx: Fix crash when changing rss with mutliple traffic flows
This fixes a crash when changing rss with multiple traffic flows. While interface teardown, disable tx queues after all NAPI threads are done. If done otherwise tx queues might be woken up inside NAPI if any CQE_TX are processed. Signed-off-by: Sunil Goutham <sgoutham@cavium.com> Signed-off-by: Aleksey Makarov <aleksey.makarov@caviumnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3d7a8aaad8
commit
b49087dd0f
@ -234,7 +234,7 @@ static void nicvf_handle_mbx_intr(struct nicvf *nic)
|
|||||||
nic->duplex == DUPLEX_FULL ?
|
nic->duplex == DUPLEX_FULL ?
|
||||||
"Full duplex" : "Half duplex");
|
"Full duplex" : "Half duplex");
|
||||||
netif_carrier_on(nic->netdev);
|
netif_carrier_on(nic->netdev);
|
||||||
netif_tx_wake_all_queues(nic->netdev);
|
netif_tx_start_all_queues(nic->netdev);
|
||||||
} else {
|
} else {
|
||||||
netdev_info(nic->netdev, "%s: Link is Down\n",
|
netdev_info(nic->netdev, "%s: Link is Down\n",
|
||||||
nic->netdev->name);
|
nic->netdev->name);
|
||||||
@ -551,7 +551,7 @@ done:
|
|||||||
if (tx_done) {
|
if (tx_done) {
|
||||||
txq = netdev_get_tx_queue(netdev, cq_idx);
|
txq = netdev_get_tx_queue(netdev, cq_idx);
|
||||||
if (netif_tx_queue_stopped(txq)) {
|
if (netif_tx_queue_stopped(txq)) {
|
||||||
netif_tx_wake_queue(txq);
|
netif_tx_start_queue(txq);
|
||||||
nic->drv_stats.txq_wake++;
|
nic->drv_stats.txq_wake++;
|
||||||
if (netif_msg_tx_err(nic))
|
if (netif_msg_tx_err(nic))
|
||||||
netdev_warn(netdev,
|
netdev_warn(netdev,
|
||||||
@ -845,7 +845,7 @@ static netdev_tx_t nicvf_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|||||||
return NETDEV_TX_OK;
|
return NETDEV_TX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!nicvf_sq_append_skb(nic, skb) && !netif_tx_queue_stopped(txq)) {
|
if (!netif_tx_queue_stopped(txq) && !nicvf_sq_append_skb(nic, skb)) {
|
||||||
netif_tx_stop_queue(txq);
|
netif_tx_stop_queue(txq);
|
||||||
nic->drv_stats.txq_stop++;
|
nic->drv_stats.txq_stop++;
|
||||||
if (netif_msg_tx_err(nic))
|
if (netif_msg_tx_err(nic))
|
||||||
@ -871,7 +871,6 @@ int nicvf_stop(struct net_device *netdev)
|
|||||||
nicvf_send_msg_to_pf(nic, &mbx);
|
nicvf_send_msg_to_pf(nic, &mbx);
|
||||||
|
|
||||||
netif_carrier_off(netdev);
|
netif_carrier_off(netdev);
|
||||||
netif_tx_disable(netdev);
|
|
||||||
|
|
||||||
/* Disable RBDR & QS error interrupts */
|
/* Disable RBDR & QS error interrupts */
|
||||||
for (qidx = 0; qidx < qs->rbdr_cnt; qidx++) {
|
for (qidx = 0; qidx < qs->rbdr_cnt; qidx++) {
|
||||||
@ -906,6 +905,8 @@ int nicvf_stop(struct net_device *netdev)
|
|||||||
kfree(cq_poll);
|
kfree(cq_poll);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
netif_tx_disable(netdev);
|
||||||
|
|
||||||
/* Free resources */
|
/* Free resources */
|
||||||
nicvf_config_data_transfer(nic, false);
|
nicvf_config_data_transfer(nic, false);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user