diff options
author | Johannes Berg <johannes.berg@intel.com> | 2011-05-14 11:00:52 +0200 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-05-16 14:25:29 -0400 |
commit | 1928ecab620907a0953f811316d05f367f3f4dba (patch) | |
tree | c97ce24a7d86ad58c148ef8905c72c5705d12f4a /net/mac80211/mesh.h | |
parent | d07c7cf49ae7c488e778c4d668f4cc10bd2fa971 (diff) | |
download | linux-3.10-1928ecab620907a0953f811316d05f367f3f4dba.tar.gz linux-3.10-1928ecab620907a0953f811316d05f367f3f4dba.tar.bz2 linux-3.10-1928ecab620907a0953f811316d05f367f3f4dba.zip |
mac80211: fix and simplify mesh locking
The locking in mesh_{mpath,mpp}_table_grow not only
has an rcu_read_unlock() missing, it's also racy
(though really only technically since it's invoked
from a single function only) since it obtains the
new size of the table without any locking, so two
invocations of the function could attempt the same
resize.
Additionally, it uses synchronize_rcu() which is
rather expensive and can be avoided trivially here.
Modify the functions to only use the table lock
and use call_rcu() instead of synchronize_rcu().
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/mesh.h')
-rw-r--r-- | net/mac80211/mesh.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/net/mac80211/mesh.h b/net/mac80211/mesh.h index e7c5fddb480..eb733c0d61a 100644 --- a/net/mac80211/mesh.h +++ b/net/mac80211/mesh.h @@ -120,6 +120,7 @@ struct mesh_path { * buckets * @mean_chain_len: maximum average length for the hash buckets' list, if it is * reached, the table will grow + * rcu_head: RCU head to free the table */ struct mesh_table { /* Number of buckets will be 2^N */ @@ -132,6 +133,8 @@ struct mesh_table { int (*copy_node) (struct hlist_node *p, struct mesh_table *newtbl); int size_order; int mean_chain_len; + + struct rcu_head rcu_head; }; /* Recent multicast cache */ |