On Fri, Jul 31, 2026 at 05:32:10PM +0800, Jianping Li wrote:
> Allocating and freeing Audio PD memory from userspace is unsafe because
> the kernel cannot reliably determine when the DSP has finished using the
> memory. Userspace may free buffers while they are still in use by the DSP,
> and remote free requests cannot be safely trusted.
>
> Additionally, the current implementation allows userspace to repeatedly
> grow the Audio PD heap, but does not support shrinking it. This can lead
> to unbounded memory usage over time, effectively causing a memory leak.
>
> Fix this by allocating the entire Audio PD reserved-memory region during
> rpmsg probe and tying its lifetime to the rpmsg channel. This removes
> userspace-controlled alloc/free and ensures that memory is reclaimed only
> when the DSP process is torn down.
>
> Validate the presence of the Audio PD reserved-memory region during
This will break compatibility with existing DTs, which is a no-go.
Existing DTs _must_ continue to work.
> rpmsg probe and fail early if it is missing, so that a misconfigured
> device tree is caught at probe time instead of at process creation.
>
> Fixes: 0871561055e66 ("misc: fastrpc: Add support for audiopd")
> Cc: [email protected]
> Signed-off-by: Jianping Li <[email protected]>
>
> Patch [v10]:
> https://lore.kernel.org/all/[email protected]/
All of this should go under the --- line.
>
> @@ -2584,12 +2547,22 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device
> *rpdev)
> }
> }
>
> - if (domain_id == SDSP_DOMAIN_ID) {
> + if (domain_id == SDSP_DOMAIN_ID || domain_id == ADSP_DOMAIN_ID) {
> struct resource res;
> u64 src_perms;
>
> err = of_reserved_mem_region_to_resource(rdev->of_node, 0,
> &res);
> +
> + if (err && domain_id == ADSP_DOMAIN_ID) {
> + dev_err(rdev, "missing mandatory remote heap
> memory-region\n");
> + goto err_free_data;
> + }
This is what I mean. This has been working beforehand. It must continue
to work.
> +
> if (!err) {
> + if (domain_id == ADSP_DOMAIN_ID) {
> + data->remote_heap_addr = res.start;
> + data->remote_heap_size = resource_size(&res);
> + }
Too much of the spaghetty code. Can we replace all domain checks with
the functions?
> src_perms = BIT(QCOM_SCM_VMID_HLOS);
>
> err = qcom_scm_assign_mem(res.start,
> resource_size(&res), &src_perms,
--
With best wishes
Dmitry