llc: convert the socket list to RCU locking
For the reclamation phase we use the SLAB_DESTROY_BY_RCU mechanism, which require some extra checks in the lookup code: a) If the current socket was released, reallocated & inserted in another list it will short circuit the iteration for the current list, thus we need to restart the lookup. b) If the current socket was released, reallocated & inserted in the same list we just need to recheck it matches the look-up criteria and if not we can skip to the next element. In this case there is no need to restart the lookup, since sockets are inserted at the start of the list and the worst that will happen is that we will iterate throught some of the list elements more then once. Note that the /proc and multicast delivery was not yet converted to RCU, it still uses spinlocks for protection. Signed-off-by: Octavian Purdila <opurdila@ixiacom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
abf9d537fe
commit
b76f5a8427
@@ -16,6 +16,7 @@
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/rculist_nulls.h>
|
||||
|
||||
#include <asm/atomic.h>
|
||||
|
||||
@@ -53,10 +54,8 @@ struct llc_sap {
|
||||
struct net_device *orig_dev);
|
||||
struct llc_addr laddr;
|
||||
struct list_head node;
|
||||
struct {
|
||||
rwlock_t lock;
|
||||
struct hlist_head list;
|
||||
} sk_list;
|
||||
spinlock_t sk_lock;
|
||||
struct hlist_nulls_head sk_list;
|
||||
};
|
||||
|
||||
#define LLC_DEST_INVALID 0 /* Invalid LLC PDU type */
|
||||
|
Reference in New Issue
Block a user