Commit 02df6cfa authored by Olof Johansson's avatar Olof Johansson Committed by David S. Miller

pasemi_mac: Batch up TX buffer frees

Postpone pci unmap and skb free of the transmitted buffers to outside of
the tx ring lock, batching them up 32 at a time.

Also increase the count threshold to 128.
Signed-off-by: default avatarOlof Johansson <olof@lixom.net>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 26fcfa95
...@@ -551,37 +551,56 @@ static int pasemi_mac_clean_tx(struct pasemi_mac *mac) ...@@ -551,37 +551,56 @@ static int pasemi_mac_clean_tx(struct pasemi_mac *mac)
int i; int i;
struct pasemi_mac_buffer *info; struct pasemi_mac_buffer *info;
struct pas_dma_xct_descr *dp; struct pas_dma_xct_descr *dp;
int start, count; unsigned int start, count, limit;
unsigned int total_count;
int flags; int flags;
struct sk_buff *skbs[32];
dma_addr_t dmas[32];
total_count = 0;
restart:
spin_lock_irqsave(&mac->tx->lock, flags); spin_lock_irqsave(&mac->tx->lock, flags);
start = mac->tx->next_to_clean; start = mac->tx->next_to_clean;
limit = min(mac->tx->next_to_use, start+32);
count = 0; count = 0;
for (i = start; i < mac->tx->next_to_use; i++) { for (i = start; i < limit; i++) {
dp = &TX_DESC(mac, i); dp = &TX_DESC(mac, i);
if (unlikely(dp->mactx & XCT_MACTX_O)) if (unlikely(dp->mactx & XCT_MACTX_O))
/* Not yet transmitted */
break; break;
count++;
info = &TX_DESC_INFO(mac, i); info = &TX_DESC_INFO(mac, i);
skbs[count] = info->skb;
pci_unmap_single(mac->dma_pdev, info->dma, dmas[count] = info->dma;
info->skb->len, PCI_DMA_TODEVICE);
dev_kfree_skb_irq(info->skb);
info->skb = NULL; info->skb = NULL;
info->dma = 0; info->dma = 0;
dp->mactx = 0; dp->mactx = 0;
dp->ptr = 0; dp->ptr = 0;
count++;
} }
mac->tx->next_to_clean += count; mac->tx->next_to_clean += count;
spin_unlock_irqrestore(&mac->tx->lock, flags); spin_unlock_irqrestore(&mac->tx->lock, flags);
netif_wake_queue(mac->netdev); netif_wake_queue(mac->netdev);
return count; for (i = 0; i < count; i++) {
pci_unmap_single(mac->dma_pdev, dmas[i],
skbs[i]->len, PCI_DMA_TODEVICE);
dev_kfree_skb_irq(skbs[i]);
}
total_count += count;
/* If the batch was full, try to clean more */
if (count == 32)
goto restart;
return total_count;
} }
...@@ -777,7 +796,7 @@ static int pasemi_mac_open(struct net_device *dev) ...@@ -777,7 +796,7 @@ static int pasemi_mac_open(struct net_device *dev)
PAS_IOB_DMA_RXCH_CFG_CNTTH(0)); PAS_IOB_DMA_RXCH_CFG_CNTTH(0));
write_iob_reg(mac, PAS_IOB_DMA_TXCH_CFG(mac->dma_txch), write_iob_reg(mac, PAS_IOB_DMA_TXCH_CFG(mac->dma_txch),
PAS_IOB_DMA_TXCH_CFG_CNTTH(32)); PAS_IOB_DMA_TXCH_CFG_CNTTH(128));
/* Clear out any residual packet count state from firmware */ /* Clear out any residual packet count state from firmware */
pasemi_mac_restart_rx_intr(mac); pasemi_mac_restart_rx_intr(mac);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment