diff options
Diffstat (limited to 'net/ipv6/ndisc.c')
-rw-r--r-- | net/ipv6/ndisc.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index c4bc7a35cd56..12179457b2cd 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -372,14 +372,11 @@ static struct sk_buff *ndisc_alloc_skb(struct net_device *dev, | |||
372 | int tlen = dev->needed_tailroom; | 372 | int tlen = dev->needed_tailroom; |
373 | struct sock *sk = dev_net(dev)->ipv6.ndisc_sk; | 373 | struct sock *sk = dev_net(dev)->ipv6.ndisc_sk; |
374 | struct sk_buff *skb; | 374 | struct sk_buff *skb; |
375 | int err; | ||
376 | 375 | ||
377 | skb = sock_alloc_send_skb(sk, | 376 | skb = alloc_skb(hlen + sizeof(struct ipv6hdr) + len + tlen, GFP_ATOMIC); |
378 | hlen + sizeof(struct ipv6hdr) + len + tlen, | ||
379 | 1, &err); | ||
380 | if (!skb) { | 377 | if (!skb) { |
381 | ND_PRINTK(0, err, "ndisc: %s failed to allocate an skb, err=%d\n", | 378 | ND_PRINTK(0, err, "ndisc: %s failed to allocate an skb\n", |
382 | __func__, err); | 379 | __func__); |
383 | return NULL; | 380 | return NULL; |
384 | } | 381 | } |
385 | 382 | ||
@@ -389,6 +386,11 @@ static struct sk_buff *ndisc_alloc_skb(struct net_device *dev, | |||
389 | skb_reserve(skb, hlen + sizeof(struct ipv6hdr)); | 386 | skb_reserve(skb, hlen + sizeof(struct ipv6hdr)); |
390 | skb_reset_transport_header(skb); | 387 | skb_reset_transport_header(skb); |
391 | 388 | ||
389 | /* Manually assign socket ownership as we avoid calling | ||
390 | * sock_alloc_send_pskb() to bypass wmem buffer limits | ||
391 | */ | ||
392 | skb_set_owner_w(skb, sk); | ||
393 | |||
392 | return skb; | 394 | return skb; |
393 | } | 395 | } |
394 | 396 | ||