Re: [PATCHv2 ath-next] wifi: ath11k: use kzalloc_flex
Rameshkumar Sundaram <[email protected]>
| Newsgroups | org.infradead.lists.ath11k,org.kernel.vger.linux-hardening,org.kernel.vger.linux-kernel,org.kernel.vger.linux-wireless |
|---|---|
| Message-ID | <[email protected]> |
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