<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">From 4fd15bb705d3faa7e6adab2daba2e3af80d9b6bd Mon Sep 17 00:00:00 2001
From: Dmitry Antipov &lt;dmantipov@yandex.ru&gt;
Date: Tue, 26 Sep 2023 07:29:04 +0300
Subject: [PATCH] wifi: ath11k: fix ath11k_mac_op_remain_on_channel() stack
 usage

When compiling with clang 16.0.6, I've noticed the following:

drivers/net/wireless/ath/ath11k/mac.c:8903:12: warning: stack frame
size (1032) exceeds limit (1024) in 'ath11k_mac_op_remain_on_channel'
[-Wframe-larger-than]
static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
           ^
68/1032 (6.59%) spills, 964/1032 (93.41%) variables

So switch to kzalloc()'ed instance of 'struct scan_req_params' like
it's done in 'ath11k_mac_op_hw_scan()'. Compile tested only.

Signed-off-by: Dmitry Antipov &lt;dmantipov@yandex.ru&gt;
Acked-by: Jeff Johnson &lt;quic_jjohnson@quicinc.com&gt;
Signed-off-by: Kalle Valo &lt;quic_kvalo@quicinc.com&gt;
Link: https://lore.kernel.org/r/20230926042906.13725-1-dmantipov@yandex.ru
---
 drivers/net/wireless/ath/ath11k/mac.c | 44 +++++++++++++++------------
 1 file changed, 25 insertions(+), 19 deletions(-)

--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
@@ -8908,7 +8908,7 @@ static int ath11k_mac_op_remain_on_chann
 {
 	struct ath11k *ar = hw-&gt;priv;
 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
-	struct scan_req_params arg;
+	struct scan_req_params *arg;
 	int ret;
 	u32 scan_time_msec;
 
@@ -8940,27 +8940,31 @@ static int ath11k_mac_op_remain_on_chann
 
 	scan_time_msec = ar-&gt;hw-&gt;wiphy-&gt;max_remain_on_channel_duration * 2;
 
-	memset(&amp;arg, 0, sizeof(arg));
-	ath11k_wmi_start_scan_init(ar, &amp;arg);
-	arg.num_chan = 1;
-	arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list),
-				GFP_KERNEL);
-	if (!arg.chan_list) {
+	arg = kzalloc(sizeof(*arg), GFP_KERNEL);
+	if (!arg) {
 		ret = -ENOMEM;
 		goto exit;
 	}
+	ath11k_wmi_start_scan_init(ar, arg);
+	arg-&gt;num_chan = 1;
+	arg-&gt;chan_list = kcalloc(arg-&gt;num_chan, sizeof(*arg-&gt;chan_list),
+				 GFP_KERNEL);
+	if (!arg-&gt;chan_list) {
+		ret = -ENOMEM;
+		goto free_arg;
+	}
 
-	arg.vdev_id = arvif-&gt;vdev_id;
-	arg.scan_id = ATH11K_SCAN_ID;
-	arg.chan_list[0] = chan-&gt;center_freq;
-	arg.dwell_time_active = scan_time_msec;
-	arg.dwell_time_passive = scan_time_msec;
-	arg.max_scan_time = scan_time_msec;
-	arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE;
-	arg.scan_flags |= WMI_SCAN_FILTER_PROBE_REQ;
-	arg.burst_duration = duration;
+	arg-&gt;vdev_id = arvif-&gt;vdev_id;
+	arg-&gt;scan_id = ATH11K_SCAN_ID;
+	arg-&gt;chan_list[0] = chan-&gt;center_freq;
+	arg-&gt;dwell_time_active = scan_time_msec;
+	arg-&gt;dwell_time_passive = scan_time_msec;
+	arg-&gt;max_scan_time = scan_time_msec;
+	arg-&gt;scan_flags |= WMI_SCAN_FLAG_PASSIVE;
+	arg-&gt;scan_flags |= WMI_SCAN_FILTER_PROBE_REQ;
+	arg-&gt;burst_duration = duration;
 
-	ret = ath11k_start_scan(ar, &amp;arg);
+	ret = ath11k_start_scan(ar, arg);
 	if (ret) {
 		ath11k_warn(ar-&gt;ab, "failed to start roc scan: %d\n", ret);
 
@@ -8986,7 +8990,9 @@ static int ath11k_mac_op_remain_on_chann
 	ret = 0;
 
 free_chan_list:
-	kfree(arg.chan_list);
+	kfree(arg-&gt;chan_list);
+free_arg:
+	kfree(arg);
 exit:
 	mutex_unlock(&amp;ar-&gt;conf_mutex);
 	return ret;
</pre></body></html>