ibmvnic: Move queue restarting in ibmvnic_tx_complete
authorNathan Fontenot <nfont@linux.vnet.ibm.com>
Wed, 3 May 2017 18:05:25 +0000 (14:05 -0400)
committerDavid S. Miller <davem@davemloft.net>
Wed, 3 May 2017 15:33:06 +0000 (11:33 -0400)
Restart of the subqueue should occur outside of the loop processing
any tx buffers instead of doing this in the middle of the loop.

Signed-off-by: Nathan Fontenot <nfont@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ibm/ibmvnic.c

index 1b6268ce7b0d5f89100c9e446096493ffacbb805..4f2d329dba998308eeb2ddaed52733cb3059f605 100644 (file)
@@ -1809,19 +1809,8 @@ restart_loop:
                        }
 
                        if (txbuff->last_frag) {
-                               if (atomic_sub_return(next->tx_comp.num_comps,
-                                                     &scrq->used) <=
-                                   (adapter->req_tx_entries_per_subcrq / 2) &&
-                                   netif_subqueue_stopped(adapter->netdev,
-                                                          txbuff->skb)) {
-                                       netif_wake_subqueue(adapter->netdev,
-                                                           scrq->pool_index);
-                                       netdev_dbg(adapter->netdev,
-                                                  "Started queue %d\n",
-                                                  scrq->pool_index);
-                               }
-
                                dev_kfree_skb_any(txbuff->skb);
+                               txbuff->skb = NULL;
                        }
 
                        adapter->tx_pool[pool].free_map[adapter->tx_pool[pool].
@@ -1832,6 +1821,15 @@ restart_loop:
                }
                /* remove tx_comp scrq*/
                next->tx_comp.first = 0;
+
+               if (atomic_sub_return(next->tx_comp.num_comps, &scrq->used) <=
+                   (adapter->req_tx_entries_per_subcrq / 2) &&
+                   __netif_subqueue_stopped(adapter->netdev,
+                                            scrq->pool_index)) {
+                       netif_wake_subqueue(adapter->netdev, scrq->pool_index);
+                       netdev_info(adapter->netdev, "Started queue %d\n",
+                                   scrq->pool_index);
+               }
        }
 
        enable_scrq_irq(adapter, scrq);