netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] mac80211: ath9k: Use RCU protection calling ieee80211_get_tx_rates
       [not found]   ` <1370950926.8356.14.camel@jlt4.sipsolutions.net>
@ 2013-06-11 17:13     ` Calvin Owens
  2013-06-11 19:55       ` Johannes Berg
  0 siblings, 1 reply; 7+ messages in thread
From: Calvin Owens @ 2013-06-11 17:13 UTC (permalink / raw)
  To: Johannes Berg, Luis R. Rodriguez, John W. Linville, Felix Fietkau
  Cc: linux-wireless, linux-kernel, ath9k-devel, netdev, jcalvinowens

Signed-off-by: Calvin Owens <jcalvinowens@gmail.com>
---
 drivers/net/wireless/ath/ath9k/xmit.c | 2 ++
 drivers/net/wireless/mac80211_hwsim.c | 6 ++++++
 include/net/mac80211.h                | 3 ++-
 3 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 1c9b1ba..1d57015 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -142,8 +142,10 @@ static void ath_send_bar(struct ath_atx_tid *tid, u16 seqno)
 static void ath_set_rates(struct ieee80211_vif *vif, struct ieee80211_sta *sta,
 			  struct ath_buf *bf)
 {
+	rcu_read_lock();
 	ieee80211_get_tx_rates(vif, sta, bf->bf_mpdu, bf->rates,
 			       ARRAY_SIZE(bf->rates));
+	rcu_read_unlock();
 }
 
 static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index cb34c78..468a5a6 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -900,9 +900,11 @@ static void mac80211_hwsim_tx(struct ieee80211_hw *hw,
 		hwsim_check_sta_magic(control->sta);
 
 	if (rctbl)
+		rcu_read_lock();
 		ieee80211_get_tx_rates(txi->control.vif, control->sta, skb,
 				       txi->control.rates,
 				       ARRAY_SIZE(txi->control.rates));
+		rcu_read_unlock();
 
 	txi->rate_driver_data[0] = channel;
 	mac80211_hwsim_monitor_rx(hw, skb, channel);
@@ -1008,9 +1010,11 @@ static void mac80211_hwsim_tx_frame(struct ieee80211_hw *hw,
 
 	if (rctbl) {
 		struct ieee80211_tx_info *txi = IEEE80211_SKB_CB(skb);
+		rcu_read_lock();
 		ieee80211_get_tx_rates(txi->control.vif, NULL, skb,
 				       txi->control.rates,
 				       ARRAY_SIZE(txi->control.rates));
+		rcu_read_unlock();
 	}
 
 	mac80211_hwsim_monitor_rx(hw, skb, chan);
@@ -1044,9 +1048,11 @@ static void mac80211_hwsim_beacon_tx(void *arg, u8 *mac,
 		return;
 	info = IEEE80211_SKB_CB(skb);
 	if (rctbl)
+		rcu_read_lock();
 		ieee80211_get_tx_rates(vif, NULL, skb,
 				       info->control.rates,
 				       ARRAY_SIZE(info->control.rates));
+		rcu_read_unlock();
 
 	txrate = ieee80211_get_tx_rate(hw, info);
 
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 885898a..df345c1 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -3175,7 +3175,8 @@ void ieee80211_sta_set_buffered(struct ieee80211_sta *sta,
  *
  * Call this function in a driver with per-packet rate selection support
  * to combine the rate info in the packet tx info with the most recent
- * rate selection table for the station entry.
+ * rate selection table for the station entry. Must be called with RCU
+ * protection.
  *
  * @vif: &struct ieee80211_vif pointer from the add_interface callback.
  * @sta: the receiver station to which this packet is sent.
-- 
1.8.2.1

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH] mac80211: ath9k: Use RCU protection calling ieee80211_get_tx_rates
  2013-06-11 17:13     ` [PATCH] mac80211: ath9k: Use RCU protection calling ieee80211_get_tx_rates Calvin Owens
@ 2013-06-11 19:55       ` Johannes Berg
       [not found]         ` <1370980523.8356.70.camel-8Nb76shvtaUJvtFkdXX2HixXY32XiHfO@public.gmane.org>
  2013-06-12  7:56         ` Calvin Owens
  0 siblings, 2 replies; 7+ messages in thread
From: Johannes Berg @ 2013-06-11 19:55 UTC (permalink / raw)
  To: Calvin Owens
  Cc: Luis R. Rodriguez, John W. Linville, Felix Fietkau,
	linux-wireless, linux-kernel, ath9k-devel, netdev

Now the subject should no longer say "mac80211:" :)

However... given that ieee80211_get_tx_rates() actually *copies* the
rates into the parameter, I guess it should do the rcu_read_lock()
internally. I guess I wasn't paying attention previously. Felix?

johannes

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] mac80211: ath9k: Use RCU protection calling ieee80211_get_tx_rates
       [not found]         ` <1370980523.8356.70.camel-8Nb76shvtaUJvtFkdXX2HixXY32XiHfO@public.gmane.org>
