On 11/22/2024 3:51 AM, Dmitry Baryshkov wrote: > On Thu, Nov 21, 2024 at 02:17:12PM +0530, Ekansh Gupta wrote: >> Memory intensive applications(which requires more tha 4GB) that wants >> to offload tasks to DSP might have to split the tasks to multiple >> user PD to make the resources available. >> >> For every call to DSP, fastrpc driver passes the process tgid which >> works as an identifier for the DSP to enqueue the tasks to specific PD. >> With current design, if any process opens device node more than once >> and makes PD init request, same tgid will be passed to DSP which will >> be considered a bad request and this will result in failure as the same >> identifier cannot be used for multiple DSP PD. >> >> Assign and pass a client ID to DSP which would be assigned during device >> open and will be dependent on the index of session allocated for the PD. >> This will allow the same process to open the device more than once and >> spawn multiple dynamic PD for ease of processing. >> >> Signed-off-by: Ekansh Gupta <quic_ekangupt@xxxxxxxxxxx> >> --- >> drivers/misc/fastrpc.c | 30 ++++++++++++++++-------------- >> 1 file changed, 16 insertions(+), 14 deletions(-) >> >> diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c >> index 74181b8c386b..08f223c95c33 100644 >> --- a/drivers/misc/fastrpc.c >> +++ b/drivers/misc/fastrpc.c >> @@ -39,6 +39,7 @@ >> #define FASTRPC_INIT_HANDLE 1 >> #define FASTRPC_DSP_UTILITIES_HANDLE 2 >> #define FASTRPC_CTXID_MASK (0xFF0) >> +#define FASTRPC_CLIENTID_MASK GENMASK(4, 4) > GENMASK(4,4) is just BIT(4), isn't it? > >> #define INIT_FILELEN_MAX (2 * 1024 * 1024) >> #define INIT_FILE_NAMELEN_MAX (128) >> #define FASTRPC_DEVICE_NAME "fastrpc" >> @@ -299,7 +300,7 @@ struct fastrpc_user { >> struct fastrpc_session_ctx *sctx; >> struct fastrpc_buf *init_mem; >> >> - int tgid; >> + int client_id; >> int pd; >> bool is_secure_dev; >> /* Lock for lists */ >> @@ -614,7 +615,7 @@ static struct fastrpc_invoke_ctx *fastrpc_context_alloc( >> ctx->sc = sc; >> ctx->retval = -1; >> ctx->pid = current->pid; >> - ctx->tgid = user->tgid; >> + ctx->tgid = user->client_id; >> ctx->cctx = cctx; >> init_completion(&ctx->work); >> INIT_WORK(&ctx->put_work, fastrpc_context_put_wq); >> @@ -1115,7 +1116,7 @@ static int fastrpc_invoke_send(struct fastrpc_session_ctx *sctx, >> int ret; >> >> cctx = fl->cctx; >> - msg->pid = fl->tgid; >> + msg->pid = fl->client_id; >> msg->tid = current->pid; >> >> if (kernel) >> @@ -1293,7 +1294,7 @@ static int fastrpc_init_create_static_process(struct fastrpc_user *fl, >> } >> } >> >> - inbuf.pgid = fl->tgid; >> + inbuf.pgid = fl->client_id; >> inbuf.namelen = init.namelen; >> inbuf.pageslen = 0; >> fl->pd = USER_PD; >> @@ -1395,7 +1396,7 @@ static int fastrpc_init_create_process(struct fastrpc_user *fl, >> goto err; >> } >> >> - inbuf.pgid = fl->tgid; >> + inbuf.pgid = fl->client_id; >> inbuf.namelen = strlen(current->comm) + 1; >> inbuf.filelen = init.filelen; >> inbuf.pageslen = 1; >> @@ -1469,8 +1470,9 @@ static int fastrpc_init_create_process(struct fastrpc_user *fl, >> } >> >> static struct fastrpc_session_ctx *fastrpc_session_alloc( >> - struct fastrpc_channel_ctx *cctx) >> + struct fastrpc_user *fl) >> { >> + struct fastrpc_channel_ctx *cctx = fl->cctx; >> struct fastrpc_session_ctx *session = NULL; >> unsigned long flags; >> int i; >> @@ -1480,6 +1482,7 @@ static struct fastrpc_session_ctx *fastrpc_session_alloc( >> if (!cctx->session[i].used && cctx->session[i].valid) { >> cctx->session[i].used = true; >> session = &cctx->session[i]; >> + fl->client_id = FASTRPC_CLIENTID_MASK | i; > So, it's not a mask, but a flag. Why is it necessary at all? Can you > just pass i? Or i+1? This also works as I just need to pass a non-zero unique identifier to DSP. I'll update this in the next patch. Thanks for reviewing. --ekansh > >> break; >> } >> } >> @@ -1504,7 +1507,7 @@ static int fastrpc_release_current_dsp_process(struct fastrpc_user *fl) >> int tgid = 0; >> u32 sc; >> >> - tgid = fl->tgid; >> + tgid = fl->client_id; >> args[0].ptr = (u64)(uintptr_t) &tgid; >> args[0].length = sizeof(tgid); >> args[0].fd = -1; >> @@ -1579,11 +1582,10 @@ static int fastrpc_device_open(struct inode *inode, struct file *filp) >> INIT_LIST_HEAD(&fl->maps); >> INIT_LIST_HEAD(&fl->mmaps); >> INIT_LIST_HEAD(&fl->user); >> - fl->tgid = current->tgid; >> fl->cctx = cctx; >> fl->is_secure_dev = fdevice->secure; >> >> - fl->sctx = fastrpc_session_alloc(cctx); >> + fl->sctx = fastrpc_session_alloc(fl); >> if (!fl->sctx) { >> dev_err(&cctx->rpdev->dev, "No session available\n"); >> mutex_destroy(&fl->mutex); >> @@ -1647,7 +1649,7 @@ static int fastrpc_dmabuf_alloc(struct fastrpc_user *fl, char __user *argp) >> static int fastrpc_init_attach(struct fastrpc_user *fl, int pd) >> { >> struct fastrpc_invoke_args args[1]; >> - int tgid = fl->tgid; >> + int tgid = fl->client_id; >> u32 sc; >> >> args[0].ptr = (u64)(uintptr_t) &tgid; >> @@ -1803,7 +1805,7 @@ static int fastrpc_req_munmap_impl(struct fastrpc_user *fl, struct fastrpc_buf * >> int err; >> u32 sc; >> >> - req_msg.pgid = fl->tgid; >> + req_msg.pgid = fl->client_id; >> req_msg.size = buf->size; >> req_msg.vaddr = buf->raddr; >> >> @@ -1889,7 +1891,7 @@ static int fastrpc_req_mmap(struct fastrpc_user *fl, char __user *argp) >> return err; >> } >> >> - req_msg.pgid = fl->tgid; >> + req_msg.pgid = fl->client_id; >> req_msg.flags = req.flags; >> req_msg.vaddr = req.vaddrin; >> req_msg.num = sizeof(pages); >> @@ -1978,7 +1980,7 @@ static int fastrpc_req_mem_unmap_impl(struct fastrpc_user *fl, struct fastrpc_me >> return -EINVAL; >> } >> >> - req_msg.pgid = fl->tgid; >> + req_msg.pgid = fl->client_id; >> req_msg.len = map->len; >> req_msg.vaddrin = map->raddr; >> req_msg.fd = map->fd; >> @@ -2031,7 +2033,7 @@ static int fastrpc_req_mem_map(struct fastrpc_user *fl, char __user *argp) >> return err; >> } >> >> - req_msg.pgid = fl->tgid; >> + req_msg.pgid = fl->client_id; >> req_msg.fd = req.fd; >> req_msg.offset = req.offset; >> req_msg.vaddrin = req.vaddrin; >> -- >> 2.34.1 >>