[PATCH ath-next] wifi: ath12k: avoid dynamic alloc when parsing wmi tb
Jeff Johnson
jeff.johnson at oss.qualcomm.com
Mon Mar 9 13:16:18 PDT 2026
On 3/9/2026 8:20 AM, Nicolas Escande wrote:
I have some nit comments...
> On each WMI message received from the hardware, we alloc a temporary array
note that not every WMI message handler uses this pattern.
> of WMI_TAG_MAX entries of type void *. This array is then populated with
> pointers of parsed structs depending on the WMI type, and then freed. This
> alloc can fail when memory pressure in the system is high enough.
>
> Given the fact that it is scheduled in softirq with the system_bh_wq, we
> should not be able to parse more than one WMI message per CPU at any time
add hard stop .
>
> So instead lets move to a per cpu allocated array, stored in the struct
> ath12k_base, that is reused accros calls. The ath12k_wmi_tlv_parse_alloc()
s/accros/across/
> is also renamed into / merged with ath12k_wmi_tlv_parse() as it no longer
> allocs memory but returns the existing per-cpu one.
note that imperative voice is preferred.
>
> Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00218-QCAHKSWPL_SILICONZ-1
>
> Signed-off-by: Nicolas Escande <nico.escande at gmail.com>
> ---
> changes from RFC:
> - rebased on ath-next 8e0ab5b9adb7
> - converted missing call sites ath12k_wmi_obss_color_collision_event()
> & ath12k_wmi_pdev_temperature_event()
> - changed alloc order & cleanup path in ath12k_core_alloc() as it seems
> it confused people
> - used sizeof(*tb) in ath12k_wmi_tlv_parse()
>
> Note I did try to move to a DEFINE_PER_CPU() allocated array but the module
> loader complained about the array size. So I stuck to the per ab alloc.
> ---
> drivers/net/wireless/ath/ath12k/core.c | 7 +
> drivers/net/wireless/ath/ath12k/core.h | 2 +
> drivers/net/wireless/ath/ath12k/wmi.c | 178 ++++++-------------------
> 3 files changed, 51 insertions(+), 136 deletions(-)
...
> @@ -3913,7 +3903,7 @@ ath12k_wmi_obss_color_collision_event(struct ath12k_base *ab, struct sk_buff *sk
> u32 vdev_id, evt_type;
> u64 bitmap;
>
> - const void **tb __free(kfree) = ath12k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
> + const void **tb = ath12k_wmi_tlv_parse(ab, skb);
checkpatch complains:
Missing a blank line after declarations
Note that when __free() is used that this rule is not enforced since __free()
declarations should appear at first use
So I'd separate the declaration of tb from the assignment to be aligned with
all the other WMI functions
> if (IS_ERR(tb)) {
> ath12k_warn(ab, "failed to parse OBSS color collision tlv %ld\n",
> PTR_ERR(tb));
that's it for the nits. the development is stress testing the functionality.
/jeff
More information about the ath12k
mailing list