Skip to content

Commit

Permalink
net: thunderx: Fix crash when changing rss with mutliple traffic flows
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sunil Goutham authored and David S. Miller committed Jul 30, 2015
1 parent 3d7a8aa commit b49087d
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions drivers/net/ethernet/cavium/thunder/nicvf_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ static void nicvf_handle_mbx_intr(struct nicvf *nic)
nic->duplex == DUPLEX_FULL ?
"Full duplex" : "Half duplex");
netif_carrier_on(nic->netdev);
netif_tx_wake_all_queues(nic->netdev);
netif_tx_start_all_queues(nic->netdev);
} else {
netdev_info(nic->netdev, "%s: Link is Down\n",
nic->netdev->name);
Expand Down Expand Up @@ -551,7 +551,7 @@ static int nicvf_cq_intr_handler(struct net_device *netdev, u8 cq_idx,
if (tx_done) {
txq = netdev_get_tx_queue(netdev, cq_idx);
if (netif_tx_queue_stopped(txq)) {
netif_tx_wake_queue(txq);
netif_tx_start_queue(txq);
nic->drv_stats.txq_wake++;
if (netif_msg_tx_err(nic))
netdev_warn(netdev,
Expand Down Expand Up @@ -845,7 +845,7 @@ static netdev_tx_t nicvf_xmit(struct sk_buff *skb, struct net_device *netdev)
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);
nic->drv_stats.txq_stop++;
if (netif_msg_tx_err(nic))
Expand All @@ -871,7 +871,6 @@ int nicvf_stop(struct net_device *netdev)
nicvf_send_msg_to_pf(nic, &mbx);

netif_carrier_off(netdev);
netif_tx_disable(netdev);

/* Disable RBDR & QS error interrupts */
for (qidx = 0; qidx < qs->rbdr_cnt; qidx++) {
Expand Down Expand Up @@ -906,6 +905,8 @@ int nicvf_stop(struct net_device *netdev)
kfree(cq_poll);
}

netif_tx_disable(netdev);

/* Free resources */
nicvf_config_data_transfer(nic, false);

Expand Down

0 comments on commit b49087d

Please sign in to comment.