13cb7504f4
[ Upstream commit 851d0a73c90e6c8c63fef106c6c1e73df7e05d9d ] From: Joseph Huang <Joseph.Huang@garmin.com> When enabling multicast snooping, bridge module deadlocks on multicast_lock if 1) IPv6 is enabled, and 2) there is an existing querier on the same L2 network. The deadlock was caused by the following sequence: While holding the lock, br_multicast_open calls br_multicast_join_snoopers, which eventually causes IP stack to (attempt to) send out a Listener Report (in igmp6_join_group). Since the destination Ethernet address is a multicast address, br_dev_xmit feeds the packet back to the bridge via br_multicast_rcv, which in turn calls br_multicast_add_group, which then deadlocks on multicast_lock. The fix is to move the call br_multicast_join_snoopers outside of the critical section. This works since br_multicast_join_snoopers only deals with IP and does not modify any multicast data structures of the bridge, so there's no need to hold the lock. Steps to reproduce: 1. sysctl net.ipv6.conf.all.force_mld_version=1 2. have another querier 3. ip link set dev bridge type bridge mcast_snooping 0 && \ ip link set dev bridge type bridge mcast_snooping 1 < deadlock > A typical call trace looks like the following: [ 936.251495] _raw_spin_lock+0x5c/0x68 [ 936.255221] br_multicast_add_group+0x40/0x170 [bridge] [ 936.260491] br_multicast_rcv+0x7ac/0xe30 [bridge] [ 936.265322] br_dev_xmit+0x140/0x368 [bridge] [ 936.269689] dev_hard_start_xmit+0x94/0x158 [ 936.273876] __dev_queue_xmit+0x5ac/0x7f8 [ 936.277890] dev_queue_xmit+0x10/0x18 [ 936.281563] neigh_resolve_output+0xec/0x198 [ 936.285845] ip6_finish_output2+0x240/0x710 [ 936.290039] __ip6_finish_output+0x130/0x170 [ 936.294318] ip6_output+0x6c/0x1c8 [ 936.297731] NF_HOOK.constprop.0+0xd8/0xe8 [ 936.301834] igmp6_send+0x358/0x558 [ 936.305326] igmp6_join_group.part.0+0x30/0xf0 [ 936.309774] igmp6_group_added+0xfc/0x110 [ 936.313787] __ipv6_dev_mc_inc+0x1a4/0x290 [ 936.317885] ipv6_dev_mc_inc+0x10/0x18 [ 936.321677] br_multicast_open+0xbc/0x110 [bridge] [ 936.326506] br_multicast_toggle+0xec/0x140 [bridge] Fixes: 4effd28c1245 ("bridge: join all-snoopers multicast address") Signed-off-by: Joseph Huang <Joseph.Huang@garmin.com> Acked-by: Nikolay Aleksandrov <nikolay@nvidia.com> Link: https://lore.kernel.org/r/20201204235628.50653-1-Joseph.Huang@garmin.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> [linus.luessing@c0d3.blue: backported to 4.4] |
||
---|---|---|
.github | ||
contrib | ||
docs | ||
package | ||
patches | ||
scripts | ||
targets | ||
tests | ||
.editorconfig | ||
.gitignore | ||
.luacheckrc | ||
CONTRIBUTING.md | ||
LICENSE | ||
Makefile | ||
modules | ||
README.md |
Documentation (incomplete at this time, contribute if you can!) may be found at https://gluon.readthedocs.io/.
If you're new to Gluon and ready to get your feet wet, have a look at the Getting Started Guide.
Gluon's developers frequent an IRC chatroom at #gluon on hackint. There is also a webchat that allows for access from within your browser.
Issues & Feature requests
Before opening an issue, make sure to check whether any existing issues (open or closed) match. If you're suggesting a new feature, drop by on IRC or our mailinglist to discuss it first.
We maintain a Roadmap for the future development of Gluon.
Use a release!
Please refrain from using the master
branch for anything else but development purposes!
Use the most recent release instead. You can list all releases by running git tag
and switch to one by running git checkout v2020.2.2 && make update
.
If you're using the autoupdater, do not autoupdate nodes with anything but releases. If you upgrade using random master commits the nodes will break eventually.
Mailinglist
To subscribe to the list, send a message to:
gluon+subscribe@luebeck.freifunk.net
To remove your address from the list, just send a message to
the address in the List-Unsubscribe
header of any list
message. If you haven't changed addresses since subscribing,
you can also send a message to:
gluon+unsubscribe@luebeck.freifunk.net