diff options
Diffstat (limited to 'net/core/skbuff.c')
| -rw-r--r-- | net/core/skbuff.c | 42 |
1 files changed, 18 insertions, 24 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 83fee37de38e..d0732e9c8560 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -135,17 +135,13 @@ void skb_under_panic(struct sk_buff *skb, int sz, void *here) | |||
| 135 | struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask, | 135 | struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask, |
| 136 | int fclone) | 136 | int fclone) |
| 137 | { | 137 | { |
| 138 | struct skb_shared_info *shinfo; | ||
| 138 | struct sk_buff *skb; | 139 | struct sk_buff *skb; |
| 139 | u8 *data; | 140 | u8 *data; |
| 140 | 141 | ||
| 141 | /* Get the HEAD */ | 142 | /* Get the HEAD */ |
| 142 | if (fclone) | 143 | skb = kmem_cache_alloc(fclone ? skbuff_fclone_cache : skbuff_head_cache, |
| 143 | skb = kmem_cache_alloc(skbuff_fclone_cache, | 144 | gfp_mask & ~__GFP_DMA); |
| 144 | gfp_mask & ~__GFP_DMA); | ||
| 145 | else | ||
| 146 | skb = kmem_cache_alloc(skbuff_head_cache, | ||
| 147 | gfp_mask & ~__GFP_DMA); | ||
| 148 | |||
| 149 | if (!skb) | 145 | if (!skb) |
| 150 | goto out; | 146 | goto out; |
| 151 | 147 | ||
| @@ -162,6 +158,16 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask, | |||
| 162 | skb->data = data; | 158 | skb->data = data; |
| 163 | skb->tail = data; | 159 | skb->tail = data; |
| 164 | skb->end = data + size; | 160 | skb->end = data + size; |
| 161 | /* make sure we initialize shinfo sequentially */ | ||
| 162 | shinfo = skb_shinfo(skb); | ||
| 163 | atomic_set(&shinfo->dataref, 1); | ||
| 164 | shinfo->nr_frags = 0; | ||
| 165 | shinfo->tso_size = 0; | ||
| 166 | shinfo->tso_segs = 0; | ||
| 167 | shinfo->ufo_size = 0; | ||
| 168 | shinfo->ip6_frag_id = 0; | ||
| 169 | shinfo->frag_list = NULL; | ||
| 170 | |||
| 165 | if (fclone) { | 171 | if (fclone) { |
| 166 | struct sk_buff *child = skb + 1; | 172 | struct sk_buff *child = skb + 1; |
| 167 | atomic_t *fclone_ref = (atomic_t *) (child + 1); | 173 | atomic_t *fclone_ref = (atomic_t *) (child + 1); |
| @@ -171,13 +177,6 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask, | |||
| 171 | 177 | ||
| 172 | child->fclone = SKB_FCLONE_UNAVAILABLE; | 178 | child->fclone = SKB_FCLONE_UNAVAILABLE; |
| 173 | } | 179 | } |
| 174 | atomic_set(&(skb_shinfo(skb)->dataref), 1); | ||
| 175 | skb_shinfo(skb)->nr_frags = 0; | ||
| 176 | skb_shinfo(skb)->tso_size = 0; | ||
| 177 | skb_shinfo(skb)->tso_segs = 0; | ||
| 178 | skb_shinfo(skb)->frag_list = NULL; | ||
| 179 | skb_shinfo(skb)->ufo_size = 0; | ||
| 180 | skb_shinfo(skb)->ip6_frag_id = 0; | ||
| 181 | out: | 180 | out: |
| 182 | return skb; | 181 | return skb; |
| 183 | nodata: | 182 | nodata: |
| @@ -792,8 +791,7 @@ int ___pskb_trim(struct sk_buff *skb, unsigned int len, int realloc) | |||
| 792 | int end = offset + skb_shinfo(skb)->frags[i].size; | 791 | int end = offset + skb_shinfo(skb)->frags[i].size; |
| 793 | if (end > len) { | 792 | if (end > len) { |
| 794 | if (skb_cloned(skb)) { | 793 | if (skb_cloned(skb)) { |
| 795 | if (!realloc) | 794 | BUG_ON(!realloc); |
| 796 | BUG(); | ||
| 797 | if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) | 795 | if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) |
| 798 | return -ENOMEM; | 796 | return -ENOMEM; |
| 799 | } | 797 | } |
| @@ -895,8 +893,7 @@ unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta) | |||
| 895 | struct sk_buff *insp = NULL; | 893 | struct sk_buff *insp = NULL; |
| 896 | 894 | ||
| 897 | do { | 895 | do { |
| 898 | if (!list) | 896 | BUG_ON(!list); |
| 899 | BUG(); | ||
| 900 | 897 | ||
| 901 | if (list->len <= eat) { | 898 | if (list->len <= eat) { |
| 902 | /* Eaten as whole. */ | 899 | /* Eaten as whole. */ |
| @@ -1200,8 +1197,7 @@ unsigned int skb_checksum(const struct sk_buff *skb, int offset, | |||
| 1200 | start = end; | 1197 | start = end; |
| 1201 | } | 1198 | } |
| 1202 | } | 1199 | } |
| 1203 | if (len) | 1200 | BUG_ON(len); |
| 1204 | BUG(); | ||
| 1205 | 1201 | ||
| 1206 | return csum; | 1202 | return csum; |
| 1207 | } | 1203 | } |
| @@ -1283,8 +1279,7 @@ unsigned int skb_copy_and_csum_bits(const struct sk_buff *skb, int offset, | |||
| 1283 | start = end; | 1279 | start = end; |
| 1284 | } | 1280 | } |
| 1285 | } | 1281 | } |
| 1286 | if (len) | 1282 | BUG_ON(len); |
| 1287 | BUG(); | ||
| 1288 | return csum; | 1283 | return csum; |
| 1289 | } | 1284 | } |
| 1290 | 1285 | ||
| @@ -1298,8 +1293,7 @@ void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to) | |||
| 1298 | else | 1293 | else |
| 1299 | csstart = skb_headlen(skb); | 1294 | csstart = skb_headlen(skb); |
| 1300 | 1295 | ||
| 1301 | if (csstart > skb_headlen(skb)) | 1296 | BUG_ON(csstart > skb_headlen(skb)); |
| 1302 | BUG(); | ||
| 1303 | 1297 | ||
| 1304 | memcpy(to, skb->data, csstart); | 1298 | memcpy(to, skb->data, csstart); |
| 1305 | 1299 | ||
