[PATCHv2 ath-next] wifi: ath11k: use kzalloc_flex
Rameshkumar Sundaram
rameshkumar.sundaram at oss.qualcomm.com
Tue Apr 28 02:50:34 PDT 2026
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 <rosenp at gmail.com>
> ---
> 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
More information about the ath11k
mailing list