diff options
author | Nikolay Aleksandrov <nikolay@cumulusnetworks.com> | 2018-12-05 15:14:24 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-12-05 17:01:51 -0800 |
commit | 19e3a9c90c53479fecaa02307bf2db5ab8b3ffe3 (patch) | |
tree | 02a1154ab53b70ef1eafc301ec79cc4a3f14c3e5 /net/bridge/br_sysfs_br.c | |
parent | ba5dfaff195557209015add52e57191899ccfca0 (diff) | |
download | linux-stable-19e3a9c90c53479fecaa02307bf2db5ab8b3ffe3.tar.gz linux-stable-19e3a9c90c53479fecaa02307bf2db5ab8b3ffe3.tar.bz2 linux-stable-19e3a9c90c53479fecaa02307bf2db5ab8b3ffe3.zip |
net: bridge: convert multicast to generic rhashtable
The bridge multicast code currently uses a custom resizable hashtable
which predates the generic rhashtable interface. It has many
shortcomings compared and duplicates functionality that is presently
available via the generic rhashtable, so this patch removes the custom
rhashtable implementation in favor of the kernel's generic rhashtable.
The hash maximum is kept and the rhashtable's size is used to do a loose
check if it's reached in which case we revert to the old behaviour and
disable further bridge multicast processing. Also now we can support any
hash maximum, doesn't need to be a power of 2.
v3: add non-rcu br_mdb_get variant and use it where multicast_lock is
held to avoid RCU splat, drop hash_max function and just set it
directly
v2: handle when IGMP snooping is undefined, add br_mdb_init/uninit
placeholders
Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bridge/br_sysfs_br.c')
-rw-r--r-- | net/bridge/br_sysfs_br.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/net/bridge/br_sysfs_br.c b/net/bridge/br_sysfs_br.c index 6a378a7e16ea..f164cda30fe2 100644 --- a/net/bridge/br_sysfs_br.c +++ b/net/bridge/br_sysfs_br.c @@ -449,10 +449,16 @@ static ssize_t hash_max_show(struct device *d, struct device_attribute *attr, return sprintf(buf, "%u\n", br->hash_max); } +static int set_hash_max(struct net_bridge *br, unsigned long val) +{ + br->hash_max = val; + return 0; +} + static ssize_t hash_max_store(struct device *d, struct device_attribute *attr, const char *buf, size_t len) { - return store_bridge_parm(d, buf, len, br_multicast_set_hash_max); + return store_bridge_parm(d, buf, len, set_hash_max); } static DEVICE_ATTR_RW(hash_max); |