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 <nf...@linux.vnet.ibm.com>
---

v2: Use __netif_subqueue_stopped() instead of netif_subqueue_stopped()
to avoid possible using un-initialized skb variable.
---
 drivers/net/ethernet/ibm/ibmvnic.c |   22 ++++++++++------------
 1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c 
b/drivers/net/ethernet/ibm/ibmvnic.c
index 4a2b99f..4c5de60 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -1809,19 +1809,8 @@ static int ibmvnic_complete_tx(struct ibmvnic_adapter 
*adapter,
                        }
 
                        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 @@ static int ibmvnic_complete_tx(struct ibmvnic_adapter 
*adapter,
                }
                /* 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);

Reply via email to