[OpenWrt-Devel] [PATCH] Fix 'Dropping frame due to full tx queue' for Ralink wifi get stuck.

Felix Fietkau nbd at openwrt.org
Fri Sep 11 07:49:26 EDT 2015


On 2015-09-11 13:33, N.Leiten wrote:
> Fix instability of Ralink WiFi general queue management on high load.
> rt2x00 driver logs in dmesg "Dropping frame due to full queue ..." several times and at some point get stuck.
> 
> Solutions in patch:
> 1) Increasing number of frames in each TX queue helps with speed and
> decreases queue overflows. Actually 256 frames can be increased to
> 512 (this number of frames used in proprietary drivers for every
> queue).
512 frames seems to be overly excessive. Ever heard of bufferbloat?
It seems to me that the driver should simply call ieee80211_stop_queue
earlier to ensure that mac80211 does not attempt to fill the queues as
much. The driver queue length should probably be around 64 or less.

> 2) Setting number of frames in TX/RX queues to equal values
> resolves async speed behaviour with better RX on AP-side (uplink from
> STAs), where it needs to be at least equal or better on TX queue on
> AP (download to STA).
That also doesn't make much sense to me as queueing behavior is
completely different between rx and tx. Rx queue processing speed is
determined by CPU speed, Tx queue processing speed is determined by
shared medium speed.

> 3) In rt2x00mac.c additional check for queue
> full added and reassignment in this case, so interface will not drop
> frame.
Why? If the queues are full, it's better to just drop packets instead of
making the problem worse.

> 4) Fixes in queue initialization. Default values for AC_BK,
> AC_BE, AC_VI, AC_VO set from WMM.
Why do you hardcode that stuff inside the driver? What difference do
these values make?

> Tested on RT3883, RT5350, MT7620 SoCs and on RT3092 pcie interface for 10 days.
> 
> I'm planning to send this patch to mac80211 soon, but need to be sure that it works on other Ralink/Mediatek platforms and it's appropriate to do so.
> 
> 
> Signed-off-by: Nick Leiten <nickleiten at gmail.com>
> diff --git a/package/kernel/mac80211/patches/999-rt2x00-queue-update.patch b/package/kernel/mac80211/patches/999-rt2x00-queue-update.patch
> new file mode 100644
> index 0000000..9239bec
> --- /dev/null
> +++ b/package/kernel/mac80211/patches/999-rt2x00-queue-update.patch
> @@ -0,0 +1,142 @@
> +Only in compat-wireless-2015-03-09/drivers/net/wireless/rt2x00: limit
> +diff -c -r compat-wireless-2015-03-09-orig/drivers/net/wireless/rt2x00/rt2800mmio.c compat-wireless-2015-03-09/drivers/net/wireless/rt2x00/rt2800mmio.c
> +*** compat-wireless-2015-03-09-orig/drivers/net/wireless/rt2x00/rt2800mmio.c	2015-06-16 13:02:30.000000000 +0300
> +--- compat-wireless-2015-03-09/drivers/net/wireless/rt2x00/rt2800mmio.c	2015-09-04 11:50:09.665148666 +0300
> +***************
> +*** 700,706 ****
> +  
> +  	switch (queue->qid) {
> +  	case QID_RX:
> +! 		queue->limit = 128;
> +  		queue->data_size = AGGREGATION_SIZE;
> +  		queue->desc_size = RXD_DESC_SIZE;
> +  		queue->winfo_size = rxwi_size;
> +--- 700,706 ----
> +  
> +  	switch (queue->qid) {
> +  	case QID_RX:
> +! 		queue->limit = 256;
> +  		queue->data_size = AGGREGATION_SIZE;
> +  		queue->desc_size = RXD_DESC_SIZE;
> +  		queue->winfo_size = rxwi_size;
> +***************
> +*** 711,717 ****
> +  	case QID_AC_VI:
> +  	case QID_AC_BE:
> +  	case QID_AC_BK:
> +! 		queue->limit = 64;
> +  		queue->data_size = AGGREGATION_SIZE;
> +  		queue->desc_size = TXD_DESC_SIZE;
> +  		queue->winfo_size = txwi_size;
> +--- 711,717 ----
> +  	case QID_AC_VI:
> +  	case QID_AC_BE:
> +  	case QID_AC_BK:
> +! 		queue->limit = 256;
> +  		queue->data_size = AGGREGATION_SIZE;
> +  		queue->desc_size = TXD_DESC_SIZE;
> +  		queue->winfo_size = txwi_size;
Wrong patch style, please run make package/mac80211/refresh.

- Felix
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list