On 5/13/25 05:28, Ekansh Gupta wrote:
> Remote heap allocations are not organized in a maintainable manner,
> leading to potential issues with memory management. As the remote
> heap allocations are maintained in fl mmaps list, the allocations
> will go away if the audio daemon process is killed but there are
> chances that audio PD might still be using the memory. Move all
> remote heap allocations to a dedicated list where the entries are
> cleaned only for user requests and subsystem shutdown.
> 
> Fixes: 0871561055e66 ("misc: fastrpc: Add support for audiopd")
> Cc: sta...@kernel.org
> Signed-off-by: Ekansh Gupta <ekansh.gu...@oss.qualcomm.com>
> ---
>  drivers/misc/fastrpc.c | 93 ++++++++++++++++++++++++++++++++----------
>  1 file changed, 72 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
> index ca3721365ddc..d4e38b5e5e6c 100644
> --- a/drivers/misc/fastrpc.c
> +++ b/drivers/misc/fastrpc.c
> @@ -273,10 +273,12 @@ struct fastrpc_channel_ctx {
>       struct kref refcount;
>       /* Flag if dsp attributes are cached */
>       bool valid_attributes;
> +     /* Flag if audio PD init mem was allocated */
> +     bool audio_init_mem;
>       u32 dsp_attributes[FASTRPC_MAX_DSP_ATTRIBUTES];
>       struct fastrpc_device *secure_fdevice;
>       struct fastrpc_device *fdevice;
> -     struct fastrpc_buf *remote_heap;
> +     struct list_head rhmaps;
Other than Audiopd, do you see any other remote heaps getting added to
this list?

>       struct list_head invoke_interrupted_mmaps;
>       bool secure;
>       bool unsigned_support;
> @@ -1237,12 +1239,47 @@ static bool is_session_rejected(struct fastrpc_user 
> *fl, bool unsigned_pd_reques
>       return false;
>  }
>  
> +static void fastrpc_cleanup_rhmaps(struct fastrpc_channel_ctx *cctx)
> +{
> +     struct fastrpc_buf *buf, *b;
> +     struct list_head temp_list;
> +     int err;
> +     unsigned long flags;
> +
> +     INIT_LIST_HEAD(&temp_list);
> +
> +     spin_lock_irqsave(&cctx->lock, flags);
> +     list_splice_init(&cctx->rhmaps, &temp_list);
> +     spin_unlock_irqrestore(&cctx->lock, flags);

Can you explain why do we need to do this?

> +
> +     list_for_each_entry_safe(buf, b, &temp_list, node) {> +         if 
> (cctx->vmcount) {
> +                     u64 src_perms = 0;
> +                     struct qcom_scm_vmperm dst_perms;
> +                     u32 i;
> +
> +                     for (i = 0; i < cctx->vmcount; i++)
> +                             src_perms |= BIT(cctx->vmperms[i].vmid);
> +
> +                     dst_perms.vmid = QCOM_SCM_VMID_HLOS;
> +                     dst_perms.perm = QCOM_SCM_PERM_RWX;
> +                     err = qcom_scm_assign_mem(buf->phys, (u64)buf->size,
> +                                               &src_perms, &dst_perms, 1);
> +                     if (err)
> +                             continue;

Memory leak here.

> +             }
> +             fastrpc_buf_free(buf);
> +     }
> +}
> +

--srini

Reply via email to