Commit c4d12cb3 authored by P Praneesh's avatar P Praneesh Committed by Kalle Valo
Browse files

ath11k: avoid active pdev check for each msdu



The Active Pdev and CAC check are done for each msdu in
ath11k_dp_rx_process_received_packets which is a overhead.
To avoid this overhead, collect all msdus in a per mac msdu
list and pass to function.

Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1.r2-00012-QCAHKSWPL_SILICONZ-1
Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-01695-QCAHKSWPL_SILICONZ-1

Co-developed-by: default avatarSriram R <srirrama@codeaurora.org>
Signed-off-by: default avatarSriram R <srirrama@codeaurora.org>
Signed-off-by: default avatarJouni Malinen <jouni@codeaurora.org>
Signed-off-by: default avatarP Praneesh <ppranees@codeaurora.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/1630560820-21905-6-git-send-email-ppranees@codeaurora.org
parent a1775e73
Loading
Loading
Loading
Loading
+34 −36
Original line number Diff line number Diff line
@@ -2600,13 +2600,11 @@ static int ath11k_dp_rx_process_msdu(struct ath11k *ar,
static void ath11k_dp_rx_process_received_packets(struct ath11k_base *ab,
						  struct napi_struct *napi,
						  struct sk_buff_head *msdu_list,
						  int *quota, int ring_id)
						  int *quota, int mac_id)
{
	struct ath11k_skb_rxcb *rxcb;
	struct sk_buff *msdu;
	struct ath11k *ar;
	struct ieee80211_rx_status rx_status = {0};
	u8 mac_id;
	int ret;

	if (skb_queue_empty(msdu_list))
@@ -2614,20 +2612,20 @@ static void ath11k_dp_rx_process_received_packets(struct ath11k_base *ab,

	rcu_read_lock();

	while (*quota && (msdu = __skb_dequeue(msdu_list))) {
		rxcb = ATH11K_SKB_RXCB(msdu);
		mac_id = rxcb->mac_id;
	ar = ab->pdevs[mac_id].ar;
	if (!rcu_dereference(ab->pdevs_active[mac_id])) {
			dev_kfree_skb_any(msdu);
			continue;
		__skb_queue_purge(msdu_list);
		rcu_read_unlock();
		return;
	}

	if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
			dev_kfree_skb_any(msdu);
			continue;
		__skb_queue_purge(msdu_list);
		rcu_read_unlock();
		return;
	}

	while ((msdu = __skb_dequeue(msdu_list))) {
		ret = ath11k_dp_rx_process_msdu(ar, msdu, msdu_list, &rx_status);
		if (ret) {
			ath11k_dbg(ab, ATH11K_DBG_DATA,
@@ -2649,7 +2647,7 @@ int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id,
	struct ath11k_dp *dp = &ab->dp;
	struct dp_rxdma_ring *rx_ring;
	int num_buffs_reaped[MAX_RADIOS] = {0};
	struct sk_buff_head msdu_list;
	struct sk_buff_head msdu_list[MAX_RADIOS];
	struct ath11k_skb_rxcb *rxcb;
	int total_msdu_reaped = 0;
	struct hal_srng *srng;
@@ -2658,10 +2656,13 @@ int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id,
	bool done = false;
	int buf_id, mac_id;
	struct ath11k *ar;
	u32 *rx_desc;
	struct hal_reo_dest_ring *desc;
	enum hal_reo_dest_ring_push_reason push_reason;
	u32 cookie;
	int i;

	__skb_queue_head_init(&msdu_list);
	for (i = 0; i < MAX_RADIOS; i++)
		__skb_queue_head_init(&msdu_list[i]);

	srng = &ab->hal.srng_list[dp->reo_dst_ring[ring_id].ring_id];

@@ -2670,13 +2671,11 @@ int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id,
	ath11k_hal_srng_access_begin(ab, srng);

try_again:
	while ((rx_desc = ath11k_hal_srng_dst_get_next_entry(ab, srng))) {
		struct hal_reo_dest_ring desc = *(struct hal_reo_dest_ring *)rx_desc;
		enum hal_reo_dest_ring_push_reason push_reason;
		u32 cookie;

	while (likely(desc =
	      (struct hal_reo_dest_ring *)ath11k_hal_srng_dst_get_next_entry(ab,
									     srng))) {
		cookie = FIELD_GET(BUFFER_ADDR_INFO1_SW_COOKIE,
				   desc.buf_addr_info.info1);
				   desc->buf_addr_info.info1);
		buf_id = FIELD_GET(DP_RXDMA_BUF_COOKIE_BUF_ID,
				   cookie);
		mac_id = FIELD_GET(DP_RXDMA_BUF_COOKIE_PDEV_ID, cookie);
@@ -2703,7 +2702,7 @@ int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id,
		num_buffs_reaped[mac_id]++;

		push_reason = FIELD_GET(HAL_REO_DEST_RING_INFO0_PUSH_REASON,
					desc.info0);
					desc->info0);
		if (push_reason !=
		    HAL_REO_DEST_RING_PUSH_REASON_ROUTING_INSTRUCTION) {
			dev_kfree_skb_any(msdu);
@@ -2711,21 +2710,21 @@ int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id,
			continue;
		}

		rxcb->is_first_msdu = !!(desc.rx_msdu_info.info0 &
		rxcb->is_first_msdu = !!(desc->rx_msdu_info.info0 &
					 RX_MSDU_DESC_INFO0_FIRST_MSDU_IN_MPDU);
		rxcb->is_last_msdu = !!(desc.rx_msdu_info.info0 &
		rxcb->is_last_msdu = !!(desc->rx_msdu_info.info0 &
					RX_MSDU_DESC_INFO0_LAST_MSDU_IN_MPDU);
		rxcb->is_continuation = !!(desc.rx_msdu_info.info0 &
		rxcb->is_continuation = !!(desc->rx_msdu_info.info0 &
					   RX_MSDU_DESC_INFO0_MSDU_CONTINUATION);
		rxcb->peer_id = FIELD_GET(RX_MPDU_DESC_META_DATA_PEER_ID,
					  desc.rx_mpdu_info.meta_data);
					  desc->rx_mpdu_info.meta_data);
		rxcb->seq_no = FIELD_GET(RX_MPDU_DESC_INFO0_SEQ_NUM,
					 desc.rx_mpdu_info.info0);
					 desc->rx_mpdu_info.info0);
		rxcb->tid = FIELD_GET(HAL_REO_DEST_RING_INFO0_RX_QUEUE_NUM,
				      desc.info0);
				      desc->info0);

		rxcb->mac_id = mac_id;
		__skb_queue_tail(&msdu_list, msdu);
		__skb_queue_tail(&msdu_list[mac_id], msdu);

		if (rxcb->is_continuation) {
			done = false;
@@ -2760,16 +2759,15 @@ int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id,
		if (!num_buffs_reaped[i])
			continue;

		ath11k_dp_rx_process_received_packets(ab, napi, &msdu_list[i],
						      &quota, i);

		ar = ab->pdevs[i].ar;
		rx_ring = &ar->dp.rx_refill_buf_ring;

		ath11k_dp_rxbufs_replenish(ab, i, rx_ring, num_buffs_reaped[i],
					   ab->hw_params.hal_params->rx_buf_rbm);
	}

	ath11k_dp_rx_process_received_packets(ab, napi, &msdu_list,
					      &quota, ring_id);

exit:
	return budget - quota;
}