Message ID | 1616105397-1482-2-git-send-email-pradeepc@codeaurora.org |
---|---|
State | New |
Headers | show |
Series | ath11k: add HE radiotap header support | expand |
> - ieee80211_tx_status(ar->hw, msdu); > + spin_lock_bh(&ab->base_lock); > + peer = ath11k_peer_find_by_id(ab, ts->peer_id); > + if (peer) { > + arsta = (struct ath11k_sta *)peer->sta->drv_priv; > + status.sta = peer->sta; > + status.skb = msdu; > + status.info = info; > + status.rate = &arsta->last_txrate; Assigning arsta holded last_txrate pointer to status.rate create race condition problem b/w sta delete and ieee80211_tx_status_ext, no ? Hw we ensure that arsta pointer is valid until ieee80211_tx_status_ext() processing? Instead why don't we have local struct rate_info and assign like below code snippet struct rate_info rate; ... rate = arsta->last_txrate; status.rate = &rate; Thanks, Karthikeyan P
On 2021-03-18 22:31, Karthikeyan periyasamy wrote: >> - ieee80211_tx_status(ar->hw, msdu); >> + spin_lock_bh(&ab->base_lock); >> + peer = ath11k_peer_find_by_id(ab, ts->peer_id); >> + if (peer) { >> + arsta = (struct ath11k_sta *)peer->sta->drv_priv; >> + status.sta = peer->sta; >> + status.skb = msdu; >> + status.info = info; >> + status.rate = &arsta->last_txrate; > > Assigning arsta holded last_txrate pointer to status.rate create race > condition problem b/w sta delete and ieee80211_tx_status_ext, no ? > Hw we ensure that arsta pointer is valid until > ieee80211_tx_status_ext() processing? > > Instead why don't we have local struct rate_info and assign like below > code snippet > > struct rate_info rate; > ... > rate = arsta->last_txrate; > status.rate = &rate; > > Thanks, > Karthikeyan P Thanks Karthikeyan, I have addressed this in V9..
diff --git a/drivers/net/wireless/ath/ath11k/dp_tx.c b/drivers/net/wireless/ath/ath11k/dp_tx.c index 8bba5234f81f..99fc54ee6a78 100644 --- a/drivers/net/wireless/ath/ath11k/dp_tx.c +++ b/drivers/net/wireless/ath/ath11k/dp_tx.c @@ -417,9 +417,12 @@ static void ath11k_dp_tx_complete_msdu(struct ath11k *ar, struct sk_buff *msdu, struct hal_tx_status *ts) { + struct ieee80211_tx_status status = { 0 }; struct ath11k_base *ab = ar->ab; struct ieee80211_tx_info *info; struct ath11k_skb_cb *skb_cb; + struct ath11k_peer *peer; + struct ath11k_sta *arsta; if (WARN_ON_ONCE(ts->buf_rel_source != HAL_WBM_REL_SRC_MODULE_TQM)) { /* Must not happen */ @@ -483,13 +486,23 @@ static void ath11k_dp_tx_complete_msdu(struct ath11k *ar, ath11k_dp_tx_cache_peer_stats(ar, msdu, ts); } - /* NOTE: Tx rate status reporting. Tx completion status does not have - * necessary information (for example nss) to build the tx rate. - * Might end up reporting it out-of-band from HTT stats. - */ - - ieee80211_tx_status(ar->hw, msdu); + spin_lock_bh(&ab->base_lock); + peer = ath11k_peer_find_by_id(ab, ts->peer_id); + if (peer) { + arsta = (struct ath11k_sta *)peer->sta->drv_priv; + status.sta = peer->sta; + status.skb = msdu; + status.info = info; + status.rate = &arsta->last_txrate; + } + spin_unlock_bh(&ab->base_lock); + rcu_read_unlock(); + if (peer) + ieee80211_tx_status_ext(ar->hw, &status); + else + dev_kfree_skb_any(msdu); + return; exit: rcu_read_unlock(); }