On Fri, 2005-12-16 at 14:52 -0500, Benjamin LaHaise wrote:
> In __alloc_skb(), the use of skb_shinfo() which casts a u8 * to the
> shared info structure results in gcc being forced to do a reload of the
> pointer since it has no information on possible aliasing. Fix this by
> using a pointer to refer to skb_shared_info.
How about moving this into a helper function
and calling it from alloc_skb_from_cache too?
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 83fee37..7f6f4f5 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -118,6 +118,19 @@ void skb_under_panic(struct sk_buff *skb
*
*/
+static inline void skb_init_shared_info(struct sk_buff *skb)
+{
+ /* make sure we initialize shinfo sequentially */
+ struct skb_shared_info* shinfo = skb_shinfo(skb);
+ atomic_set(&shinfo->dataref, 1);
+ shinfo->nr_frags = 0;
+ shinfo->tso_size = 0;
+ shinfo->tso_segs = 0;
+ shinfo->ufo_size = 0;
+ shinfo->ip6_frag_id = 0;
+ shinfo->frag_list = NULL;
+}
+
/**
* __alloc_skb - allocate a network buffer
* @size: size to allocate
@@ -139,13 +152,8 @@ struct sk_buff *__alloc_skb(unsigned int
u8 *data;
/* Get the HEAD */
- if (fclone)
- skb = kmem_cache_alloc(skbuff_fclone_cache,
- gfp_mask & ~__GFP_DMA);
- else
- skb = kmem_cache_alloc(skbuff_head_cache,
- gfp_mask & ~__GFP_DMA);
-
+ skb = kmem_cache_alloc(fclone ? skbuff_fclone_cache : skbuff_head_cache,
+ gfp_mask & ~__GFP_DMA);
if (!skb)
goto out;
@@ -162,6 +170,9 @@ struct sk_buff *__alloc_skb(unsigned int
skb->data = data;
skb->tail = data;
skb->end = data + size;
+
+ skb_init_shared_info(skb);
+
if (fclone) {
struct sk_buff *child = skb + 1;
atomic_t *fclone_ref = (atomic_t *) (child + 1);
@@ -171,13 +182,6 @@ struct sk_buff *__alloc_skb(unsigned int
child->fclone = SKB_FCLONE_UNAVAILABLE;
}
- atomic_set(&(skb_shinfo(skb)->dataref), 1);
- skb_shinfo(skb)->nr_frags = 0;
- skb_shinfo(skb)->tso_size = 0;
- skb_shinfo(skb)->tso_segs = 0;
- skb_shinfo(skb)->frag_list = NULL;
- skb_shinfo(skb)->ufo_size = 0;
- skb_shinfo(skb)->ip6_frag_id = 0;
out:
return skb;
nodata:
@@ -227,11 +231,7 @@ struct sk_buff *alloc_skb_from_cache(kme
skb->tail = data;
skb->end = data + size;
- atomic_set(&(skb_shinfo(skb)->dataref), 1);
- skb_shinfo(skb)->nr_frags = 0;
- skb_shinfo(skb)->tso_size = 0;
- skb_shinfo(skb)->tso_segs = 0;
- skb_shinfo(skb)->frag_list = NULL;
+ skb_init_shared_info(skb);
out:
return skb;
nodata:
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html