On 15.09.22 18:18, Felix Fietkau wrote:
On 15.09.22 15:09, Alexander Wetzel wrote:
Make sure local->queue_stop_reasons and vif.txqs_stopped stay in sync.
When a new vif is created the queues may end up in an inconsistent state
and be inoperable:
Communication not using iTXQ will work, allowing to e.g. complete the
association. But the 4-way handshake will time out. The sta will not
send out any skbs queued in iTXQs.
All normal attempts to start the queues will fail when reaching this
state.
local->queue_stop_reasons will have marked all queues as operational but
vif.txqs_stopped will still be set, creating an inconsistent internal
state.
In reality this seems to be race between the mac80211 function
ieee80211_do_open() setting SDATA_STATE_RUNNING and the
wake_txqs_tasklet:
Depending on the driver and the timing the queues may end up to be
operational or not.
Cc: stable@xxxxxxxxxxxxxxx
Fixes: f856373e2f31 ("wifi: mac80211: do not wake queues on a vif that
is being stopped")
Signed-off-by: Alexander Wetzel <alexander@xxxxxxxxxxxxxx>
Acked-by: Felix Fietkau <nbd@xxxxxxxx>
I've got some doubts that my fix is correct...
While it fixes the problem in my tests it looks like we'll need another
queue restart to get the queues working again.
After all IEEE80211_TXQ_STOP_NETIF_TX will not be cleared when it has
been set by __ieee80211_stop_queue().
I'll update the patch and skip setting vif.txqs_stopped when
SDATA_STATE_RUNNING is not set. Not having IEEE80211_TXQ_STOP_NETIF_TX
set looks harmless, having it set when it should less problematic...
Alexander