a modular framework for creating OpenWrt-based firmwares for wireless mesh nodes
Go to file
Linus Lüssing 13cb7504f4 kernel: bridge: Fix a deadlock when enabling multicast snooping
[ 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]
2021-01-25 03:16:06 +01:00
.github actions: run tasks based on set of modified paths 2021-01-02 17:25:51 +01:00
contrib actions: run tasks based on set of modified paths 2021-01-02 17:25:51 +01:00
docs ipq40xx: add support for Plasma Cloud PA2200 2021-01-13 08:28:12 +01:00
package ipq40xx: add support for Plasma Cloud PA2200 2021-01-13 08:28:12 +01:00
patches kernel: bridge: Fix a deadlock when enabling multicast snooping 2021-01-25 03:16:06 +01:00
scripts scripts: display commit title when updating patches 2020-10-11 01:59:55 +02:00
targets ipq40xx: add support for Plasma Cloud PA2200 2021-01-13 08:28:12 +01:00
tests tests: respondd: update shebang to use the environments python3 version 2020-04-29 22:28:00 +02:00
.editorconfig editorconfig: indent yaml with two spaces 2020-08-16 13:23:58 +02:00
.gitignore .gitignore: add files created when mounting repo in docker 2020-03-09 08:30:33 +01:00
.luacheckrc features: fix handling of logical expressions 2020-08-28 22:27:38 +02:00
CONTRIBUTING.md CONTRIBUTING.md: fix link to list of rejected features (#1785) 2019-07-13 14:32:41 +02:00
LICENSE LICENSE: update for 2021 2021-01-02 19:10:18 +01:00
Makefile build: add refresh-patches step 2020-10-11 01:40:45 +02:00
modules modules: update OpenWrt 2021-01-19 16:09:24 +01:00
README.md docs: add v2020.2.2 release notes 2020-12-11 04:13:20 +01:00

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