Commit 68acc024 authored by Tommy S. Christensen's avatar Tommy S. Christensen Committed by David S. Miller

[NETLINK]: Move broadcast skb_orphan to the skb_get path.

Cloned packets don't need the orphan call.
Signed-off-by: default avatarTommy S. Christensen <tommy.christensen@tpack.net>
Acked-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent db61ecc3
...@@ -697,7 +697,6 @@ static __inline__ int netlink_broadcast_deliver(struct sock *sk, struct sk_buff ...@@ -697,7 +697,6 @@ static __inline__ int netlink_broadcast_deliver(struct sock *sk, struct sk_buff
if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf && if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf &&
!test_bit(0, &nlk->state)) { !test_bit(0, &nlk->state)) {
skb_orphan(skb);
skb_set_owner_r(skb, sk); skb_set_owner_r(skb, sk);
skb_queue_tail(&sk->sk_receive_queue, skb); skb_queue_tail(&sk->sk_receive_queue, skb);
sk->sk_data_ready(sk, skb->len); sk->sk_data_ready(sk, skb->len);
...@@ -736,11 +735,15 @@ static inline int do_one_broadcast(struct sock *sk, ...@@ -736,11 +735,15 @@ static inline int do_one_broadcast(struct sock *sk,
sock_hold(sk); sock_hold(sk);
if (p->skb2 == NULL) { if (p->skb2 == NULL) {
if (atomic_read(&p->skb->users) != 1) { if (skb_shared(p->skb)) {
p->skb2 = skb_clone(p->skb, p->allocation); p->skb2 = skb_clone(p->skb, p->allocation);
} else { } else {
p->skb2 = p->skb; p->skb2 = skb_get(p->skb);
atomic_inc(&p->skb->users); /*
* skb ownership may have been set when
* delivered to a previous socket.
*/
skb_orphan(p->skb2);
} }
} }
if (p->skb2 == NULL) { if (p->skb2 == NULL) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment