diff mbox series

[5/5] wifi: ath11k: fix stack usage of ath11k_mac_op_remain_on_channel()

Message ID 20230824075121.121144-5-dmantipov@yandex.ru (mailing list archive)
State Superseded
Delegated to: Kalle Valo
Headers show
Series [1/5] wifi: ath11k: drop redundant check in ath11k_dp_rx_mon_dest_process() | expand

Commit Message

Dmitry Antipov Aug. 24, 2023, 7:50 a.m. UTC
When compiling with clang 16.0.6, I've noticed the following:

drivers/net/wireless/ath/ath11k/mac.c:8900: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' and
adjust the function in subject accordingly.

Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
---
 drivers/net/wireless/ath/ath11k/mac.c | 44 +++++++++++++++------------
 1 file changed, 25 insertions(+), 19 deletions(-)

Comments

Jeff Johnson Aug. 24, 2023, 5:53 p.m. UTC | #1
On 8/24/2023 12:50 AM, Dmitry Antipov wrote:
> When compiling with clang 16.0.6, I've noticed the following:
> 
> drivers/net/wireless/ath/ath11k/mac.c:8900: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' and
> adjust the function in subject accordingly.
> 
> Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>

Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>

> ---
>   drivers/net/wireless/ath/ath11k/mac.c | 44 +++++++++++++++------------
>   1 file changed, 25 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c
> index 2aadf2c387b6..3e2983d30a5a 100644
> --- a/drivers/net/wireless/ath/ath11k/mac.c
> +++ b/drivers/net/wireless/ath/ath11k/mac.c
> @@ -8905,7 +8905,7 @@ static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
>   {
>   	struct ath11k *ar = hw->priv;
>   	struct ath11k_vif *arvif = (void *)vif->drv_priv;
> -	struct scan_req_params arg;
> +	struct scan_req_params *arg;
>   	int ret;
>   	u32 scan_time_msec;
>   
> @@ -8937,27 +8937,31 @@ static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
>   
>   	scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
>   
> -	memset(&arg, 0, sizeof(arg));
> -	ath11k_wmi_start_scan_init(ar, &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->num_chan = 1;
> +	arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
> +				 GFP_KERNEL);
> +	if (!arg->chan_list) {
> +		ret = -ENOMEM;
> +		goto free_arg;
> +	}
>   
> -	arg.vdev_id = arvif->vdev_id;
> -	arg.scan_id = ATH11K_SCAN_ID;
> -	arg.chan_list[0] = chan->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;
> -
> -	ret = ath11k_start_scan(ar, &arg);
> +	arg->vdev_id = arvif->vdev_id;
> +	arg->scan_id = ATH11K_SCAN_ID;
> +	arg->chan_list[0] = chan->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;
> +
> +	ret = ath11k_start_scan(ar, arg);
>   	if (ret) {
>   		ath11k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
>   
> @@ -8983,7 +8987,9 @@ static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
>   	ret = 0;
>   
>   free_chan_list:
> -	kfree(arg.chan_list);
> +	kfree(arg->chan_list);
> +free_arg:
> +	kfree(arg);
>   exit:
>   	mutex_unlock(&ar->conf_mutex);
>   	return ret;
diff mbox series

Patch

diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c
index 2aadf2c387b6..3e2983d30a5a 100644
--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
@@ -8905,7 +8905,7 @@  static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
 {
 	struct ath11k *ar = hw->priv;
 	struct ath11k_vif *arvif = (void *)vif->drv_priv;
-	struct scan_req_params arg;
+	struct scan_req_params *arg;
 	int ret;
 	u32 scan_time_msec;
 
@@ -8937,27 +8937,31 @@  static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
 
 	scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
 
-	memset(&arg, 0, sizeof(arg));
-	ath11k_wmi_start_scan_init(ar, &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->num_chan = 1;
+	arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
+				 GFP_KERNEL);
+	if (!arg->chan_list) {
+		ret = -ENOMEM;
+		goto free_arg;
+	}
 
-	arg.vdev_id = arvif->vdev_id;
-	arg.scan_id = ATH11K_SCAN_ID;
-	arg.chan_list[0] = chan->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;
-
-	ret = ath11k_start_scan(ar, &arg);
+	arg->vdev_id = arvif->vdev_id;
+	arg->scan_id = ATH11K_SCAN_ID;
+	arg->chan_list[0] = chan->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;
+
+	ret = ath11k_start_scan(ar, arg);
 	if (ret) {
 		ath11k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
 
@@ -8983,7 +8987,9 @@  static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
 	ret = 0;
 
 free_chan_list:
-	kfree(arg.chan_list);
+	kfree(arg->chan_list);
+free_arg:
+	kfree(arg);
 exit:
 	mutex_unlock(&ar->conf_mutex);
 	return ret;