Le jeudi 01 septembre 2011 à 16:54 +0400, Alexander Smirnov a écrit :
quoted hunk ↗ jump to hunk
This patch fixes 2 issues in lowpan_skb_deliver function:
1. Check for return status of skb_copy call;
2. Use skb_copy with proper GFP flag depending on context.
Signed-off-by: Alexander Smirnov <redacted>
---
net/ieee802154/6lowpan.c | 18 +++++++++++++++---
1 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/net/ieee802154/6lowpan.c b/net/ieee802154/6lowpan.c
index cf304cc..16100be 100644
--- a/net/ieee802154/6lowpan.c
+++ b/net/ieee802154/6lowpan.c
@@ -477,9 +477,15 @@ static int lowpan_skb_deliver(struct sk_buff *skb, struct ipv6hdr *hdr)
struct sk_buff *new;
struct lowpan_dev_record *entry;
int stat = NET_RX_SUCCESS;
+ gfp_t mask;
- new = skb_copy_expand(skb, sizeof(struct ipv6hdr), skb_tailroom(skb),
- GFP_KERNEL);
+ if (in_interrupt())
+ mask = GFP_ATOMIC;
+ else
+ mask = GFP_KERNEL;
I am not sure to understand if lowpan_skb_deliver() can be called in
pure process context. I feel we are in softirq handler or we have
disabled BH, so GFP_ATOMIC is the only choice.
If you are unsure, you could use following helper :
mask = gfp_any();
quoted hunk ↗ jump to hunk
+
+ new = skb_copy_expand(skb, sizeof(struct ipv6hdr),
+ skb_tailroom(skb), mask);
kfree_skb(skb);