On Fri, Aug 14, 2009 at 02:10:45PM -0700, Linus Torvalds wrote: > On Fri, 14 Aug 2009, Linus Torvalds wrote: > > > > But not inline in the code, though. So yeah, it has a memory footprint, > > but shouldn't have a cache footprint. > > An example of this: stack usage. This is the code with BUG_ON(): > > skb_push: > push %rbp > mov %esi,%eax > add %esi,0x68(%rdi) > neg %rax > mov %rsp,%rbp > add 0xd8(%rdi),%rax > mov %rax,0xd8(%rdi) > cmp 0xd0(%rdi),%rax > jae 2f > ud2a > 1: jmp 1b > 2: leaveq > retq An allyesconfig (CONFIG_FTRACE disabled) on x86_64 with gcc 4.3.2 results in the following vmlinux sizes: 574152755 2009-08-16 20:05 vmlinux-orig 574862000 2009-08-16 20:13 vmlinux-skb-inline The skb-inline variant was created by using your patch and on top of it the patch below. Size increased by 692KB (0.12%). Dunno.. is that acceptable? --- include/linux/skbuff.h | 35 +++++++++++++++++++++++++++++++++-- net/core/skbuff.c | 38 -------------------------------------- 2 files changed, 33 insertions(+), 40 deletions(-) Index: linux-2.6/include/linux/skbuff.h =================================================================== --- linux-2.6.orig/include/linux/skbuff.h +++ linux-2.6/include/linux/skbuff.h @@ -1116,7 +1116,6 @@ static inline void skb_set_tail_pointer( /* * Add data to an sk_buff */ -extern unsigned char *skb_put(struct sk_buff *skb, unsigned int len); static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len) { unsigned char *tmp = skb_tail_pointer(skb); @@ -1126,7 +1125,23 @@ static inline unsigned char *__skb_put(s return tmp; } -extern unsigned char *skb_push(struct sk_buff *skb, unsigned int len); +/** + * skb_put - add data to a buffer + * @skb: buffer to use + * @len: amount of data to add + * + * This function extends the used data area of the buffer. If this would + * exceed the total buffer size the kernel will panic. A pointer to the + * first byte of the extra data is returned. + */ +static inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len) +{ + unsigned char *tmp = __skb_put(skb, len); + + BUG_ON(skb->tail > skb->end); + return tmp; +} + static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len) { skb->data -= len; @@ -1134,6 +1149,22 @@ static inline unsigned char *__skb_push( return skb->data; } +/** + * skb_push - add data to the start of a buffer + * @skb: buffer to use + * @len: amount of data to add + * + * This function extends the used data area of the buffer at the buffer + * start. If this would exceed the total buffer headroom the kernel will + * panic. A pointer to the first byte of the extra data is returned. + */ +static inline unsigned char *skb_push(struct sk_buff *skb, unsigned int len) +{ + __skb_push(skb, len); + BUG_ON(skb->data < skb->head); + return skb->data; +} + extern unsigned char *skb_pull(struct sk_buff *skb, unsigned int len); static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len) { Index: linux-2.6/net/core/skbuff.c =================================================================== --- linux-2.6.orig/net/core/skbuff.c +++ linux-2.6/net/core/skbuff.c @@ -955,44 +955,6 @@ free_skb: EXPORT_SYMBOL(skb_pad); /** - * skb_put - add data to a buffer - * @skb: buffer to use - * @len: amount of data to add - * - * This function extends the used data area of the buffer. If this would - * exceed the total buffer size the kernel will panic. A pointer to the - * first byte of the extra data is returned. - */ -unsigned char *skb_put(struct sk_buff *skb, unsigned int len) -{ - unsigned char *tmp = skb_tail_pointer(skb); - SKB_LINEAR_ASSERT(skb); - skb->tail += len; - skb->len += len; - BUG_ON(skb->tail > skb->end); - return tmp; -} -EXPORT_SYMBOL(skb_put); - -/** - * skb_push - add data to the start of a buffer - * @skb: buffer to use - * @len: amount of data to add - * - * This function extends the used data area of the buffer at the buffer - * start. If this would exceed the total buffer headroom the kernel will - * panic. A pointer to the first byte of the extra data is returned. - */ -unsigned char *skb_push(struct sk_buff *skb, unsigned int len) -{ - skb->data -= len; - skb->len += len; - BUG_ON(skb->data < skb->head); - return skb->data; -} -EXPORT_SYMBOL(skb_push); - -/** * skb_pull - remove data from the start of a buffer * @skb: buffer to use * @len: amount of data to remove -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html