On 4/22/2026 4:42 AM, Rosen Penev wrote:
Convert kzalloc_obj + kcalloc to kzalloc_flex to save an allocation.

Add __counted_by to get extra runtime analysis. Move counting variable
assignment immediately after allocation before any potential accesses.
kzalloc_flex does this anyway for GCC >= 15.

Signed-off-by: Rosen Penev <[email protected]>
---
  v2: reword counting variable comment.
  drivers/net/wireless/ath/ath11k/mac.c | 71 ++++++++++-----------------
  drivers/net/wireless/ath/ath11k/wmi.h |  2 +-
  2 files changed, 28 insertions(+), 45 deletions(-)

diff --git a/drivers/net/wireless/ath/ath11k/mac.c 
b/drivers/net/wireless/ath/ath11k/mac.c
index 4a68bb9ca4fa..b5f3d7221b5f 100644
--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
@@ -4228,13 +4228,14 @@ static int ath11k_mac_op_hw_scan(struct ieee80211_hw 
*hw,
        if (ret)
                goto exit;

-       arg = kzalloc_obj(*arg);
+       arg = kzalloc_flex(*arg, chan_list, req->n_channels);

        if (!arg) {
                ret = -ENOMEM;
                goto exit;
        }

+       arg->num_chan = req->n_channels;
        ath11k_wmi_start_scan_init(ar, arg);
        arg->vdev_id = arvif->vdev_id;
        arg->scan_id = ATH11K_SCAN_ID;
@@ -4262,38 +4263,27 @@ static int ath11k_mac_op_hw_scan(struct ieee80211_hw 
*hw,
                arg->scan_f_passive = 1;
        }

-       if (req->n_channels) {
-               arg->num_chan = req->n_channels;
-               arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
-                                        GFP_KERNEL);
+       for (i = 0; i < arg->num_chan; i++) {
+               if (test_bit(WMI_TLV_SERVICE_SCAN_CONFIG_PER_CHANNEL,
+                            ar->ab->wmi_ab.svc_map)) {
+                       arg->chan_list[i] =
+                               u32_encode_bits(req->channels[i]->center_freq,
+                                               
WMI_SCAN_CONFIG_PER_CHANNEL_MASK);

-               if (!arg->chan_list) {
-                       ret = -ENOMEM;
-                       goto exit;
-               }
-
-               for (i = 0; i < arg->num_chan; i++) {
-                       if (test_bit(WMI_TLV_SERVICE_SCAN_CONFIG_PER_CHANNEL,
-                                    ar->ab->wmi_ab.svc_map)) {
-                               arg->chan_list[i] =
-                                       
u32_encode_bits(req->channels[i]->center_freq,
-                                                       
WMI_SCAN_CONFIG_PER_CHANNEL_MASK);
-
-                               /* If NL80211_SCAN_FLAG_COLOCATED_6GHZ is set 
in scan
-                                * flags, then scan all PSC channels in 6 GHz 
band and
-                                * those non-PSC channels where RNR IE is found 
during
-                                * the legacy 2.4/5 GHz scan.
-                                * If NL80211_SCAN_FLAG_COLOCATED_6GHZ is not 
set,
-                                * then all channels in 6 GHz will be scanned.
-                                */
-                               if (req->channels[i]->band == NL80211_BAND_6GHZ 
&&
-                                   req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ 
&&
-                                   !cfg80211_channel_is_psc(req->channels[i]))
-                                       arg->chan_list[i] |=
-                                               
WMI_SCAN_CH_FLAG_SCAN_ONLY_IF_RNR_FOUND;
-                       } else {
-                               arg->chan_list[i] = 
req->channels[i]->center_freq;
-                       }
+                       /* If NL80211_SCAN_FLAG_COLOCATED_6GHZ is set in scan
+                        * flags, then scan all PSC channels in 6 GHz band and
+                        * those non-PSC channels where RNR IE is found during
+                        * the legacy 2.4/5 GHz scan.
+                        * If NL80211_SCAN_FLAG_COLOCATED_6GHZ is not set,
+                        * then all channels in 6 GHz will be scanned.
+                        */
+                       if (req->channels[i]->band == NL80211_BAND_6GHZ &&
+                           req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ &&
+                           !cfg80211_channel_is_psc(req->channels[i]))
+                               arg->chan_list[i] |=
+                                       WMI_SCAN_CH_FLAG_SCAN_ONLY_IF_RNR_FOUND;
+               } else {
+                       arg->chan_list[i] = req->channels[i]->center_freq;
                }
        }



the exit: label at the end of the function has kfree(arg->chan_list); which now must be removed.



--
Ramesh

Reply via email to