Message ID | 20231118155105.25678-13-yury.norov@gmail.com (mailing list archive) |
---|---|
State | Not Applicable |
Delegated to: | Johannes Berg |
Headers | show |
Series | biops: add atomig find_bit() operations | expand |
On Sat, 2023-11-18 at 07:50 -0800, Yury Norov wrote: > iwlegacy and iwlwifi code opencodes atomic bit allocation/traversing by > using loops. That's really just due to being lazy though, it could use a non-atomic __test_and_set_bit() would be just fine in all of this, there's always a mutex held around it that protects the data. Not that it means that the helper is _wrong_, it's just unnecessary, and you don't have non-atomic versions of these, do you? johannes
On Sun, Nov 19, 2023 at 08:58:25PM +0100, Johannes Berg wrote: > On Sat, 2023-11-18 at 07:50 -0800, Yury Norov wrote: > > iwlegacy and iwlwifi code opencodes atomic bit allocation/traversing by > > using loops. > > That's really just due to being lazy though, it could use a non-atomic > __test_and_set_bit() would be just fine in all of this, there's always a > mutex held around it that protects the data. Ok, then I'll drop the patch. > Not that it means that the helper is _wrong_, it's just unnecessary, and > you don't have non-atomic versions of these, do you? Not yet. If atomic find_bit() will get merged, and there will be a set of potential users of non-atomic version, I may need to revisit it and add those non-atomic functions. Thanks, Yury
diff --git a/drivers/net/wireless/intel/iwlegacy/4965-mac.c b/drivers/net/wireless/intel/iwlegacy/4965-mac.c index 69276266ce6f..8fb738c95cb4 100644 --- a/drivers/net/wireless/intel/iwlegacy/4965-mac.c +++ b/drivers/net/wireless/intel/iwlegacy/4965-mac.c @@ -2089,12 +2089,9 @@ il4965_txq_ctx_stop(struct il_priv *il) static int il4965_txq_ctx_activate_free(struct il_priv *il) { - int txq_id; + int txq_id = find_and_set_bit(&il->txq_ctx_active_msk, il->hw_params.max_txq_num); - for (txq_id = 0; txq_id < il->hw_params.max_txq_num; txq_id++) - if (!test_and_set_bit(txq_id, &il->txq_ctx_active_msk)) - return txq_id; - return -1; + return txq_id < il->hw_params.max_txq_num ? txq_id : -1; } /* diff --git a/drivers/net/wireless/intel/iwlegacy/common.c b/drivers/net/wireless/intel/iwlegacy/common.c index 054fef680aba..c6353e17be50 100644 --- a/drivers/net/wireless/intel/iwlegacy/common.c +++ b/drivers/net/wireless/intel/iwlegacy/common.c @@ -2303,13 +2303,9 @@ EXPORT_SYMBOL(il_restore_stations); int il_get_free_ucode_key_idx(struct il_priv *il) { - int i; - - for (i = 0; i < il->sta_key_max_num; i++) - if (!test_and_set_bit(i, &il->ucode_key_table)) - return i; + int i = find_and_set_bit(&il->ucode_key_table, il->sta_key_max_num); - return WEP_INVALID_OFFSET; + return i < il->sta_key_max_num ? i : WEP_INVALID_OFFSET; } EXPORT_SYMBOL(il_get_free_ucode_key_idx); diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/sta.c b/drivers/net/wireless/intel/iwlwifi/dvm/sta.c index 8b01ab986cb1..21e663d2bc44 100644 --- a/drivers/net/wireless/intel/iwlwifi/dvm/sta.c +++ b/drivers/net/wireless/intel/iwlwifi/dvm/sta.c @@ -719,13 +719,9 @@ void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx) int iwl_get_free_ucode_key_offset(struct iwl_priv *priv) { - int i; - - for (i = 0; i < priv->sta_key_max_num; i++) - if (!test_and_set_bit(i, &priv->ucode_key_table)) - return i; + int i = find_and_set_bit(&priv->ucode_key_table, priv->sta_key_max_num); - return WEP_INVALID_OFFSET; + return i < priv->sta_key_max_num ? i : WEP_INVALID_OFFSET; } void iwl_dealloc_bcast_stations(struct iwl_priv *priv) diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/tx.c b/drivers/net/wireless/intel/iwlwifi/dvm/tx.c index 111ed1873006..1b3dc99b968c 100644 --- a/drivers/net/wireless/intel/iwlwifi/dvm/tx.c +++ b/drivers/net/wireless/intel/iwlwifi/dvm/tx.c @@ -460,17 +460,14 @@ int iwlagn_tx_skb(struct iwl_priv *priv, static int iwlagn_alloc_agg_txq(struct iwl_priv *priv, int mq) { - int q; - - for (q = IWLAGN_FIRST_AMPDU_QUEUE; - q < priv->trans->trans_cfg->base_params->num_of_queues; q++) { - if (!test_and_set_bit(q, priv->agg_q_alloc)) { - priv->queue_to_mac80211[q] = mq; - return q; - } - } - - return -ENOSPC; + int q = find_and_set_next_bit(priv->agg_q_alloc, + priv->trans->trans_cfg->base_params->num_of_queues, + IWLAGN_FIRST_AMPDU_QUEUE); + if (q >= priv->trans->trans_cfg->base_params->num_of_queues) + return -ENOSPC; + + priv->queue_to_mac80211[q] = mq; + return q; } static void iwlagn_dealloc_agg_txq(struct iwl_priv *priv, int q)
iwlegacy and iwlwifi code opencodes atomic bit allocation/traversing by using loops. Switch it to use dedicated functions. Signed-off-by: Yury Norov <yury.norov@gmail.com> --- .../net/wireless/intel/iwlegacy/4965-mac.c | 7 ++----- drivers/net/wireless/intel/iwlegacy/common.c | 8 ++------ drivers/net/wireless/intel/iwlwifi/dvm/sta.c | 8 ++------ drivers/net/wireless/intel/iwlwifi/dvm/tx.c | 19 ++++++++----------- 4 files changed, 14 insertions(+), 28 deletions(-)