]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: ath11k: mark ath11k_dp_rx_mon_mpdu_pop() as noinline
authorJeff Johnson <quic_jjohnson@quicinc.com>
Tue, 19 Nov 2024 15:47:39 +0000 (07:47 -0800)
committerJeff Johnson <quic_jjohnson@quicinc.com>
Thu, 21 Nov 2024 15:59:48 +0000 (07:59 -0800)
When compiling the ath11k driver using clang with KASAN enabled, the
following warning is observed:

drivers/net/wireless/ath/ath11k/dp_rx.c:5244:5: warning: stack frame size (1304) exceeds limit (1024) in 'ath11k_dp_rx_process_mon_status' [-Wframe-larger-than]

This is similar to the issue found in ath12k/qmi.c that was discussed
in [1] and fixed with [2]. The issue is that clang inlining can
explode stack usage.

ath11k_dp_rx_process_mon_status() itself is a pretty
lightweight function, but it dispatches to several other functions
which do the real work:

ath11k_dp_rx_process_mon_status()
ath11k_dp_rx_reap_mon_status_ring()
ath11k_dp_rx_mon_dest_process()
ath11k_dp_rx_mon_mpdu_pop() *
ath11k_dp_rx_mon_deliver()
ath11k_dp_rx_mon_merg_msdus()
ath11k_dp_rx_deliver_msdu()
ath11k_dp_rx_update_peer_stats()

Of these, only ath11k_dp_rx_mon_mpdu_pop() has non-trivial stack
usage, so mark that function as 'noinline_for_stack' to prevent it
from being inlined in ath11k_dp_rx_process_mon_status(), thereby
eliminating the excessive stack usage.

Compile tested only.

Link: https://msgid.link/bc214795-1c51-4cb7-922f-67d6ef98bff2@quicinc.com
Link: https://patch.msgid.link/20241028-ath12k_qmi_driver_event_work-v1-1-0d532eb593fa@quicinc.com
Acked-by: Kalle Valo <kvalo@kernel.org>
Link: https://patch.msgid.link/20241119-ath11k-noinline-v1-2-4ec0a8aa30b2@quicinc.com
Signed-off-by: Jeff Johnson <quic_jjohnson@quicinc.com>
drivers/net/wireless/ath/ath11k/dp_rx.c

index 238b0e5e92a0e7b238371b0638aea7734f0efcd4..8517994effce0fbcd2368f4fd3b649b94a00acce 100644 (file)
@@ -4691,11 +4691,12 @@ static void ath11k_dp_mon_get_buf_len(struct hal_rx_msdu_desc_info *info,
        }
 }
 
-static u32
-ath11k_dp_rx_mon_mpdu_pop(struct ath11k *ar, int mac_id,
-                         void *ring_entry, struct sk_buff **head_msdu,
-                         struct sk_buff **tail_msdu, u32 *npackets,
-                         u32 *ppdu_id)
+/* clang stack usage explodes if this is inlined */
+static noinline_for_stack
+u32 ath11k_dp_rx_mon_mpdu_pop(struct ath11k *ar, int mac_id,
+                             void *ring_entry, struct sk_buff **head_msdu,
+                             struct sk_buff **tail_msdu, u32 *npackets,
+                             u32 *ppdu_id)
 {
        struct ath11k_pdev_dp *dp = &ar->dp;
        struct ath11k_mon_data *pmon = (struct ath11k_mon_data *)&dp->mon_data;