Signed-off-by: Jeff Kirsher <[EMAIL PROTECTED]>
Signed-off-by: Jesse Brandeburg <[EMAIL PROTECTED]>
Signed-off-by: John Ronciak <[EMAIL PROTECTED]>
---

 drivers/net/e1000/e1000_main.c |   34 +++++++++++++++++++++-------------
 1 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
index 33e8b45..95cd969 100644
--- a/drivers/net/e1000/e1000_main.c
+++ b/drivers/net/e1000/e1000_main.c
@@ -1920,12 +1920,10 @@ e1000_unmap_and_free_tx_resource(struct 
                                buffer_info->dma,
                                buffer_info->length,
                                PCI_DMA_TODEVICE);
-               buffer_info->dma = 0;
        }
-       if(buffer_info->skb) {
+       if (buffer_info->skb)
                dev_kfree_skb_any(buffer_info->skb);
-               buffer_info->skb = NULL;
-       }
+       memset(buffer_info, 0, sizeof(struct e1000_buffer));
 }
 
 /**
@@ -2044,8 +2042,6 @@ e1000_clean_rx_ring(struct e1000_adapter
        for(i = 0; i < rx_ring->count; i++) {
                buffer_info = &rx_ring->buffer_info[i];
                if(buffer_info->skb) {
-                       ps_page = &rx_ring->ps_page[i];
-                       ps_page_dma = &rx_ring->ps_page_dma[i];
                        pci_unmap_single(pdev,
                                         buffer_info->dma,
                                         buffer_info->length,
@@ -2543,11 +2539,11 @@ e1000_tso(struct e1000_adapter *adapter,
                if (++i == tx_ring->count) i = 0;
                tx_ring->next_to_use = i;
 
-               return 1;
+               return TRUE;
        }
 #endif
 
-       return 0;
+       return FALSE;
 }
 
 static inline boolean_t
@@ -3383,7 +3379,19 @@ e1000_clean(struct net_device *poll_dev,
                        BUG();
        }
 
-       tx_cleaned = e1000_clean_tx_irq(adapter, &adapter->tx_ring[i]);
+       if (likely(adapter->num_tx_queues == 1)) {
+               /* e1000_clean is called per-cpu.  This lock protects
+                * tx_ring[0] from being cleaned by multiple cpus
+                * simultaneously.  A failure obtaining the lock means
+                * tx_ring[0] is currently being cleaned anyway. */
+               if (spin_trylock(&adapter->tx_queue_lock)) {
+                       tx_cleaned = e1000_clean_tx_irq(adapter,
+                                                       &adapter->tx_ring[0]);
+                       spin_unlock(&adapter->tx_queue_lock);
+               }
+       } else
+               tx_cleaned = e1000_clean_tx_irq(adapter, &adapter->tx_ring[i]);
+
        adapter->clean_rx(adapter, &adapter->rx_ring[i],
                          &work_done, work_to_do);
 
@@ -3428,11 +3436,11 @@ e1000_clean_tx_irq(struct e1000_adapter 
                        buffer_info = &tx_ring->buffer_info[i];
                        cleaned = (i == eop);
 
+#ifdef CONFIG_E1000_MQ
+                       tx_ring->tx_stats.bytes += buffer_info->length;
+#endif
                        e1000_unmap_and_free_tx_resource(adapter, buffer_info);
-
-                       tx_desc->buffer_addr = 0;
-                       tx_desc->lower.data = 0;
-                       tx_desc->upper.data = 0;
+                       memset(tx_desc, 0, sizeof(struct e1000_tx_desc));
 
                        if(unlikely(++i == tx_ring->count)) i = 0;
                }

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to