@ 2013-06-12  6:37           ` Kalle Valo
  0 siblings, 0 replies; 7+ messages in thread
From: Kalle Valo @ 2013-06-12  6:37 UTC (permalink / raw)
  To: Johannes Berg
  Cc: Calvin Owens, Luis R. Rodriguez, John W. Linville, Felix Fietkau,
	linux-wireless-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	ath9k-devel-xDcbHBWguxHbcTqmT+pZeQ, netdev-u79uwXL29TY76Z2rM5mHXA

Johannes Berg <johannes-cdvu00un1VgdHxzADdlk8Q@public.gmane.org> writes:

> Now the subject should no longer say "mac80211:" :)

It did have a change to mac80211.h as well, but IMHO that should be in a
separate patch.

-- 
Kalle Valo
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] mac80211: ath9k: Use RCU protection calling ieee80211_get_tx_rates
  2013-06-11 19:55       ` Johannes Berg
       [not found]         ` <1370980523.8356.70.camel-8Nb76shvtaUJvtFkdXX2HixXY32XiHfO@public.gmane.org>
@ 2013-06-12  7:56         ` Calvin Owens
  2013-06-12  8:00           ` [PATCH] mac80211: Use RCU protection in ieee80211_get_tx_rates() Calvin Owens
  1 sibling, 1 reply; 7+ messages in thread
From: Calvin Owens @ 2013-06-12  7:56 UTC (permalink / raw)
  To: Johannes Berg
  Cc: Luis R. Rodriguez, John W. Linville, Felix Fietkau,
	linux-wireless, linux-kernel, ath9k-devel, netdev

On Tuesday 06/11 at 21:55 +0200, Johannes Berg wrote:
> Now the subject should no longer say "mac80211:" :)
> 
> However... given that ieee80211_get_tx_rates() actually *copies* the
> rates into the parameter, I guess it should do the rcu_read_lock()
> internally. I guess I wasn't paying attention previously. Felix?

I thought about that, but it seemed too simple, so I assumed I was
missing something. ;)

I'll send a patch per above. That makes the header file update
unnecessary too.

> johannes

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH] mac80211: Use RCU protection in ieee80211_get_tx_rates()
  2013-06-12  7:56         ` Calvin Owens
@ 2013-06-12  8:00           ` Calvin Owens
  2013-06-12  9:47             ` Felix Fietkau
  0 siblings, 1 reply; 7+ messages in thread
From: Calvin Owens @ 2013-06-12  8:00 UTC (permalink / raw)
  To: Johannes Berg
  Cc: Luis R. Rodriguez, John W. Linville, Felix Fietkau,
	linux-wireless, linux-kernel, ath9k-devel, netdev, jcalvinowens

Copying the rate table should be done in an RCU read-side critical
section.

Signed-off-by: Calvin Owens <jcalvinowens@gmail.com>
---
 net/mac80211/rate.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c
