aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Duyck <alexander.h.duyck@intel.com>2012-05-04 10:26:56 -0400
committerDavid S. Miller <davem@davemloft.net>2012-05-06 13:13:19 -0400
commitec47ea82477404631d49b8e568c71826c9b663ac (patch)
tree8b7890f23ad078d9eccbd4571e0b2da86b04a6a0
parent3e24591a19bbda6fcb2cbe383b41b4ba794501bf (diff)
skb: Add inline helper for getting the skb end offset from head
With the recent changes for how we compute the skb truesize it occurs to me we are probably going to have a lot of calls to skb_end_pointer - skb->head. Instead of running all over the place doing that it would make more sense to just make it a separate inline skb_end_offset(skb) that way we can return the correct value without having gcc having to do all the optimization to cancel out skb->head - skb->head. Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/atm/ambassador.c2
-rw-r--r--drivers/atm/idt77252.c2
-rw-r--r--drivers/net/wimax/i2400m/usb-rx.c2
-rw-r--r--drivers/staging/octeon/ethernet-tx.c2
-rw-r--r--include/linux/skbuff.h12
-rw-r--r--net/core/skbuff.c12
6 files changed, 21 insertions, 11 deletions
diff --git a/drivers/atm/ambassador.c b/drivers/atm/ambassador.c
index f8f41e0e8a8c..89b30f32ba68 100644
--- a/drivers/atm/ambassador.c
+++ b/drivers/atm/ambassador.c
@@ -802,7 +802,7 @@ static void fill_rx_pool (amb_dev * dev, unsigned char pool,
802 } 802 }
803 // cast needed as there is no %? for pointer differences 803 // cast needed as there is no %? for pointer differences
804 PRINTD (DBG_SKB, "allocated skb at %p, head %p, area %li", 804 PRINTD (DBG_SKB, "allocated skb at %p, head %p, area %li",
805 skb, skb->head, (long) (skb_end_pointer(skb) - skb->head)); 805 skb, skb->head, (long) skb_end_offset(skb));
806 rx.handle = virt_to_bus (skb); 806 rx.handle = virt_to_bus (skb);
807 rx.host_address = cpu_to_be32 (virt_to_bus (skb->data)); 807 rx.host_address = cpu_to_be32 (virt_to_bus (skb->data));
808 if (rx_give (dev, &rx, pool)) 808 if (rx_give (dev, &rx, pool))
diff --git a/drivers/atm/idt77252.c b/drivers/atm/idt77252.c
index 1c052127548c..8974bd2b961e 100644
--- a/drivers/atm/idt77252.c
+++ b/drivers/atm/idt77252.c
@@ -1258,7 +1258,7 @@ idt77252_rx_raw(struct idt77252_dev *card)
1258 tail = readl(SAR_REG_RAWCT); 1258 tail = readl(SAR_REG_RAWCT);
1259 1259
1260 pci_dma_sync_single_for_cpu(card->pcidev, IDT77252_PRV_PADDR(queue), 1260 pci_dma_sync_single_for_cpu(card->pcidev, IDT77252_PRV_PADDR(queue),
1261 skb_end_pointer(queue) - queue->head - 16, 1261 skb_end_offset(queue) - 16,
1262 PCI_DMA_FROMDEVICE); 1262 PCI_DMA_FROMDEVICE);
1263 1263
1264 while (head != tail) { 1264 while (head != tail) {
diff --git a/drivers/net/wimax/i2400m/usb-rx.c b/drivers/net/wimax/i2400m/usb-rx.c
index e3257681e360..b78ee676e102 100644
--- a/drivers/net/wimax/i2400m/usb-rx.c
+++ b/drivers/net/wimax/i2400m/usb-rx.c
@@ -277,7 +277,7 @@ retry:
277 d_printf(1, dev, "RX: size changed to %d, received %d, " 277 d_printf(1, dev, "RX: size changed to %d, received %d, "
278 "copied %d, capacity %ld\n", 278 "copied %d, capacity %ld\n",
279 rx_size, read_size, rx_skb->len, 279 rx_size, read_size, rx_skb->len,
280 (long) (skb_end_pointer(new_skb) - new_skb->head)); 280 (long) skb_end_offset(new_skb));
281 goto retry; 281 goto retry;
282 } 282 }
283 /* In most cases, it happens due to the hardware scheduling a 283 /* In most cases, it happens due to the hardware scheduling a
diff --git a/drivers/staging/octeon/ethernet-tx.c b/drivers/staging/octeon/ethernet-tx.c
index 56d74dc2fbd5..418ed03d0887 100644
--- a/drivers/staging/octeon/ethernet-tx.c
+++ b/drivers/staging/octeon/ethernet-tx.c
@@ -344,7 +344,7 @@ int cvm_oct_xmit(struct sk_buff *skb, struct net_device *dev)
344 } 344 }
345 if (unlikely 345 if (unlikely
346 (skb->truesize != 346 (skb->truesize !=
347 sizeof(*skb) + skb_end_pointer(skb) - skb->head)) { 347 sizeof(*skb) + skb_end_offset(skb))) {
348 /* 348 /*
349 printk("TX buffer truesize has been changed\n"); 349 printk("TX buffer truesize has been changed\n");
350 */ 350 */
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 37f539129d89..91ad5e227d1d 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -645,11 +645,21 @@ static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
645{ 645{
646 return skb->head + skb->end; 646 return skb->head + skb->end;
647} 647}
648
649static inline unsigned int skb_end_offset(const struct sk_buff *skb)
650{
651 return skb->end;
652}
648#else 653#else
649static inline unsigned char *skb_end_pointer(const struct sk_buff *skb) 654static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
650{ 655{
651 return skb->end; 656 return skb->end;
652} 657}
658
659static inline unsigned int skb_end_offset(const struct sk_buff *skb)
660{
661 return skb->end - skb->head;
662}
653#endif 663#endif
654 664
655/* Internal */ 665/* Internal */
@@ -2558,7 +2568,7 @@ static inline bool skb_is_recycleable(const struct sk_buff *skb, int skb_size)
2558 return false; 2568 return false;
2559 2569
2560 skb_size = SKB_DATA_ALIGN(skb_size + NET_SKB_PAD); 2570 skb_size = SKB_DATA_ALIGN(skb_size + NET_SKB_PAD);
2561 if (skb_end_pointer(skb) - skb->head < skb_size) 2571 if (skb_end_offset(skb) < skb_size)
2562 return false; 2572 return false;
2563 2573
2564 if (skb_shared(skb) || skb_cloned(skb)) 2574 if (skb_shared(skb) || skb_cloned(skb))
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 17e4b1e1bf2c..2c35da818ef9 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -829,7 +829,7 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
829struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t gfp_mask) 829struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t gfp_mask)
830{ 830{
831 int headerlen = skb_headroom(skb); 831 int headerlen = skb_headroom(skb);
832 unsigned int size = (skb_end_pointer(skb) - skb->head) + skb->data_len; 832 unsigned int size = skb_end_offset(skb) + skb->data_len;
833 struct sk_buff *n = alloc_skb(size, gfp_mask); 833 struct sk_buff *n = alloc_skb(size, gfp_mask);
834 834
835 if (!n) 835 if (!n)
@@ -930,7 +930,7 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail,
930{ 930{
931 int i; 931 int i;
932 u8 *data; 932 u8 *data;
933 int size = nhead + (skb_end_pointer(skb) - skb->head) + ntail; 933 int size = nhead + skb_end_offset(skb) + ntail;
934 long off; 934 long off;
935 935
936 BUG_ON(nhead < 0); 936 BUG_ON(nhead < 0);
@@ -2727,14 +2727,13 @@ struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features)
2727 if (unlikely(!nskb)) 2727 if (unlikely(!nskb))
2728 goto err; 2728 goto err;
2729 2729
2730 hsize = skb_end_pointer(nskb) - nskb->head; 2730 hsize = skb_end_offset(nskb);
2731 if (skb_cow_head(nskb, doffset + headroom)) { 2731 if (skb_cow_head(nskb, doffset + headroom)) {
2732 kfree_skb(nskb); 2732 kfree_skb(nskb);
2733 goto err; 2733 goto err;
2734 } 2734 }
2735 2735
2736 nskb->truesize += skb_end_pointer(nskb) - nskb->head - 2736 nskb->truesize += skb_end_offset(nskb) - hsize;
2737 hsize;
2738 skb_release_head_state(nskb); 2737 skb_release_head_state(nskb);
2739 __skb_push(nskb, doffset); 2738 __skb_push(nskb, doffset);
2740 } else { 2739 } else {
@@ -2883,7 +2882,8 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)
2883 skb_frag_size_sub(frag, offset); 2882 skb_frag_size_sub(frag, offset);
2884 2883
2885 /* all fragments truesize : remove (head size + sk_buff) */ 2884 /* all fragments truesize : remove (head size + sk_buff) */
2886 delta_truesize = skb->truesize - SKB_TRUESIZE(skb_end_pointer(skb) - skb->head); 2885 delta_truesize = skb->truesize -
2886 SKB_TRUESIZE(skb_end_offset(skb));
2887 2887
2888 skb->truesize -= skb->data_len; 2888 skb->truesize -= skb->data_len;
2889 skb->len -= skb->data_len; 2889 skb->len -= skb->data_len;