iwlwifi: mvm: do more useful queue sync accounting
[ Upstream commit 2f7a04c7b03b7fd63b7618e29295fc25732faac1 ] We're currently doing accounting on the queue sync with an atomic variable that counts down the number of remaining notifications that we still need. As we've been hitting issues in this area, modify this to track a bitmap of queues, not just the number of queues, and print out the remaining bitmap in the warning. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com> Link: https://lore.kernel.org/r/iwlwifi.20201209231352.0a3fa177cd6b.I7c69ff999419368266279ec27dd618eb450908b3@changeid Signed-off-by: Luca Coelho <luciano.coelho@intel.com> Stable-dep-of: 5f8a3561ea8b ("iwlwifi: mvm: write queue_sync_state only for sync") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
87b7d049ce
commit
f5e6da2ca1
@ -5155,8 +5155,7 @@ void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm,
|
||||
|
||||
if (notif->sync) {
|
||||
notif->cookie = mvm->queue_sync_cookie;
|
||||
atomic_set(&mvm->queue_sync_counter,
|
||||
mvm->trans->num_rx_queues);
|
||||
mvm->queue_sync_state = (1 << mvm->trans->num_rx_queues) - 1;
|
||||
}
|
||||
|
||||
ret = iwl_mvm_notify_rx_queue(mvm, qmask, (u8 *)notif,
|
||||
@ -5169,14 +5168,16 @@ void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm,
|
||||
if (notif->sync) {
|
||||
lockdep_assert_held(&mvm->mutex);
|
||||
ret = wait_event_timeout(mvm->rx_sync_waitq,
|
||||
atomic_read(&mvm->queue_sync_counter) == 0 ||
|
||||
READ_ONCE(mvm->queue_sync_state) == 0 ||
|
||||
iwl_mvm_is_radio_killed(mvm),
|
||||
HZ);
|
||||
WARN_ON_ONCE(!ret && !iwl_mvm_is_radio_killed(mvm));
|
||||
WARN_ONCE(!ret && !iwl_mvm_is_radio_killed(mvm),
|
||||
"queue sync: failed to sync, state is 0x%lx\n",
|
||||
mvm->queue_sync_state);
|
||||
}
|
||||
|
||||
out:
|
||||
atomic_set(&mvm->queue_sync_counter, 0);
|
||||
mvm->queue_sync_state = 0;
|
||||
if (notif->sync)
|
||||
mvm->queue_sync_cookie++;
|
||||
}
|
||||
|
@ -842,7 +842,7 @@ struct iwl_mvm {
|
||||
unsigned long status;
|
||||
|
||||
u32 queue_sync_cookie;
|
||||
atomic_t queue_sync_counter;
|
||||
unsigned long queue_sync_state;
|
||||
/*
|
||||
* for beacon filtering -
|
||||
* currently only one interface can be supported
|
||||
|
@ -725,7 +725,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
|
||||
|
||||
init_waitqueue_head(&mvm->rx_sync_waitq);
|
||||
|
||||
atomic_set(&mvm->queue_sync_counter, 0);
|
||||
mvm->queue_sync_state = 0;
|
||||
|
||||
SET_IEEE80211_DEV(mvm->hw, mvm->trans->dev);
|
||||
|
||||
|
@ -853,9 +853,13 @@ void iwl_mvm_rx_queue_notif(struct iwl_mvm *mvm, struct napi_struct *napi,
|
||||
WARN_ONCE(1, "Invalid identifier %d", internal_notif->type);
|
||||
}
|
||||
|
||||
if (internal_notif->sync &&
|
||||
!atomic_dec_return(&mvm->queue_sync_counter))
|
||||
wake_up(&mvm->rx_sync_waitq);
|
||||
if (internal_notif->sync) {
|
||||
WARN_ONCE(!test_and_clear_bit(queue, &mvm->queue_sync_state),
|
||||
"queue sync: queue %d responded a second time!\n",
|
||||
queue);
|
||||
if (READ_ONCE(mvm->queue_sync_state) == 0)
|
||||
wake_up(&mvm->rx_sync_waitq);
|
||||
}
|
||||
}
|
||||
|
||||
static void iwl_mvm_oldsn_workaround(struct iwl_mvm *mvm,
|
||||
|
Loading…
Reference in New Issue
Block a user