]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/net/octeon/octeon_mgmt.c
netdev: octeon_mgmt: Fix race condition freeing TX buffers.
[net-next-2.6.git] / drivers / net / octeon / octeon_mgmt.c
index bbbd737210f9d0a1c541c0974ddadcee7c93d554..b975a2fad9530ff8dad979213d36d8e924fb49f0 100644 (file)
@@ -189,12 +189,19 @@ static void octeon_mgmt_clean_tx_buffers(struct octeon_mgmt *p)
 
        mix_orcnt.u64 = cvmx_read_csr(CVMX_MIXX_ORCNT(port));
        while (mix_orcnt.s.orcnt) {
+               spin_lock_irqsave(&p->tx_list.lock, flags);
+
+               mix_orcnt.u64 = cvmx_read_csr(CVMX_MIXX_ORCNT(port));
+
+               if (mix_orcnt.s.orcnt == 0) {
+                       spin_unlock_irqrestore(&p->tx_list.lock, flags);
+                       break;
+               }
+
                dma_sync_single_for_cpu(p->dev, p->tx_ring_handle,
                                        ring_size_to_bytes(OCTEON_MGMT_TX_RING_SIZE),
                                        DMA_BIDIRECTIONAL);
 
-               spin_lock_irqsave(&p->tx_list.lock, flags);
-
                re.d64 = p->tx_ring[p->tx_next_clean];
                p->tx_next_clean =
                        (p->tx_next_clean + 1) % OCTEON_MGMT_TX_RING_SIZE;