Loading net/packet/af_packet.c +5 −5 Original line number Diff line number Diff line Loading @@ -1685,7 +1685,7 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags) match->flags = flags; INIT_LIST_HEAD(&match->list); spin_lock_init(&match->lock); atomic_set(&match->sk_ref, 0); refcount_set(&match->sk_ref, 0); fanout_init_data(match); match->prot_hook.type = po->prot_hook.type; match->prot_hook.dev = po->prot_hook.dev; Loading @@ -1702,19 +1702,19 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags) match->prot_hook.type == po->prot_hook.type && match->prot_hook.dev == po->prot_hook.dev) { err = -ENOSPC; if (atomic_read(&match->sk_ref) < PACKET_FANOUT_MAX) { if (refcount_read(&match->sk_ref) < PACKET_FANOUT_MAX) { __dev_remove_pack(&po->prot_hook); po->fanout = match; po->rollover = rollover; rollover = NULL; atomic_inc(&match->sk_ref); refcount_set(&match->sk_ref, refcount_read(&match->sk_ref) + 1); __fanout_link(sk, po); err = 0; } } spin_unlock(&po->bind_lock); if (err && !atomic_read(&match->sk_ref)) { if (err && !refcount_read(&match->sk_ref)) { list_del(&match->list); kfree(match); } Loading @@ -1740,7 +1740,7 @@ static struct packet_fanout *fanout_release(struct sock *sk) if (f) { po->fanout = NULL; if (atomic_dec_and_test(&f->sk_ref)) if (refcount_dec_and_test(&f->sk_ref)) list_del(&f->list); else f = NULL; Loading net/packet/internal.h +3 −1 Original line number Diff line number Diff line #ifndef __PACKET_INTERNAL_H__ #define __PACKET_INTERNAL_H__ #include <linux/refcount.h> struct packet_mclist { struct packet_mclist *next; int ifindex; Loading Loading @@ -86,7 +88,7 @@ struct packet_fanout { struct list_head list; struct sock *arr[PACKET_FANOUT_MAX]; spinlock_t lock; atomic_t sk_ref; refcount_t sk_ref; struct packet_type prot_hook ____cacheline_aligned_in_smp; }; Loading Loading
net/packet/af_packet.c +5 −5 Original line number Diff line number Diff line Loading @@ -1685,7 +1685,7 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags) match->flags = flags; INIT_LIST_HEAD(&match->list); spin_lock_init(&match->lock); atomic_set(&match->sk_ref, 0); refcount_set(&match->sk_ref, 0); fanout_init_data(match); match->prot_hook.type = po->prot_hook.type; match->prot_hook.dev = po->prot_hook.dev; Loading @@ -1702,19 +1702,19 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags) match->prot_hook.type == po->prot_hook.type && match->prot_hook.dev == po->prot_hook.dev) { err = -ENOSPC; if (atomic_read(&match->sk_ref) < PACKET_FANOUT_MAX) { if (refcount_read(&match->sk_ref) < PACKET_FANOUT_MAX) { __dev_remove_pack(&po->prot_hook); po->fanout = match; po->rollover = rollover; rollover = NULL; atomic_inc(&match->sk_ref); refcount_set(&match->sk_ref, refcount_read(&match->sk_ref) + 1); __fanout_link(sk, po); err = 0; } } spin_unlock(&po->bind_lock); if (err && !atomic_read(&match->sk_ref)) { if (err && !refcount_read(&match->sk_ref)) { list_del(&match->list); kfree(match); } Loading @@ -1740,7 +1740,7 @@ static struct packet_fanout *fanout_release(struct sock *sk) if (f) { po->fanout = NULL; if (atomic_dec_and_test(&f->sk_ref)) if (refcount_dec_and_test(&f->sk_ref)) list_del(&f->list); else f = NULL; Loading
net/packet/internal.h +3 −1 Original line number Diff line number Diff line #ifndef __PACKET_INTERNAL_H__ #define __PACKET_INTERNAL_H__ #include <linux/refcount.h> struct packet_mclist { struct packet_mclist *next; int ifindex; Loading Loading @@ -86,7 +88,7 @@ struct packet_fanout { struct list_head list; struct sock *arr[PACKET_FANOUT_MAX]; spinlock_t lock; atomic_t sk_ref; refcount_t sk_ref; struct packet_type prot_hook ____cacheline_aligned_in_smp; }; Loading