Commit c651b461 authored by David S. Miller's avatar David S. Miller

Merge tag 'mac80211-for-net-2020-04-24' of...

Merge tag 'mac80211-for-net-2020-04-24' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211

Johannes Berg says:

====================
Just three changes:
 * fix a wrong GFP_KERNEL in hwsim
 * fix the debugfs mess after the mac80211 registration race fix
 * suppress false-positive RCU list lockdep warnings
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 0303b3a1 8ca47eb9
...@@ -374,7 +374,7 @@ il3945_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, u8 sta_id) ...@@ -374,7 +374,7 @@ il3945_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, u8 sta_id)
} }
static void * static void *
il3945_rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) il3945_rs_alloc(struct ieee80211_hw *hw)
{ {
return hw->priv; return hw->priv;
} }
......
...@@ -2474,7 +2474,7 @@ il4965_rs_fill_link_cmd(struct il_priv *il, struct il_lq_sta *lq_sta, ...@@ -2474,7 +2474,7 @@ il4965_rs_fill_link_cmd(struct il_priv *il, struct il_lq_sta *lq_sta,
} }
static void * static void *
il4965_rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) il4965_rs_alloc(struct ieee80211_hw *hw)
{ {
return hw->priv; return hw->priv;
} }
......
...@@ -3019,7 +3019,7 @@ static void rs_fill_link_cmd(struct iwl_priv *priv, ...@@ -3019,7 +3019,7 @@ static void rs_fill_link_cmd(struct iwl_priv *priv,
cpu_to_le16(priv->lib->bt_params->agg_time_limit); 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; return hw->priv;
} }
......
...@@ -3665,7 +3665,7 @@ static void rs_fill_lq_cmd(struct iwl_mvm *mvm, ...@@ -3665,7 +3665,7 @@ static void rs_fill_lq_cmd(struct iwl_mvm *mvm,
cpu_to_le16(iwl_mvm_coex_agg_time_limit(mvm, sta)); 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; return hw->priv;
} }
......
...@@ -4068,7 +4068,7 @@ static void hwsim_virtio_rx_work(struct work_struct *work) ...@@ -4068,7 +4068,7 @@ static void hwsim_virtio_rx_work(struct work_struct *work)
} }
vq = hwsim_vqs[HWSIM_VQ_RX]; vq = hwsim_vqs[HWSIM_VQ_RX];
sg_init_one(sg, skb->head, skb_end_offset(skb)); sg_init_one(sg, skb->head, skb_end_offset(skb));
err = virtqueue_add_inbuf(vq, sg, 1, skb, GFP_KERNEL); err = virtqueue_add_inbuf(vq, sg, 1, skb, GFP_ATOMIC);
if (WARN(err, "virtqueue_add_inbuf returned %d\n", err)) if (WARN(err, "virtqueue_add_inbuf returned %d\n", err))
nlmsg_free(skb); nlmsg_free(skb);
else else
......
...@@ -261,7 +261,7 @@ static void rtl_rate_update(void *ppriv, ...@@ -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); struct rtl_priv *rtlpriv = rtl_priv(hw);
return rtlpriv; return rtlpriv;
......
...@@ -6007,7 +6007,9 @@ enum rate_control_capabilities { ...@@ -6007,7 +6007,9 @@ enum rate_control_capabilities {
struct rate_control_ops { struct rate_control_ops {
unsigned long capa; unsigned long capa;
const char *name; 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 (*free)(void *priv);
void *(*alloc_sta)(void *priv, struct ieee80211_sta *sta, gfp_t gfp); void *(*alloc_sta)(void *priv, struct ieee80211_sta *sta, gfp_t gfp);
......
...@@ -1183,8 +1183,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) ...@@ -1183,8 +1183,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
local->tx_headroom = max_t(unsigned int , local->hw.extra_tx_headroom, local->tx_headroom = max_t(unsigned int , local->hw.extra_tx_headroom,
IEEE80211_TX_STATUS_HEADROOM); IEEE80211_TX_STATUS_HEADROOM);
debugfs_hw_add(local);
/* /*
* if the driver doesn't specify a max listen interval we * if the driver doesn't specify a max listen interval we
* use 5 which should be a safe default * use 5 which should be a safe default
...@@ -1273,6 +1271,9 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) ...@@ -1273,6 +1271,9 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
if (result < 0) if (result < 0)
goto fail_wiphy_register; goto fail_wiphy_register;
debugfs_hw_add(local);
rate_control_add_debugfs(local);
rtnl_lock(); rtnl_lock();
/* add one default STA interface if supported */ /* add one default STA interface if supported */
......
...@@ -214,17 +214,16 @@ static ssize_t rcname_read(struct file *file, char __user *userbuf, ...@@ -214,17 +214,16 @@ static ssize_t rcname_read(struct file *file, char __user *userbuf,
ref->ops->name, len); ref->ops->name, len);
} }
static const struct file_operations rcname_ops = { const struct file_operations rcname_ops = {
.read = rcname_read, .read = rcname_read,
.open = simple_open, .open = simple_open,
.llseek = default_llseek, .llseek = default_llseek,
}; };
#endif #endif
static struct rate_control_ref *rate_control_alloc(const char *name, static struct rate_control_ref *
struct ieee80211_local *local) rate_control_alloc(const char *name, struct ieee80211_local *local)
{ {
struct dentry *debugfsdir = NULL;
struct rate_control_ref *ref; struct rate_control_ref *ref;
ref = kmalloc(sizeof(struct rate_control_ref), GFP_KERNEL); ref = kmalloc(sizeof(struct rate_control_ref), GFP_KERNEL);
...@@ -234,13 +233,7 @@ static struct rate_control_ref *rate_control_alloc(const char *name, ...@@ -234,13 +233,7 @@ static struct rate_control_ref *rate_control_alloc(const char *name,
if (!ref->ops) if (!ref->ops)
goto free; goto free;
#ifdef CONFIG_MAC80211_DEBUGFS ref->priv = ref->ops->alloc(&local->hw);
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);
if (!ref->priv) if (!ref->priv)
goto free; goto free;
return ref; return ref;
......
...@@ -60,6 +60,29 @@ static inline void rate_control_add_sta_debugfs(struct sta_info *sta) ...@@ -60,6 +60,29 @@ static inline void rate_control_add_sta_debugfs(struct sta_info *sta)
#endif #endif
} }
extern const struct file_operations rcname_ops;
static inline void rate_control_add_debugfs(struct ieee80211_local *local)
{
#ifdef CONFIG_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); 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 /* Get a reference to the rate control algorithm. If `name' is NULL, get the
......
...@@ -1635,7 +1635,7 @@ minstrel_ht_init_cck_rates(struct minstrel_priv *mp) ...@@ -1635,7 +1635,7 @@ minstrel_ht_init_cck_rates(struct minstrel_priv *mp)
} }
static void * static void *
minstrel_ht_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) minstrel_ht_alloc(struct ieee80211_hw *hw)
{ {
struct minstrel_priv *mp; struct minstrel_priv *mp;
...@@ -1673,7 +1673,17 @@ minstrel_ht_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) ...@@ -1673,7 +1673,17 @@ minstrel_ht_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
mp->update_interval = HZ / 10; mp->update_interval = HZ / 10;
mp->new_avg = true; mp->new_avg = true;
minstrel_ht_init_cck_rates(mp);
return mp;
}
#ifdef CONFIG_MAC80211_DEBUGFS #ifdef CONFIG_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; mp->fixed_rate_idx = (u32) -1;
debugfs_create_u32("fixed_rate_idx", S_IRUGO | S_IWUGO, debugfsdir, debugfs_create_u32("fixed_rate_idx", S_IRUGO | S_IWUGO, debugfsdir,
&mp->fixed_rate_idx); &mp->fixed_rate_idx);
...@@ -1681,12 +1691,8 @@ minstrel_ht_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) ...@@ -1681,12 +1691,8 @@ minstrel_ht_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
&mp->sample_switch); &mp->sample_switch);
debugfs_create_bool("new_avg", S_IRUGO | S_IWUSR, debugfsdir, debugfs_create_bool("new_avg", S_IRUGO | S_IWUSR, debugfsdir,
&mp->new_avg); &mp->new_avg);
#endif
minstrel_ht_init_cck_rates(mp);
return mp;
} }
#endif
static void static void
minstrel_ht_free(void *priv) minstrel_ht_free(void *priv)
...@@ -1725,6 +1731,7 @@ static const struct rate_control_ops mac80211_minstrel_ht = { ...@@ -1725,6 +1731,7 @@ static const struct rate_control_ops mac80211_minstrel_ht = {
.alloc = minstrel_ht_alloc, .alloc = minstrel_ht_alloc,
.free = minstrel_ht_free, .free = minstrel_ht_free,
#ifdef CONFIG_MAC80211_DEBUGFS #ifdef CONFIG_MAC80211_DEBUGFS
.add_debugfs = minstrel_ht_add_debugfs,
.add_sta_debugfs = minstrel_ht_add_sta_debugfs, .add_sta_debugfs = minstrel_ht_add_sta_debugfs,
#endif #endif
.get_expected_throughput = minstrel_ht_get_expected_throughput, .get_expected_throughput = minstrel_ht_get_expected_throughput,
......
...@@ -231,7 +231,8 @@ struct sta_info *sta_info_get_by_idx(struct ieee80211_sub_if_data *sdata, ...@@ -231,7 +231,8 @@ struct sta_info *sta_info_get_by_idx(struct ieee80211_sub_if_data *sdata,
struct sta_info *sta; struct sta_info *sta;
int i = 0; int i = 0;
list_for_each_entry_rcu(sta, &local->sta_list, list) { list_for_each_entry_rcu(sta, &local->sta_list, list,
lockdep_is_held(&local->sta_mtx)) {
if (sdata != sta->sdata) if (sdata != sta->sdata)
continue; continue;
if (i < idx) { if (i < idx) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment