forked from openwrt/openwrt
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
mac80211: compatibility with kernel 6.6.59
Fix genlmsg_multicast_allns() build error on kernel 6.6.59. Based on kernel patch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit?h=v6.6.59&id=e0f83d268974dab0361d11904dfc9acec53f96a6 Signed-off-by: Mieczyslaw Nalewaj <[email protected]> Link: openwrt#16835 (cherry picked from commit 31f1dab) Link: openwrt#16882 Signed-off-by: Hauke Mehrtens <[email protected]>
- Loading branch information
Showing
3 changed files
with
177 additions
and
8 deletions.
There are no files selected for viewing
169 changes: 169 additions & 0 deletions
169
...mac80211/patches/build/236-fix-genlmsg_multicast_allns-build-error-on-kernel-6.6.59.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,169 @@ | ||
From e0f83d268974dab0361d11904dfc9acec53f96a6 Mon Sep 17 00:00:00 2001 | ||
From: Eric Dumazet <[email protected]> | ||
Date: Fri, 11 Oct 2024 17:12:17 +0000 | ||
Subject: [PATCH] genetlink: hold RCU in genlmsg_mcast() | ||
|
||
[ Upstream commit 56440d7ec28d60f8da3bfa09062b3368ff9b16db ] | ||
|
||
While running net selftests with CONFIG_PROVE_RCU_LIST=y I saw | ||
one lockdep splat [1]. | ||
|
||
genlmsg_mcast() uses for_each_net_rcu(), and must therefore hold RCU. | ||
|
||
Instead of letting all callers guard genlmsg_multicast_allns() | ||
with a rcu_read_lock()/rcu_read_unlock() pair, do it in genlmsg_mcast(). | ||
|
||
This also means the @flags parameter is useless, we need to always use | ||
GFP_ATOMIC. | ||
|
||
[1] | ||
[10882.424136] ============================= | ||
[10882.424166] WARNING: suspicious RCU usage | ||
[10882.424309] 6.12.0-rc2-virtme #1156 Not tainted | ||
[10882.424400] ----------------------------- | ||
[10882.424423] net/netlink/genetlink.c:1940 RCU-list traversed in non-reader section!! | ||
[10882.424469] | ||
other info that might help us debug this: | ||
|
||
[10882.424500] | ||
rcu_scheduler_active = 2, debug_locks = 1 | ||
[10882.424744] 2 locks held by ip/15677: | ||
[10882.424791] #0: ffffffffb6b491b0 (cb_lock){++++}-{3:3}, at: genl_rcv (net/netlink/genetlink.c:1219) | ||
[10882.426334] #1: ffffffffb6b49248 (genl_mutex){+.+.}-{3:3}, at: genl_rcv_msg (net/netlink/genetlink.c:61 net/netlink/genetlink.c:57 net/netlink/genetlink.c:1209) | ||
[10882.426465] | ||
stack backtrace: | ||
[10882.426805] CPU: 14 UID: 0 PID: 15677 Comm: ip Not tainted 6.12.0-rc2-virtme #1156 | ||
[10882.426919] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 | ||
[10882.427046] Call Trace: | ||
[10882.427131] <TASK> | ||
[10882.427244] dump_stack_lvl (lib/dump_stack.c:123) | ||
[10882.427335] lockdep_rcu_suspicious (kernel/locking/lockdep.c:6822) | ||
[10882.427387] genlmsg_multicast_allns (net/netlink/genetlink.c:1940 (discriminator 7) net/netlink/genetlink.c:1977 (discriminator 7)) | ||
[10882.427436] l2tp_tunnel_notify.constprop.0 (net/l2tp/l2tp_netlink.c:119) l2tp_netlink | ||
[10882.427683] l2tp_nl_cmd_tunnel_create (net/l2tp/l2tp_netlink.c:253) l2tp_netlink | ||
[10882.427748] genl_family_rcv_msg_doit (net/netlink/genetlink.c:1115) | ||
[10882.427834] genl_rcv_msg (net/netlink/genetlink.c:1195 net/netlink/genetlink.c:1210) | ||
[10882.427877] ? __pfx_l2tp_nl_cmd_tunnel_create (net/l2tp/l2tp_netlink.c:186) l2tp_netlink | ||
[10882.427927] ? __pfx_genl_rcv_msg (net/netlink/genetlink.c:1201) | ||
[10882.427959] netlink_rcv_skb (net/netlink/af_netlink.c:2551) | ||
[10882.428069] genl_rcv (net/netlink/genetlink.c:1220) | ||
[10882.428095] netlink_unicast (net/netlink/af_netlink.c:1332 net/netlink/af_netlink.c:1357) | ||
[10882.428140] netlink_sendmsg (net/netlink/af_netlink.c:1901) | ||
[10882.428210] ____sys_sendmsg (net/socket.c:729 (discriminator 1) net/socket.c:744 (discriminator 1) net/socket.c:2607 (discriminator 1)) | ||
|
||
Fixes: 33f72e6f0c67 ("l2tp : multicast notification to the registered listeners") | ||
Signed-off-by: Eric Dumazet <[email protected]> | ||
Cc: James Chapman <[email protected]> | ||
Cc: Tom Parkin <[email protected]> | ||
Cc: Johannes Berg <[email protected]> | ||
Link: https://patch.msgid.link/[email protected] | ||
Signed-off-by: Jakub Kicinski <[email protected]> | ||
Signed-off-by: Sasha Levin <[email protected]> | ||
--- | ||
drivers/target/target_core_user.c | 2 +- | ||
include/net/genetlink.h | 3 +-- | ||
net/l2tp/l2tp_netlink.c | 4 ++-- | ||
net/netlink/genetlink.c | 28 ++++++++++++++-------------- | ||
net/wireless/nl80211.c | 8 ++------ | ||
5 files changed, 20 insertions(+), 25 deletions(-) | ||
|
||
--- a/backport-include/net/genetlink.h | ||
+++ b/backport-include/net/genetlink.h | ||
@@ -150,7 +150,7 @@ int genlmsg_multicast(const struct genl_ | ||
#define genlmsg_multicast_allns LINUX_BACKPORT(genlmsg_multicast_allns) | ||
int backport_genlmsg_multicast_allns(const struct genl_family *family, | ||
struct sk_buff *skb, u32 portid, | ||
- unsigned int group, gfp_t flags); | ||
+ unsigned int group); | ||
|
||
#define genl_family_attrbuf LINUX_BACKPORT(genl_family_attrbuf) | ||
static inline struct nlattr **genl_family_attrbuf(struct genl_family *family) | ||
--- a/compat/backport-genetlink.c | ||
+++ b/compat/backport-genetlink.c | ||
@@ -198,23 +198,23 @@ int genlmsg_multicast(const struct genl_ | ||
} | ||
EXPORT_SYMBOL_GPL(genlmsg_multicast); | ||
|
||
-static int genlmsg_mcast(struct sk_buff *skb, u32 portid, unsigned long group, | ||
- gfp_t flags) | ||
+static int genlmsg_mcast(struct sk_buff *skb, u32 portid, unsigned long group) | ||
{ | ||
struct sk_buff *tmp; | ||
struct net *net, *prev = NULL; | ||
bool delivered = false; | ||
int err; | ||
|
||
+ rcu_read_lock(); | ||
for_each_net_rcu(net) { | ||
if (prev) { | ||
- tmp = skb_clone(skb, flags); | ||
+ tmp = skb_clone(skb, GFP_ATOMIC); | ||
if (!tmp) { | ||
err = -ENOMEM; | ||
goto error; | ||
} | ||
err = nlmsg_multicast(prev->genl_sock, tmp, | ||
- portid, group, flags); | ||
+ portid, group, GFP_ATOMIC); | ||
if (!err) | ||
delivered = true; | ||
else if (err != -ESRCH) | ||
@@ -223,25 +223,29 @@ static int genlmsg_mcast(struct sk_buff | ||
|
||
prev = net; | ||
} | ||
+ err = nlmsg_multicast(prev->genl_sock, skb, portid, group, GFP_ATOMIC); | ||
+ | ||
+ rcu_read_unlock(); | ||
|
||
- err = nlmsg_multicast(prev->genl_sock, skb, portid, group, flags); | ||
if (!err) | ||
delivered = true; | ||
else if (err != -ESRCH) | ||
return err; | ||
return delivered ? 0 : -ESRCH; | ||
error: | ||
+ rcu_read_unlock(); | ||
+ | ||
kfree_skb(skb); | ||
return err; | ||
} | ||
|
||
int backport_genlmsg_multicast_allns(const struct genl_family *family, | ||
struct sk_buff *skb, u32 portid, | ||
- unsigned int group, gfp_t flags) | ||
+ unsigned int group) | ||
{ | ||
group = __backport_genl_group(family, group); | ||
if (group == INVALID_GROUP) | ||
return -EINVAL; | ||
- return genlmsg_mcast(skb, portid, group, flags); | ||
+ return genlmsg_mcast(skb, portid, group); | ||
} | ||
EXPORT_SYMBOL_GPL(backport_genlmsg_multicast_allns); | ||
--- a/net/wireless/nl80211.c | ||
+++ b/net/wireless/nl80211.c | ||
@@ -17627,10 +17627,8 @@ void nl80211_common_reg_change_event(enu | ||
|
||
genlmsg_end(msg, hdr); | ||
|
||
- rcu_read_lock(); | ||
genlmsg_multicast_allns(&nl80211_fam, msg, 0, | ||
- NL80211_MCGRP_REGULATORY, GFP_ATOMIC); | ||
- rcu_read_unlock(); | ||
+ NL80211_MCGRP_REGULATORY); | ||
|
||
return; | ||
|
||
@@ -18248,10 +18246,8 @@ void nl80211_send_beacon_hint_event(stru | ||
|
||
genlmsg_end(msg, hdr); | ||
|
||
- rcu_read_lock(); | ||
genlmsg_multicast_allns(&nl80211_fam, msg, 0, | ||
- NL80211_MCGRP_REGULATORY, GFP_ATOMIC); | ||
- rcu_read_unlock(); | ||
+ NL80211_MCGRP_REGULATORY); | ||
|
||
return; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -97,7 +97,7 @@ Signed-off-by: Johannes Berg <[email protected]> | |
void cfg80211_autodisconnect_wk(struct work_struct *work); | ||
--- a/net/wireless/nl80211.c | ||
+++ b/net/wireless/nl80211.c | ||
@@ -18024,7 +18024,8 @@ void nl80211_send_roamed(struct cfg80211 | ||
@@ -18022,7 +18022,8 @@ void nl80211_send_roamed(struct cfg80211 | ||
} | ||
|
||
void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev, | ||
|
@@ -107,7 +107,7 @@ Signed-off-by: Johannes Berg <[email protected]> | |
{ | ||
struct sk_buff *msg; | ||
void *hdr; | ||
@@ -18044,6 +18045,11 @@ void nl80211_send_port_authorized(struct | ||
@@ -18042,6 +18043,11 @@ void nl80211_send_port_authorized(struct | ||
nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) | ||
goto nla_put_failure; | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -132,7 +132,7 @@ Signed-off-by: Johannes Berg <[email protected]> | |
/* use driver's channel switch callback */ | ||
--- a/net/wireless/nl80211.c | ||
+++ b/net/wireless/nl80211.c | ||
@@ -19085,7 +19085,7 @@ static void nl80211_ch_switch_notify(str | ||
@@ -19081,7 +19081,7 @@ static void nl80211_ch_switch_notify(str | ||
struct cfg80211_chan_def *chandef, | ||
gfp_t gfp, | ||
enum nl80211_commands notif, | ||
|
@@ -141,7 +141,7 @@ Signed-off-by: Johannes Berg <[email protected]> | |
{ | ||
struct wireless_dev *wdev = netdev->ieee80211_ptr; | ||
struct sk_buff *msg; | ||
@@ -19119,6 +19119,9 @@ static void nl80211_ch_switch_notify(str | ||
@@ -19115,6 +19115,9 @@ static void nl80211_ch_switch_notify(str | ||
goto nla_put_failure; | ||
} | ||
|
||
|
@@ -151,7 +151,7 @@ Signed-off-by: Johannes Berg <[email protected]> | |
genlmsg_end(msg, hdr); | ||
|
||
genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, | ||
@@ -19131,7 +19134,7 @@ static void nl80211_ch_switch_notify(str | ||
@@ -19127,7 +19130,7 @@ static void nl80211_ch_switch_notify(str | ||
|
||
void cfg80211_ch_switch_notify(struct net_device *dev, | ||
struct cfg80211_chan_def *chandef, | ||
|
@@ -160,7 +160,7 @@ Signed-off-by: Johannes Berg <[email protected]> | |
{ | ||
struct wireless_dev *wdev = dev->ieee80211_ptr; | ||
struct wiphy *wiphy = wdev->wiphy; | ||
@@ -19140,7 +19143,7 @@ void cfg80211_ch_switch_notify(struct ne | ||
@@ -19136,7 +19139,7 @@ void cfg80211_ch_switch_notify(struct ne | ||
ASSERT_WDEV_LOCK(wdev); | ||
WARN_INVALID_LINK_ID(wdev, link_id); | ||
|
||
|
@@ -169,7 +169,7 @@ Signed-off-by: Johannes Berg <[email protected]> | |
|
||
switch (wdev->iftype) { | ||
case NL80211_IFTYPE_STATION: | ||
@@ -19168,14 +19171,15 @@ void cfg80211_ch_switch_notify(struct ne | ||
@@ -19164,14 +19167,15 @@ void cfg80211_ch_switch_notify(struct ne | ||
cfg80211_sched_dfs_chan_update(rdev); | ||
|
||
nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL, | ||
|
@@ -187,7 +187,7 @@ Signed-off-by: Johannes Berg <[email protected]> | |
{ | ||
struct wireless_dev *wdev = dev->ieee80211_ptr; | ||
struct wiphy *wiphy = wdev->wiphy; | ||
@@ -19184,11 +19188,13 @@ void cfg80211_ch_switch_started_notify(s | ||
@@ -19180,11 +19184,13 @@ void cfg80211_ch_switch_started_notify(s | ||
ASSERT_WDEV_LOCK(wdev); | ||
WARN_INVALID_LINK_ID(wdev, link_id); | ||
|
||
|