Search Linux Wireless

Re: [PATCH 3.12] ath5k: fix regression in tx status processing

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 14.10.2013, at 21:18, Felix Fietkau <nbd@xxxxxxxxxxx> wrote:

> The regression was introduced in the following commit:
> 
> 0967e01e8e713ed2982fb4eba8ba13794e9a6e89
> "ath5k: make use of the new rate control API"
> 
> ath5k_tx_frame_completed saves the intended per-rate retry counts before
> they are cleared by ieee80211_tx_info_clear_status, however at this
> point the information in info->status.rates is incomplete.
> 
> This causes significant throughput degradation and excessive packet loss
> on links where high bit rates don't work properly.
> 
> Move the copy from bf->rates a few lines up to ensure that the saved
> retry counts are updated, and that they are really cleared in
> info->status.rates after the call to ieee80211_tx_info_clear_status.
> 
> Cc: stable@xxxxxxxxxxxxxxx # 3.10+
> Cc: Thomas Huehn <thomas@xxxxxxxxxxxxxxxxxxxxxxx>
> Cc: Benjamin Vahl <bvahl@xxxxxxxxxxxxxxxxxxxxxxx>
> Reported-by: Ben West <ben@xxxxxxxxxxxx>
> Signed-off-by: Felix Fietkau <nbd@xxxxxxxxxxx>

Good catch !

Acked-by: Thomas Huehn <thomas@xxxxxxxxxxxxxxxxxxxxxxx>


> ---
> drivers/net/wireless/ath/ath5k/base.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
> index 48161ed..69f58b0 100644
> --- a/drivers/net/wireless/ath/ath5k/base.c
> +++ b/drivers/net/wireless/ath/ath5k/base.c
> @@ -1663,15 +1663,15 @@ ath5k_tx_frame_completed(struct ath5k_hw *ah, struct sk_buff *skb,
> 	ah->stats.tx_bytes_count += skb->len;
> 	info = IEEE80211_SKB_CB(skb);
> 
> +	size = min_t(int, sizeof(info->status.rates), sizeof(bf->rates));
> +	memcpy(info->status.rates, bf->rates, size);
> +
> 	tries[0] = info->status.rates[0].count;
> 	tries[1] = info->status.rates[1].count;
> 	tries[2] = info->status.rates[2].count;
> 
> 	ieee80211_tx_info_clear_status(info);
> 
> -	size = min_t(int, sizeof(info->status.rates), sizeof(bf->rates));
> -	memcpy(info->status.rates, bf->rates, size);
> -
> 	for (i = 0; i < ts->ts_final_idx; i++) {
> 		struct ieee80211_tx_rate *r =
> 			&info->status.rates[i];
> -- 
> 1.8.0.2
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

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




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux