Re: [PATCH] misc: fastrpc: create duplicate sessions after all CB probing
From: Vinayak Katoch
Date: Mon Jul 06 2026 - 02:13:19 EST
On 7/2/2026 1:51 AM, Srinivas Kandagatla wrote:
>
>
> On 6/9/26 11:33 AM, Vinayak Katoch wrote:
>> For ADSP, only a limited number of FastRPC context banks (CBs) are
>> available. Each CB supports a single session, which means only a few
>> processes can run on ADSP simultaneously. If all sessions are consumed
>> by fastrpc daemons, no session remains available when a user application
>> starts, causing the application to fail.
>>
>> To address this limitation, a Device Tree change was used till now:
>> qcom,nsessions = <5>;
>>
> You should mark this property as deprecated in dt bindings.
> Which should discourage people to use this property.
Ack, will update in v2.
> >
>> However, feedback from the upstream community indicated that this change
>> should not be made in the Device Tree. Instead, it was recommended to
>> handle this as a driver-level change.
>
> Changing it in driver will make it applicable for all the SoCs.
You are correct, that is the expected behaviour.
>
>>
>> Instead of duplicating sessions inline during fastrpc_cb_probe() using
>> the qcom,nsessions DT property, defer duplication until after
>> of_platform_populate() returns in fastrpc_rpmsg_probe(), at which point
>> all compute-CB child nodes have been probed and the session array is
>> fully populated.
>>
>> For the ADSP domain, append FASTRPC_DUP_SESSIONS (4) copies of the
>> last probed session once of_platform_populate() succeeds. This keeps
>> the per-CB probe path simple and ensures duplicates are always derived
>> from a stable, fully-initialised session state.
>>
>> The qcom,nsessions DT property is no longer consumed by the driver; the
>> binding and DT sources are left unchanged.
>>
>> Signed-off-by: Vinayak Katoch <vinayak.katoch@xxxxxxxxxxxxxxxx>
>> ---
>> drivers/misc/fastrpc.c | 31 ++++++++++++++++++-------------
>> 1 file changed, 18 insertions(+), 13 deletions(-)
>>
>> diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
>> index 1080f9acf70a..46afbae9c234 100644
>> --- a/drivers/misc/fastrpc.c
>> +++ b/drivers/misc/fastrpc.c
>> @@ -30,6 +30,7 @@
>> #define CDSP_DOMAIN_ID (3)
>> #define GDSP_DOMAIN_ID (4)
>> #define FASTRPC_MAX_SESSIONS 14
>> +#define FASTRPC_DUP_SESSIONS 4
>> #define FASTRPC_MAX_VMIDS 16
>> #define FASTRPC_ALIGN 128
>> #define FASTRPC_MAX_FDLIST 16
>> @@ -2195,7 +2196,6 @@ static int fastrpc_cb_probe(struct platform_device *pdev)
>> struct fastrpc_channel_ctx *cctx;
>> struct fastrpc_session_ctx *sess;
>> struct device *dev = &pdev->dev;
>> - int i, sessions = 0;
>> unsigned long flags;
>> int rc;
>> u32 dma_bits;
>> @@ -2204,8 +2204,6 @@ static int fastrpc_cb_probe(struct platform_device *pdev)
>> if (!cctx)
>> return -EINVAL;
>>
>> - of_property_read_u32(dev->of_node, "qcom,nsessions", &sessions);
>> -
>> spin_lock_irqsave(&cctx->lock, flags);
>> if (cctx->sesscount >= FASTRPC_MAX_SESSIONS) {
>> dev_err(&pdev->dev, "too many sessions\n");
>> @@ -2225,16 +2223,6 @@ static int fastrpc_cb_probe(struct platform_device *pdev)
>> if (of_property_read_u32(dev->of_node, "reg", &sess->sid))
>> dev_info(dev, "FastRPC Session ID not specified in DT\n");
>>
>> - if (sessions > 0) {
>> - struct fastrpc_session_ctx *dup_sess;
>> -
>> - for (i = 1; i < sessions; i++) {
>> - if (cctx->sesscount >= FASTRPC_MAX_SESSIONS)
>> - break;
>> - dup_sess = &cctx->session[cctx->sesscount++];
>> - memcpy(dup_sess, sess, sizeof(*dup_sess));
>> - }
>> - }
>> spin_unlock_irqrestore(&cctx->lock, flags);
>> rc = dma_set_mask(dev, DMA_BIT_MASK(dma_bits));
>> if (rc) {
>> @@ -2445,6 +2433,23 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
>> if (err)
>> goto err_deregister_fdev;
>>
>> + if (data->domain_id == ADSP_DOMAIN_ID && data->sesscount > 0) {
>> + struct fastrpc_session_ctx *last_sess;
>> + struct fastrpc_session_ctx *dup_sess;
>> + unsigned long flags;
>> + int i;
>> +
>> + spin_lock_irqsave(&data->lock, flags);
>> + last_sess = &data->session[data->sesscount - 1];
>
> Why only for last session?
The number of ADSP CBs is small (3–4), and earlier sessions are consumed
by fastrpc daemons. The last CB is the one available for user
applications, and the previous qcom,nsessions approach also targeted the
last CB implicitly. Open to a better approach if you have one in mind.
>
> This is now un conditionally done for ADSP which changes the whole
> behaviour.
Until now this duplication was only needed for ADSP since it has fewer
CBs compared to CDSP. CDSP has enough CBs that this is not a concern
there. The unconditional behaviour for ADSP is intentional as the CB
shortage is a hardware constraint common to all ADSP-capable SoCs.>
>> + for (i = 0; i < FASTRPC_DUP_SESSIONS; i++) {
>> + if (data->sesscount >= FASTRPC_MAX_SESSIONS)
>> + break;
>> + dup_sess = &data->session[data->sesscount++];
>> + memcpy(dup_sess, last_sess, sizeof(*dup_sess));
>> + }
>> + spin_unlock_irqrestore(&data->lock, flags);
>> + }
>> +
>> return 0;
>>
>> err_deregister_fdev:
>>
>> ---
>> base-commit: 97e797263a5e963da3d1e66e743fd518567dfe37
>> change-id: 20260609-dup-sessions-ea2acaac1994
>>
>> Best regards,
>