Kan Yan <kyan@xxxxxxxxxx> writes: > It is most likely just insufficient locking. active_txq_lock is per > AC, can't protect local->aql_total_pending_airtime against racing > conditions: > void ieee80211_sta_update_pending_airtime(...) > { > spin_lock_bh(&local->active_txq_lock[ac]); > ... > local->aql_total_pending_airtime -= tx_airtime; > ... > spin_unlock_bh(&local->active_txq_lock[ac]); > } Ohh, right; didn't even realise those were not per-AC as well... > After changing it to atomic_t, no more aql_total_pending_airtime > underflow so far :). Using atomic operation should also help reduce > CPU overhead due to lock contention, as > ieee80211_sta_update_pending_airtime() is often called from the tx > completion routine triggered by interrupts, often in a different core > than where __ieee80211_schedule_txq() is running. > > I will post a new version a bit later if the test goes well. Awesome! :) -Toke