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: Olof Johansson <olof@lixom.net>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
Olof Johansson 2007-08-22 09:13:03 -05:00 committed by David S. Miller
parent 26fcfa95ae
commit 02df6cfa09

View File

@ -551,37 +551,56 @@ static int pasemi_mac_clean_tx(struct pasemi_mac *mac)
int i;
struct pasemi_mac_buffer *info;
struct pas_dma_xct_descr *dp;
int start, count;
unsigned int start, count, limit;
unsigned int total_count;
int flags;
struct sk_buff *skbs[32];
dma_addr_t dmas[32];
total_count = 0;
restart:
spin_lock_irqsave(&mac->tx->lock, flags);
start = mac->tx->next_to_clean;
limit = min(mac->tx->next_to_use, start+32);
count = 0;
for (i = start; i < mac->tx->next_to_use; i++) {
for (i = start; i < limit; i++) {
dp = &TX_DESC(mac, i);
if (unlikely(dp->mactx & XCT_MACTX_O))
/* Not yet transmitted */
break;
count++;
info = &TX_DESC_INFO(mac, i);
pci_unmap_single(mac->dma_pdev, info->dma,
info->skb->len, PCI_DMA_TODEVICE);
dev_kfree_skb_irq(info->skb);
skbs[count] = info->skb;
dmas[count] = info->dma;
info->skb = NULL;
info->dma = 0;
dp->mactx = 0;
dp->ptr = 0;
count++;
}
mac->tx->next_to_clean += count;
spin_unlock_irqrestore(&mac->tx->lock, flags);
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)
PAS_IOB_DMA_RXCH_CFG_CNTTH(0));
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 */
pasemi_mac_restart_rx_intr(mac);