diff options
| author | David S. Miller <davem@davemloft.net> | 2018-12-05 17:01:51 -0800 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2018-12-05 17:01:51 -0800 |
| commit | 932c4417077958fe486e6d8a64a06e65d664cb85 (patch) | |
| tree | f78b107ea4b36adf481fbe3ca32cc89bb084f6bb /net/bridge/br_device.c | |
| parent | ba5dfaff195557209015add52e57191899ccfca0 (diff) | |
| parent | d08c6bc08f72f74cd37f6b7954e3f708005518f9 (diff) | |
Merge branch 'net-bridge-convert-multicast-to-generic-rhashtable'
Nikolay Aleksandrov says:
====================
net: bridge: convert multicast to generic rhashtable
The current bridge multicast code uses a custom rhashtable
implementation which predates the generic rhashtable API. Patch 01
converts it to use the generic kernel rhashtable which simplifies the
code a lot and removes duplicated functionality. The convert also makes
hash_elasticity obsolete as the generic rhashtable already has such
checks and has a fixed elasticity of RHT_ELASTICITY (16 currently) so we
emit a warning whenever elasticity is set and return RHT_ELASTICITY when
read (patch 03). Patch 02 converts the multicast code to use non-bh RCU
flavor as it was mixing bh and non-bh. Since now we have the generic
rhashtable which autoshrinks we can be more liberal with the default
hash maximum so patch 04 increases it to 4096 and moves it to a define in
br_private.h.
v3: add non-rcu br_mdb_get variant and use it where we have
multicast_lock, drop special hash_max handling and just set it where
needed and use non-bh RCU consistently (patch 02, new)
v2: send the latest version of the set which handles when IGMP snooping
is not defined, changes are in patch 01
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bridge/br_device.c')
| -rw-r--r-- | net/bridge/br_device.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index c6abf927f0c9..9f41a5d4da3f 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c @@ -131,9 +131,17 @@ static int br_dev_init(struct net_device *dev) return err; } + err = br_mdb_hash_init(br); + if (err) { + free_percpu(br->stats); + br_fdb_hash_fini(br); + return err; + } + err = br_vlan_init(br); if (err) { free_percpu(br->stats); + br_mdb_hash_fini(br); br_fdb_hash_fini(br); return err; } @@ -142,6 +150,7 @@ static int br_dev_init(struct net_device *dev) if (err) { free_percpu(br->stats); br_vlan_flush(br); + br_mdb_hash_fini(br); br_fdb_hash_fini(br); } br_set_lockdep_class(dev); @@ -156,6 +165,7 @@ static void br_dev_uninit(struct net_device *dev) br_multicast_dev_del(br); br_multicast_uninit_stats(br); br_vlan_flush(br); + br_mdb_hash_fini(br); br_fdb_hash_fini(br); free_percpu(br->stats); } |
