[PATCH v2 12/46] net: sunhme: cleanup RX skb allocation
From: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Date: 2011-07-11 00:52:53
Subsystem:
networking drivers, the rest · Maintainers:
Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl> --- drivers/net/sunhme.c | 18 ++++++++---------- drivers/net/sunhme.h | 14 +------------- 2 files changed, 9 insertions(+), 23 deletions(-)
diff --git a/drivers/net/sunhme.c b/drivers/net/sunhme.c
index 856e05b..c73fdad 100644
--- a/drivers/net/sunhme.c
+++ b/drivers/net/sunhme.c@@ -1265,7 +1265,8 @@ static void happy_meal_init_rings(struct happy_meal *hp) for (i = 0; i < RX_RING_SIZE; i++) { struct sk_buff *skb; - skb = happy_meal_alloc_skb(RX_BUF_ALLOC_SIZE, GFP_ATOMIC); + skb = __netdev_alloc_skb_aligned(dev, RX_BUF_ALLOC_SIZE, + SUNHME_RX_ALIGNMENT, GFP_ATOMIC); if (!skb) { hme_write_rxd(hp, &hb->happy_meal_rxd[i], 0, 0); continue;
@@ -1273,8 +1274,6 @@ static void happy_meal_init_rings(struct happy_meal *hp) hp->rx_skbs[i] = skb; skb->dev = dev; - /* Because we reserve afterwards. */ - skb_put(skb, (ETH_FRAME_LEN + RX_OFFSET + 4)); hme_write_rxd(hp, &hb->happy_meal_rxd[i], (RXFLAG_OWN | ((RX_BUF_ALLOC_SIZE - RX_OFFSET) << 16)), dma_map_single(hp->dma_dev, skb->data, RX_BUF_ALLOC_SIZE,
@@ -2025,32 +2024,31 @@ static void happy_meal_rx(struct happy_meal *hp, struct net_device *dev) struct sk_buff *new_skb; /* Now refill the entry, if we can. */ - new_skb = happy_meal_alloc_skb(RX_BUF_ALLOC_SIZE, GFP_ATOMIC); + new_skb = __netdev_alloc_skb_aligned(dev, + RX_BUF_ALLOC_SIZE, + SUNHME_RX_ALIGNMENT, + GFP_ATOMIC); if (new_skb == NULL) { drops++; goto drop_it; } dma_unmap_single(hp->dma_dev, dma_addr, RX_BUF_ALLOC_SIZE, DMA_FROM_DEVICE); hp->rx_skbs[elem] = new_skb; - new_skb->dev = dev; - skb_put(new_skb, (ETH_FRAME_LEN + RX_OFFSET + 4)); hme_write_rxd(hp, this, (RXFLAG_OWN|((RX_BUF_ALLOC_SIZE-RX_OFFSET)<<16)), dma_map_single(hp->dma_dev, new_skb->data, RX_BUF_ALLOC_SIZE, DMA_FROM_DEVICE)); skb_reserve(new_skb, RX_OFFSET); - /* Trim the original skb for the netif. */ - skb_trim(skb, len); + skb_put(skb, len); } else { - struct sk_buff *copy_skb = dev_alloc_skb(len + 2); + struct sk_buff *copy_skb = netdev_alloc_skb_ip_align(dev, len); if (copy_skb == NULL) { drops++; goto drop_it; } - skb_reserve(copy_skb, 2); skb_put(copy_skb, len); dma_sync_single_for_cpu(hp->dma_dev, dma_addr, len, DMA_FROM_DEVICE); skb_copy_from_linear_data(skb, copy_skb->data, len);
diff --git a/drivers/net/sunhme.h b/drivers/net/sunhme.h
index 64f2783..f584eb0 100644
--- a/drivers/net/sunhme.h
+++ b/drivers/net/sunhme.h@@ -495,18 +495,6 @@ struct quattro { int nranges; }; -/* We use this to acquire receive skb's that we can DMA directly into. */ -#define ALIGNED_RX_SKB_ADDR(addr) \ - ((((unsigned long)(addr) + (64UL - 1UL)) & ~(64UL - 1UL)) - (unsigned long)(addr)) -#define happy_meal_alloc_skb(__length, __gfp_flags) \ -({ struct sk_buff *__skb; \ - __skb = alloc_skb((__length) + 64, (__gfp_flags)); \ - if(__skb) { \ - int __offset = (int) ALIGNED_RX_SKB_ADDR(__skb->data); \ - if(__offset) \ - skb_reserve(__skb, __offset); \ - } \ - __skb; \ -}) +#define SUNHME_RX_ALIGNMENT 64 #endif /* !(_SUNHME_H) */
--
1.7.5.4