index d3f414f..090d9b0 100644
--- a/net/mac80211/rate.c
+++ b/net/mac80211/rate.c
@@ -538,6 +538,8 @@ static void rate_control_fill_sta_table(struct ieee80211_sta *sta,
 	struct ieee80211_sta_rates *ratetbl = NULL;
 	int i;
 
+	rcu_read_lock();
+
 	if (sta && !info->control.skip_table)
 		ratetbl = rcu_dereference(sta->rates);
 
@@ -566,6 +568,8 @@ static void rate_control_fill_sta_table(struct ieee80211_sta *sta,
 		if (rates[i].idx < 0 || !rates[i].count)
 			break;
 	}
+
+	rcu_read_unlock();
 }
 
 static void rate_control_apply_mask(struct ieee80211_sub_if_data *sdata,
-- 
1.8.2.1

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH] mac80211: Use RCU protection in ieee80211_get_tx_rates()
  2013-06-12  8:00           ` [PATCH] mac80211: Use RCU protection in ieee80211_get_tx_rates() Calvin Owens
@ 2013-06-12  9:47             ` Felix Fietkau
  2013-06-13 15:27               ` Calvin Owens
  0 siblings, 1 reply; 7+ messages in thread
From: Felix Fietkau @ 2013-06-12  9:47 UTC (permalink / raw)
  To: Calvin Owens
  Cc: Johannes Berg, Luis R. Rodriguez, John W. Linville,
	linux-wireless, linux-kernel, ath9k-devel, netdev

On 2013-06-12 10:00 AM, Calvin Owens wrote:
> Copying the rate table should be done in an RCU read-side critical
> section.
I think this approach is wrong. The sta entry is also under RCU
protection (no locking for read access in that part of the code.
In a normal driver tx path, no extra rcu_read_lock/rcu_read_unlock is
needed. Only if the driver does some scheduling outside of the tx
function (which ath9k does), this RCU warning appears.

How about this change instead:
---
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -1570,6 +1570,8 @@ void ath_txq_schedule(struct ath_softc *
 	    txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH)
 		return;
 
+	rcu_read_lock();
+
 	ac = list_first_entry(&txq->axq_acq, struct ath_atx_ac, list);
 	last_ac = list_entry(txq->axq_acq.prev, struct ath_atx_ac, list);
 
@@ -1608,8 +1610,10 @@ void ath_txq_schedule(struct ath_softc *
 
 		if (ac == last_ac ||
 		    txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH)
-			return;
+			break;
 	}
+
+	rcu_read_unlock();
 }
 
 /***********/

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] mac80211: Use RCU protection in ieee80211_get_tx_rates()
  2013-06-12  9:47             ` Felix Fietkau
@ 2013-06-13 15:27               ` Calvin Owens
  0 siblings, 0 replies; 7+ messages in thread
From: Calvin Owens @ 2013-06-13 15:27 UTC (permalink / raw)
  To: Felix Fietkau
  Cc: Johannes Berg, Luis R. Rodriguez, John W. Linville,
	linux-wireless, linux-kernel, ath9k-devel, netdev, jcalvinowens

On Wednesday 06/12 at 11:47 +0200, Felix Fietkau wrote:
> On 2013-06-12 10:00 AM, Calvin Owens wrote:
> > Copying the rate table should be done in an RCU read-side critical
> > section.
> I think this approach is wrong. The sta entry is also under RCU
> protection (no locking for read access in that part of the code.
> In a normal driver tx path, no extra rcu_read_lock/rcu_read_unlock is
> needed. Only if the driver does some scheduling outside of the tx
> function (which ath9k does), this RCU warning appears.
> 
> How about this change instead:
> ---
> --- a/drivers/net/wireless/ath/ath9k/xmit.c
> +++ b/drivers/net/wireless/ath/ath9k/xmit.c
> @@ -1570,6 +1570,8 @@ void ath_txq_schedule(struct ath_softc *
>  	    txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH)
>  		return;
>  
> +	rcu_read_lock();
> +
>  	ac = list_first_entry(&txq->axq_acq, struct ath_atx_ac, list);
>  	last_ac = list_entry(txq->axq_acq.prev, struct ath_atx_ac, list);
>  
> @@ -1608,8 +1610,10 @@ void ath_txq_schedule(struct ath_softc *
>  
>  		if (ac == last_ac ||
>  		    txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH)
> -			return;
> +			break;
>  	}
> +
> +	rcu_read_unlock();
>  }
>  
>  /***********/
>

Yep, that stops the RCU warning for me.

Tested-by: Calvin Owens <jcalvinowens@gmail.com>

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2013-06-13 15:27 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20130609225120.GA2789@gmail.com>
     [not found] ` <20130610042959.GA1902@gmail.com>
     [not found]   ` <1370950926.8356.14.camel@jlt4.sipsolutions.net>
2013-06-11 17:13     ` [PATCH] mac80211: ath9k: Use RCU protection calling ieee80211_get_tx_rates Calvin Owens
2013-06-11 19:55       ` Johannes Berg
     [not found]         ` <1370980523.8356.70.camel-8Nb76shvtaUJvtFkdXX2HixXY32XiHfO@public.gmane.org>
2013-06-12  6:37           ` Kalle Valo
2013-06-12  7:56         ` Calvin Owens
2013-06-12  8:00           ` [PATCH] mac80211: Use RCU protection in ieee80211_get_tx_rates() Calvin Owens
2013-06-12  9:47             ` Felix Fietkau
2013-06-13 15:27               ` Calvin Owens

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).