diff options
author | Octavian Purdila <opurdila@ixiacom.com> | 2009-12-26 11:51:02 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-12-26 20:41:43 -0800 |
commit | b76f5a8427ac2928c07fa4ff2144bb8db072c240 (patch) | |
tree | 542d64a8bd28baf69f87b199a0156f865a06551d /net/llc/llc_core.c | |
parent | abf9d537fea225af60762640361af7fb233b3103 (diff) | |
download | linux-b76f5a8427ac2928c07fa4ff2144bb8db072c240.tar.gz linux-b76f5a8427ac2928c07fa4ff2144bb8db072c240.tar.bz2 linux-b76f5a8427ac2928c07fa4ff2144bb8db072c240.zip |
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>
Diffstat (limited to 'net/llc/llc_core.c')
-rw-r--r-- | net/llc/llc_core.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/net/llc/llc_core.c b/net/llc/llc_core.c index ff4c0ab96a69..5276b9722077 100644 --- a/net/llc/llc_core.c +++ b/net/llc/llc_core.c @@ -37,7 +37,8 @@ static struct llc_sap *llc_sap_alloc(void) if (sap) { /* sap->laddr.mac - leave as a null, it's filled by bind */ sap->state = LLC_SAP_STATE_ACTIVE; - rwlock_init(&sap->sk_list.lock); + spin_lock_init(&sap->sk_lock); + INIT_HLIST_NULLS_HEAD(&sap->sk_list, 0); atomic_set(&sap->refcnt, 1); } return sap; @@ -142,7 +143,7 @@ out: */ void llc_sap_close(struct llc_sap *sap) { - WARN_ON(!hlist_empty(&sap->sk_list.list)); + WARN_ON(!hlist_nulls_empty(&sap->sk_list)); llc_del_sap(sap); kfree(sap); } |