|
@@ -414,8 +414,12 @@ struct sk_buff *__netdev_alloc_skb(struct net_device *dev, unsigned int len,
|
|
|
len += NET_SKB_PAD;
|
|
|
|
|
|
if ((len > SKB_WITH_OVERHEAD(PAGE_SIZE)) ||
|
|
|
- (gfp_mask & (__GFP_WAIT | GFP_DMA)))
|
|
|
- return __alloc_skb(len, gfp_mask, SKB_ALLOC_RX, NUMA_NO_NODE);
|
|
|
+ (gfp_mask & (__GFP_WAIT | GFP_DMA))) {
|
|
|
+ skb = __alloc_skb(len, gfp_mask, SKB_ALLOC_RX, NUMA_NO_NODE);
|
|
|
+ if (!skb)
|
|
|
+ goto skb_fail;
|
|
|
+ goto skb_success;
|
|
|
+ }
|
|
|
|
|
|
len += SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
|
|
|
len = SKB_DATA_ALIGN(len);
|
|
@@ -445,9 +449,11 @@ struct sk_buff *__netdev_alloc_skb(struct net_device *dev, unsigned int len,
|
|
|
skb->pfmemalloc = 1;
|
|
|
skb->head_frag = 1;
|
|
|
|
|
|
+skb_success:
|
|
|
skb_reserve(skb, NET_SKB_PAD);
|
|
|
skb->dev = dev;
|
|
|
|
|
|
+skb_fail:
|
|
|
return skb;
|
|
|
}
|
|
|
EXPORT_SYMBOL(__netdev_alloc_skb);
|
|
@@ -475,8 +481,12 @@ struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len,
|
|
|
len += NET_SKB_PAD + NET_IP_ALIGN;
|
|
|
|
|
|
if ((len > SKB_WITH_OVERHEAD(PAGE_SIZE)) ||
|
|
|
- (gfp_mask & (__GFP_WAIT | GFP_DMA)))
|
|
|
- return __alloc_skb(len, gfp_mask, SKB_ALLOC_RX, NUMA_NO_NODE);
|
|
|
+ (gfp_mask & (__GFP_WAIT | GFP_DMA))) {
|
|
|
+ skb = __alloc_skb(len, gfp_mask, SKB_ALLOC_RX, NUMA_NO_NODE);
|
|
|
+ if (!skb)
|
|
|
+ goto skb_fail;
|
|
|
+ goto skb_success;
|
|
|
+ }
|
|
|
|
|
|
len += SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
|
|
|
len = SKB_DATA_ALIGN(len);
|
|
@@ -499,9 +509,11 @@ struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len,
|
|
|
skb->pfmemalloc = 1;
|
|
|
skb->head_frag = 1;
|
|
|
|
|
|
+skb_success:
|
|
|
skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN);
|
|
|
skb->dev = napi->dev;
|
|
|
|
|
|
+skb_fail:
|
|
|
return skb;
|
|
|
}
|
|
|
EXPORT_SYMBOL(__napi_alloc_skb);
|