Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+29 −10
Original line number Original line Diff line number Diff line
@@ -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)
			   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);