aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom/tg3.c
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2012-05-18 17:33:39 -0400
committerDavid S. Miller <davem@davemloft.net>2012-05-19 04:02:12 -0400
commita1e8b307986ab27b7608f107aec71d3569650f46 (patch)
tree973e0f84ef75a768a85ffd4129876e2666efa087 /drivers/net/ethernet/broadcom/tg3.c
parent4adb9c4ac88d874105ac31161c9c55004a972f87 (diff)
tg3: use netdev_alloc_frag() API
Update our reference driver to use netdev_alloc_frag() API instead of the temporary custom allocator I introduced in commit 8d4057a938 (tg3: provide frags as skb head) This removes the memory leak we had, since we could leak one page at device dismantle. Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Matt Carlson <mcarlson@broadcom.com> Cc: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom/tg3.c')
-rw-r--r--drivers/net/ethernet/broadcom/tg3.c38
1 files changed, 5 insertions, 33 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index 39b92f5ed7dd..d55df3290174 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -195,15 +195,6 @@ static inline void _tg3_flag_clear(enum TG3_FLAGS flag, unsigned long *bits)
195#define TG3_RX_OFFSET(tp) (NET_SKB_PAD) 195#define TG3_RX_OFFSET(tp) (NET_SKB_PAD)
196#endif 196#endif
197 197
198/* This driver uses the new build_skb() API providing a frag as skb->head
199 * This strategy permits better GRO aggregation, better TCP coalescing, and
200 * better splice() implementation (avoids a copy from head to a page), at
201 * minimal memory cost.
202 * In this 2048 bytes block, we have enough room to store the MTU=1500 frame
203 * and the struct skb_shared_info.
204 */
205#define TG3_FRAGSIZE 2048
206
207/* minimum number of free TX descriptors required to wake up TX process */ 198/* minimum number of free TX descriptors required to wake up TX process */
208#define TG3_TX_WAKEUP_THRESH(tnapi) ((tnapi)->tx_pending / 4) 199#define TG3_TX_WAKEUP_THRESH(tnapi) ((tnapi)->tx_pending / 4)
209#define TG3_TX_BD_DMA_MAX_2K 2048 200#define TG3_TX_BD_DMA_MAX_2K 2048
@@ -5631,25 +5622,6 @@ static void tg3_tx(struct tg3_napi *tnapi)
5631 } 5622 }
5632} 5623}
5633 5624
5634static void *tg3_frag_alloc(struct tg3_rx_prodring_set *tpr)
5635{
5636 void *data;
5637
5638 if (tpr->rx_page_size < TG3_FRAGSIZE) {
5639 struct page *page = alloc_page(GFP_ATOMIC);
5640
5641 if (!page)
5642 return NULL;
5643 atomic_add((PAGE_SIZE / TG3_FRAGSIZE) - 1, &page->_count);
5644 tpr->rx_page_addr = page_address(page);
5645 tpr->rx_page_size = PAGE_SIZE;
5646 }
5647 data = tpr->rx_page_addr;
5648 tpr->rx_page_addr += TG3_FRAGSIZE;
5649 tpr->rx_page_size -= TG3_FRAGSIZE;
5650 return data;
5651}
5652
5653static void tg3_frag_free(bool is_frag, void *data) 5625static void tg3_frag_free(bool is_frag, void *data)
5654{ 5626{
5655 if (is_frag) 5627 if (is_frag)
@@ -5668,7 +5640,7 @@ static void tg3_rx_data_free(struct tg3 *tp, struct ring_info *ri, u32 map_sz)
5668 5640
5669 pci_unmap_single(tp->pdev, dma_unmap_addr(ri, mapping), 5641 pci_unmap_single(tp->pdev, dma_unmap_addr(ri, mapping),
5670 map_sz, PCI_DMA_FROMDEVICE); 5642 map_sz, PCI_DMA_FROMDEVICE);
5671 tg3_frag_free(skb_size <= TG3_FRAGSIZE, ri->data); 5643 tg3_frag_free(skb_size <= PAGE_SIZE, ri->data);
5672 ri->data = NULL; 5644 ri->data = NULL;
5673} 5645}
5674 5646
@@ -5721,9 +5693,9 @@ static int tg3_alloc_rx_data(struct tg3 *tp, struct tg3_rx_prodring_set *tpr,
5721 */ 5693 */
5722 skb_size = SKB_DATA_ALIGN(data_size + TG3_RX_OFFSET(tp)) + 5694 skb_size = SKB_DATA_ALIGN(data_size + TG3_RX_OFFSET(tp)) +
5723 SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); 5695 SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
5724 if (skb_size <= TG3_FRAGSIZE) { 5696 if (skb_size <= PAGE_SIZE) {
5725 data = tg3_frag_alloc(tpr); 5697 data = netdev_alloc_frag(skb_size);
5726 *frag_size = TG3_FRAGSIZE; 5698 *frag_size = skb_size;
5727 } else { 5699 } else {
5728 data = kmalloc(skb_size, GFP_ATOMIC); 5700 data = kmalloc(skb_size, GFP_ATOMIC);
5729 *frag_size = 0; 5701 *frag_size = 0;
@@ -5736,7 +5708,7 @@ static int tg3_alloc_rx_data(struct tg3 *tp, struct tg3_rx_prodring_set *tpr,
5736 data_size, 5708 data_size,
5737 PCI_DMA_FROMDEVICE); 5709 PCI_DMA_FROMDEVICE);
5738 if (unlikely(pci_dma_mapping_error(tp->pdev, mapping))) { 5710 if (unlikely(pci_dma_mapping_error(tp->pdev, mapping))) {
5739 tg3_frag_free(skb_size <= TG3_FRAGSIZE, data); 5711 tg3_frag_free(skb_size <= PAGE_SIZE, data);
5740 return -EIO; 5712 return -EIO;
5741 } 5713 }
5742 5714