From 9ca21dc7d59e2e0c7f97e440e71ea93c5275219b Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Fri, 13 Mar 2020 14:26:51 +0100 Subject: mac80211: Update to version 5.5.19 This updates the mac80211 backport. The removed patches are already integrated in the upstream version. Signed-off-by: Hauke Mehrtens --- ...populate-debugfs-only-after-cfg80211-init.patch | 248 +++++++++++++++++++++ 1 file changed, 248 insertions(+) create mode 100644 package/kernel/mac80211/patches/subsys/250-mac80211-populate-debugfs-only-after-cfg80211-init.patch (limited to 'package/kernel/mac80211/patches/subsys/250-mac80211-populate-debugfs-only-after-cfg80211-init.patch') diff --git a/package/kernel/mac80211/patches/subsys/250-mac80211-populate-debugfs-only-after-cfg80211-init.patch b/package/kernel/mac80211/patches/subsys/250-mac80211-populate-debugfs-only-after-cfg80211-init.patch new file mode 100644 index 0000000000..efe216c530 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/250-mac80211-populate-debugfs-only-after-cfg80211-init.patch @@ -0,0 +1,248 @@ +From 6cb5f3ea4654faf8c28b901266e960b1a4787b26 Mon Sep 17 00:00:00 2001 +From: Johannes Berg +Date: Thu, 23 Apr 2020 11:13:49 +0200 +Subject: [PATCH] mac80211: populate debugfs only after cfg80211 init + +When fixing the initialization race, we neglected to account for +the fact that debugfs is initialized in wiphy_register(), and +some debugfs things went missing (or rather were rerooted to the +global debugfs root). + +Fix this by adding debugfs entries only after wiphy_register(). +This requires some changes in the rate control code since it +currently adds debugfs at alloc time, which can no longer be +done after the reordering. + +Reported-by: Jouni Malinen +Reported-by: kernel test robot +Reported-by: Hauke Mehrtens +Reported-by: Felix Fietkau +Cc: stable@vger.kernel.org +Fixes: 52e04b4ce5d0 ("mac80211: fix race in ieee80211_register_hw()") +Signed-off-by: Johannes Berg +Acked-by: Sumit Garg +Link: https://lore.kernel.org/r/20200423111344.0e00d3346f12.Iadc76a03a55093d94391fc672e996a458702875d@changeid +Signed-off-by: Johannes Berg +--- + drivers/net/wireless/intel/iwlegacy/3945-rs.c | 2 +- + drivers/net/wireless/intel/iwlegacy/4965-rs.c | 2 +- + drivers/net/wireless/intel/iwlwifi/dvm/rs.c | 2 +- + drivers/net/wireless/intel/iwlwifi/mvm/rs.c | 2 +- + drivers/net/wireless/realtek/rtlwifi/rc.c | 2 +- + include/net/mac80211.h | 4 +++- + net/mac80211/main.c | 5 ++-- + net/mac80211/rate.c | 15 ++++-------- + net/mac80211/rate.h | 23 +++++++++++++++++++ + net/mac80211/rc80211_minstrel_ht.c | 19 ++++++++++----- + 10 files changed, 51 insertions(+), 25 deletions(-) + +--- a/drivers/net/wireless/intel/iwlegacy/3945-rs.c ++++ b/drivers/net/wireless/intel/iwlegacy/3945-rs.c +@@ -374,7 +374,7 @@ out: + } + + static void * +-il3945_rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) ++il3945_rs_alloc(struct ieee80211_hw *hw) + { + return hw->priv; + } +--- a/drivers/net/wireless/intel/iwlegacy/4965-rs.c ++++ b/drivers/net/wireless/intel/iwlegacy/4965-rs.c +@@ -2474,7 +2474,7 @@ il4965_rs_fill_link_cmd(struct il_priv * + } + + static void * +-il4965_rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) ++il4965_rs_alloc(struct ieee80211_hw *hw) + { + return hw->priv; + } +--- a/drivers/net/wireless/intel/iwlwifi/dvm/rs.c ++++ b/drivers/net/wireless/intel/iwlwifi/dvm/rs.c +@@ -3019,7 +3019,7 @@ static void rs_fill_link_cmd(struct iwl_ + cpu_to_le16(priv->lib->bt_params->agg_time_limit); + } + +-static void *rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) ++static void *rs_alloc(struct ieee80211_hw *hw) + { + return hw->priv; + } +--- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c +@@ -3665,7 +3665,7 @@ static void rs_fill_lq_cmd(struct iwl_mv + cpu_to_le16(iwl_mvm_coex_agg_time_limit(mvm, sta)); + } + +-static void *rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) ++static void *rs_alloc(struct ieee80211_hw *hw) + { + return hw->priv; + } +--- a/drivers/net/wireless/realtek/rtlwifi/rc.c ++++ b/drivers/net/wireless/realtek/rtlwifi/rc.c +@@ -261,7 +261,7 @@ static void rtl_rate_update(void *ppriv, + { + } + +-static void *rtl_rate_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) ++static void *rtl_rate_alloc(struct ieee80211_hw *hw) + { + struct rtl_priv *rtlpriv = rtl_priv(hw); + return rtlpriv; +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -5969,7 +5969,9 @@ enum rate_control_capabilities { + struct rate_control_ops { + unsigned long capa; + const char *name; +- void *(*alloc)(struct ieee80211_hw *hw, struct dentry *debugfsdir); ++ void *(*alloc)(struct ieee80211_hw *hw); ++ void (*add_debugfs)(struct ieee80211_hw *hw, void *priv, ++ struct dentry *debugfsdir); + void (*free)(void *priv); + + void *(*alloc_sta)(void *priv, struct ieee80211_sta *sta, gfp_t gfp); +--- a/net/mac80211/main.c ++++ b/net/mac80211/main.c +@@ -1163,8 +1163,6 @@ int ieee80211_register_hw(struct ieee802 + local->tx_headroom = max_t(unsigned int , local->hw.extra_tx_headroom, + IEEE80211_TX_STATUS_HEADROOM); + +- debugfs_hw_add(local); +- + /* + * if the driver doesn't specify a max listen interval we + * use 5 which should be a safe default +@@ -1256,6 +1254,9 @@ int ieee80211_register_hw(struct ieee802 + if (result < 0) + goto fail_wiphy_register; + ++ debugfs_hw_add(local); ++ rate_control_add_debugfs(local); ++ + rtnl_lock(); + + /* add one default STA interface if supported */ +--- a/net/mac80211/rate.c ++++ b/net/mac80211/rate.c +@@ -214,17 +214,16 @@ static ssize_t rcname_read(struct file * + ref->ops->name, len); + } + +-static const struct file_operations rcname_ops = { ++const struct file_operations rcname_ops = { + .read = rcname_read, + .open = simple_open, + .llseek = default_llseek, + }; + #endif + +-static struct rate_control_ref *rate_control_alloc(const char *name, +- struct ieee80211_local *local) ++static struct rate_control_ref * ++rate_control_alloc(const char *name, struct ieee80211_local *local) + { +- struct dentry *debugfsdir = NULL; + struct rate_control_ref *ref; + + ref = kmalloc(sizeof(struct rate_control_ref), GFP_KERNEL); +@@ -234,13 +233,7 @@ static struct rate_control_ref *rate_con + if (!ref->ops) + goto free; + +-#ifdef CPTCFG_MAC80211_DEBUGFS +- debugfsdir = debugfs_create_dir("rc", local->hw.wiphy->debugfsdir); +- local->debugfs.rcdir = debugfsdir; +- debugfs_create_file("name", 0400, debugfsdir, ref, &rcname_ops); +-#endif +- +- ref->priv = ref->ops->alloc(&local->hw, debugfsdir); ++ ref->priv = ref->ops->alloc(&local->hw); + if (!ref->priv) + goto free; + return ref; +--- a/net/mac80211/rate.h ++++ b/net/mac80211/rate.h +@@ -60,6 +60,29 @@ static inline void rate_control_add_sta_ + #endif + } + ++extern const struct file_operations rcname_ops; ++ ++static inline void rate_control_add_debugfs(struct ieee80211_local *local) ++{ ++#ifdef CPTCFG_MAC80211_DEBUGFS ++ struct dentry *debugfsdir; ++ ++ if (!local->rate_ctrl) ++ return; ++ ++ if (!local->rate_ctrl->ops->add_debugfs) ++ return; ++ ++ debugfsdir = debugfs_create_dir("rc", local->hw.wiphy->debugfsdir); ++ local->debugfs.rcdir = debugfsdir; ++ debugfs_create_file("name", 0400, debugfsdir, ++ local->rate_ctrl, &rcname_ops); ++ ++ local->rate_ctrl->ops->add_debugfs(&local->hw, local->rate_ctrl->priv, ++ debugfsdir); ++#endif ++} ++ + void ieee80211_check_rate_mask(struct ieee80211_sub_if_data *sdata); + + /* Get a reference to the rate control algorithm. If `name' is NULL, get the +--- a/net/mac80211/rc80211_minstrel_ht.c ++++ b/net/mac80211/rc80211_minstrel_ht.c +@@ -1635,7 +1635,7 @@ minstrel_ht_init_cck_rates(struct minstr + } + + static void * +-minstrel_ht_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) ++minstrel_ht_alloc(struct ieee80211_hw *hw) + { + struct minstrel_priv *mp; + +@@ -1673,7 +1673,17 @@ minstrel_ht_alloc(struct ieee80211_hw *h + mp->update_interval = HZ / 10; + mp->new_avg = true; + ++ minstrel_ht_init_cck_rates(mp); ++ ++ return mp; ++} ++ + #ifdef CPTCFG_MAC80211_DEBUGFS ++static void minstrel_ht_add_debugfs(struct ieee80211_hw *hw, void *priv, ++ struct dentry *debugfsdir) ++{ ++ struct minstrel_priv *mp = priv; ++ + mp->fixed_rate_idx = (u32) -1; + debugfs_create_u32("fixed_rate_idx", S_IRUGO | S_IWUGO, debugfsdir, + &mp->fixed_rate_idx); +@@ -1681,12 +1691,8 @@ minstrel_ht_alloc(struct ieee80211_hw *h + &mp->sample_switch); + debugfs_create_bool("new_avg", S_IRUGO | S_IWUSR, debugfsdir, + &mp->new_avg); +-#endif +- +- minstrel_ht_init_cck_rates(mp); +- +- return mp; + } ++#endif + + static void + minstrel_ht_free(void *priv) +@@ -1725,6 +1731,7 @@ static const struct rate_control_ops mac + .alloc = minstrel_ht_alloc, + .free = minstrel_ht_free, + #ifdef CPTCFG_MAC80211_DEBUGFS ++ .add_debugfs = minstrel_ht_add_debugfs, + .add_sta_debugfs = minstrel_ht_add_sta_debugfs, + #endif + .get_expected_throughput = minstrel_ht_get_expected_throughput, -- cgit v1.2.3