Fix rt2800usb polling timeouts and throughput issues (rhbz 984696)

This commit is contained in:
Josh Boyer 2013-10-17 08:12:25 -04:00
parent 9618152514
commit 8b84b3cea5
2 changed files with 62 additions and 0 deletions

View File

@ -785,6 +785,9 @@ Patch25130: fix-radeon-sound.patch
#rhbz 1011714
Patch25131: btrfs-relocate-csums-properly-with-prealloc-ext.patch
#rhbz 984696
Patch25132: rt2800usb-slow-down-TX-status-polling.patch
# END OF PATCH DEFINITIONS
%endif
@ -1528,6 +1531,9 @@ ApplyPatch fix-radeon-sound.patch
#rhbz 1011714
ApplyPatch btrfs-relocate-csums-properly-with-prealloc-ext.patch
#rhbz 984696
ApplyPatch rt2800usb-slow-down-TX-status-polling.patch
# END OF PATCH APPLICATIONS
%endif
@ -2330,6 +2336,9 @@ fi
# ||----w |
# || ||
%changelog
* Thu Oct 17 2013 Josh Boyer <jwboyer@fedoraproject.org>
- Fix rt2800usb polling timeouts and throughput issues (rhbz 984696)
* Wed Oct 16 2013 Josh Boyer <jwboyer@fedoraproject.org> - 3.11.5-302
- Fix btrfs balance/scrub issue (rhbz 1011714)

View File

@ -0,0 +1,53 @@
Polling TX statuses too frequently has two negative effects. First is
randomly peek CPU usage, causing overall system functioning delays.
Second bad effect is that device is not able to fill TX statuses in
H/W register on some workloads and we get lot of timeouts like below:
ieee80211 phy4: rt2800usb_entry_txstatus_timeout: Warning - TX status timeout for entry 7 in queue 2
ieee80211 phy4: rt2800usb_entry_txstatus_timeout: Warning - TX status timeout for entry 7 in queue 2
ieee80211 phy4: rt2800usb_txdone: Warning - Got TX status for an empty queue 2, dropping
This not only cause flood of messages in dmesg, but also bad throughput,
since rate scaling algorithm can not work optimally.
In the future, we should probably make polling interval be adjusted
automatically, but for now just increase values, this make mentioned
problems gone.
Resolve:
https://bugzilla.kernel.org/show_bug.cgi?id=62781
Cc: stable@vger.kernel.org
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
---
drivers/net/wireless/rt2x00/rt2800usb.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
index 96677ce5..e095e61 100644
--- a/drivers/net/wireless/rt2x00/rt2800usb.c
+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
@@ -176,8 +176,8 @@ static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev,
queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work);
if (rt2800usb_txstatus_pending(rt2x00dev)) {
- /* Read register after 250 us */
- hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 250000),
+ /* Read register after 1 ms */
+ hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 1000000),
HRTIMER_MODE_REL);
return false;
}
@@ -202,8 +202,8 @@ static void rt2800usb_async_read_tx_status(struct rt2x00_dev *rt2x00dev)
if (test_and_set_bit(TX_STATUS_READING, &rt2x00dev->flags))
return;
- /* Read TX_STA_FIFO register after 500 us */
- hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 500000),
+ /* Read TX_STA_FIFO register after 2 ms */
+ hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 2000000),
HRTIMER_MODE_REL);
}
--
1.8.3.1