For any remote call, driver sends a message to DSP using RPMSG
framework. After message is sent, there is a wait on a completion
object at driver which is completed when DSP response is received.
There is a possibility that a signal is received while waiting
causing the wait function to return -ERESTARTSYS. In this case
the context should be saved and it should get restored for the
next invocation for the thread.
Adding changes to support saving and restoring of interrupted
fastrpc contexts.
Signed-off-by: Ekansh Gupta <quic_ekangupt@quicinc.com>
---
drivers/misc/fastrpc.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 72 insertions(+), 4 deletions(-)
diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index f8c1c381..1b26718 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -332,6 +332,7 @@ struct fastrpc_user {
struct list_head user;
struct list_head maps;
struct list_head pending;
+ struct list_head interrupted;
struct list_head mmaps;
struct fastrpc_channel_ctx *cctx;
@@ -711,6 +712,40 @@ static struct fastrpc_invoke_ctx *fastrpc_context_alloc(
return ERR_PTR(ret);
}
+static struct fastrpc_invoke_ctx *fastrpc_context_restore_interrupted(
+ struct fastrpc_user *fl, struct fastrpc_invoke *inv)
+{
+ struct fastrpc_invoke_ctx *ctx = NULL, *ictx = NULL, *n;
+
+ spin_lock(&fl->lock);
+ list_for_each_entry_safe(ictx, n, &fl->interrupted, node) {
+ if (ictx->pid == current->pid) {
+ if (inv->sc != ictx->sc || ictx->fl != fl) {
+ dev_err(ictx->fl->sctx->dev,
+ "interrupted sc (0x%x) or fl (%pK) does not match with invoke sc (0x%x) or fl (%pK)\n",
+ ictx->sc, ictx->fl, inv->sc, fl);
+ spin_unlock(&fl->lock);
+ return ERR_PTR(-EINVAL);
+ }
+ ctx = ictx;
+ list_del(&ctx->node);
+ list_add_tail(&ctx->node, &fl->pending);
+ break;
+ }
+ }
+ spin_unlock(&fl->lock);
+ return ctx;
+}
+
+static void fastrpc_context_save_interrupted(
+ struct fastrpc_invoke_ctx *ctx)
+{
+ spin_lock(&ctx->fl->lock);
+ list_del(&ctx->node);
+ list_add_tail(&ctx->node, &ctx->fl->interrupted);
+ spin_unlock(&ctx->fl->lock);
+}
+
static struct sg_table *
fastrpc_map_dma_buf(struct dma_buf_attachment *attachment,
enum dma_data_direction dir)
@@ -1261,6 +1296,14 @@ static int fastrpc_internal_invoke(struct fastrpc_user *fl, u32 kernel,
return -EPERM;
}
+ if (!kernel) {
+ ctx = fastrpc_context_restore_interrupted(fl, inv);
+ if (IS_ERR(ctx))
+ return PTR_ERR(ctx);
+ if (ctx)
+ goto wait;
+ }
+
ctx = fastrpc_context_alloc(fl, kernel, sc, invoke);
if (IS_ERR(ctx))
return PTR_ERR(ctx);
@@ -1284,6 +1327,7 @@ static int fastrpc_internal_invoke(struct fastrpc_user *fl, u32 kernel,
goto bail;
PERF_END);
+wait:
if (kernel) {
if (!wait_for_completion_timeout(&ctx->work, 10 * HZ))
err = -ETIMEDOUT;
@@ -1320,6 +1364,9 @@ static int fastrpc_internal_invoke(struct fastrpc_user *fl, u32 kernel,
}
if (err == -ERESTARTSYS) {
+ if (ctx)
+ fastrpc_context_save_interrupted(ctx);
+
list_for_each_entry_safe(buf, b, &fl->mmaps, node) {
list_del(&buf->node);
list_add_tail(&buf->node, &fl->cctx->invoke_interrupted_mmaps);
@@ -1620,6 +1667,25 @@ static void fastrpc_session_free(struct fastrpc_channel_ctx *cctx,
spin_unlock_irqrestore(&cctx->lock, flags);
}
+static void fastrpc_context_list_free(struct fastrpc_user *fl)
+{
+ struct fastrpc_invoke_ctx *ctx, *n;
+
+ list_for_each_entry_safe(ctx, n, &fl->interrupted, node) {
+ spin_lock(&fl->lock);
+ list_del(&ctx->node);
+ spin_unlock(&fl->lock);
+ fastrpc_context_put(ctx);
+ }
+
+ list_for_each_entry_safe(ctx, n, &fl->pending, node) {
+ spin_lock(&fl->lock);
+ list_del(&ctx->node);
+ spin_unlock(&fl->lock);
+ fastrpc_context_put(ctx);
+ }
+}
+
static int fastrpc_release_current_dsp_process(struct fastrpc_user *fl)
{
struct fastrpc_invoke_args args[1];
@@ -1656,10 +1722,7 @@ static int fastrpc_device_release(struct inode *inode, struct file *file)
if (fl->init_mem)
fastrpc_buf_free(fl->init_mem);
- list_for_each_entry_safe(ctx, n, &fl->pending, node) {
- list_del(&ctx->node);
- fastrpc_context_put(ctx);
- }
+ fastrpc_context_list_free(fl);
list_for_each_entry_safe(map, m, &fl->maps, node)
fastrpc_map_put(map);
@@ -1700,6 +1763,7 @@ static int fastrpc_device_open(struct inode *inode, struct file *filp)
spin_lock_init(&fl->lock);
mutex_init(&fl->mutex);
INIT_LIST_HEAD(&fl->pending);
+ INIT_LIST_HEAD(&fl->interrupted);
INIT_LIST_HEAD(&fl->maps);
INIT_LIST_HEAD(&fl->mmaps);
INIT_LIST_HEAD(&fl->user);
@@ -2555,6 +2619,10 @@ static void fastrpc_notify_users(struct fastrpc_user *user)
ctx->retval = -EPIPE;
complete(&ctx->work);
}
+ list_for_each_entry(ctx, &user->interrupted, node) {
+ ctx->retval = -EPIPE;
+ complete(&ctx->work);
+ }
spin_unlock(&user->lock);
}
--
2.7.4
Hi Ekansh,
kernel test robot noticed the following build warnings:
[auto build test WARNING on char-misc/char-misc-testing]
[also build test WARNING on char-misc/char-misc-next char-misc/char-misc-linus linus/master v6.5 next-20230831]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Ekansh-Gupta/misc-fastrpc-Add-fastrpc-multimode-invoke-request-support/20230901-002929
base: char-misc/char-misc-testing
patch link: https://lore.kernel.org/r/1693499292-19083-5-git-send-email-quic_ekangupt%40quicinc.com
patch subject: [PATCH v1 4/5] misc: fastrpc: Add support to save and restore interrupted
config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20230901/202309010926.bLqVExVs-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230901/202309010926.bLqVExVs-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202309010926.bLqVExVs-lkp@intel.com/
All warnings (new ones prefixed by >>):
drivers/misc/fastrpc.c: In function 'fastrpc_context_alloc':
drivers/misc/fastrpc.c:663:29: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
663 | ctx->args = (struct fastrpc_invoke_args *)invoke->inv.args;
| ^
drivers/misc/fastrpc.c: In function 'fastrpc_init_create_static_process':
drivers/misc/fastrpc.c:1494:26: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
1494 | ioctl.inv.args = (__u64)args;
| ^
drivers/misc/fastrpc.c: In function 'fastrpc_init_create_process':
drivers/misc/fastrpc.c:1627:26: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
1627 | ioctl.inv.args = (__u64)args;
| ^
drivers/misc/fastrpc.c: In function 'fastrpc_release_current_dsp_process':
drivers/misc/fastrpc.c:1710:26: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
1710 | ioctl.inv.args = (__u64)args;
| ^
drivers/misc/fastrpc.c: In function 'fastrpc_device_release':
>> drivers/misc/fastrpc.c:1719:42: warning: unused variable 'n' [-Wunused-variable]
1719 | struct fastrpc_invoke_ctx *ctx, *n;
| ^
>> drivers/misc/fastrpc.c:1719:36: warning: unused variable 'ctx' [-Wunused-variable]
1719 | struct fastrpc_invoke_ctx *ctx, *n;
| ^~~
drivers/misc/fastrpc.c: In function 'fastrpc_init_attach':
drivers/misc/fastrpc.c:1856:26: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
1856 | ioctl.inv.args = (__u64)args;
| ^
drivers/misc/fastrpc.c: In function 'fastrpc_invoke':
drivers/misc/fastrpc.c:1887:26: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
1887 | ioctl.inv.args = (__u64)args;
| ^
drivers/misc/fastrpc.c: In function 'fastrpc_multimode_invoke':
drivers/misc/fastrpc.c:1928:33: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
1928 | einv.inv.args = (__u64)args;
| ^
drivers/misc/fastrpc.c: In function 'fastrpc_get_info_from_dsp':
drivers/misc/fastrpc.c:1958:26: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
1958 | ioctl.inv.args = (__u64)args;
| ^
drivers/misc/fastrpc.c: In function 'fastrpc_req_munmap_impl':
drivers/misc/fastrpc.c:2061:26: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
2061 | ioctl.inv.args = (__u64)args;
| ^
drivers/misc/fastrpc.c: In function 'fastrpc_req_mmap':
drivers/misc/fastrpc.c:2159:26: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
2159 | ioctl.inv.args = (__u64)args;
| ^
drivers/misc/fastrpc.c: In function 'fastrpc_req_mem_unmap_impl':
drivers/misc/fastrpc.c:2240:26: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
2240 | ioctl.inv.args = (__u64)args;
| ^
drivers/misc/fastrpc.c: In function 'fastrpc_req_mem_map':
drivers/misc/fastrpc.c:2309:26: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
2309 | ioctl.inv.args = (__u64)args;
| ^
vim +/n +1719 drivers/misc/fastrpc.c
0871561055e666 Abel Vesa 2022-11-25 1530
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1531 static int fastrpc_init_create_process(struct fastrpc_user *fl,
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1532 char __user *argp)
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1533 {
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1534 struct fastrpc_init_create init;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1535 struct fastrpc_invoke_args *args;
db2e49fb9bf108 Ekansh Gupta 2023-08-31 1536 struct fastrpc_enhanced_invoke ioctl;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1537 struct fastrpc_phy_page pages[1];
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1538 struct fastrpc_map *map = NULL;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1539 struct fastrpc_buf *imem = NULL;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1540 int memlen;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1541 int err;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1542 struct {
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1543 int pgid;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1544 u32 namelen;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1545 u32 filelen;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1546 u32 pageslen;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1547 u32 attrs;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1548 u32 siglen;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1549 } inbuf;
7f1f481263c3ce Jeya R 2022-02-14 1550 bool unsigned_module = false;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1551
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1552 args = kcalloc(FASTRPC_CREATE_PROCESS_NARGS, sizeof(*args), GFP_KERNEL);
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1553 if (!args)
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1554 return -ENOMEM;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1555
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1556 if (copy_from_user(&init, argp, sizeof(init))) {
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1557 err = -EFAULT;
b49f6d83e290f1 Thierry Escande 2019-03-07 1558 goto err;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1559 }
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1560
7f1f481263c3ce Jeya R 2022-02-14 1561 if (init.attrs & FASTRPC_MODE_UNSIGNED_MODULE)
7f1f481263c3ce Jeya R 2022-02-14 1562 unsigned_module = true;
7f1f481263c3ce Jeya R 2022-02-14 1563
7f1f481263c3ce Jeya R 2022-02-14 1564 if (is_session_rejected(fl, unsigned_module)) {
7f1f481263c3ce Jeya R 2022-02-14 1565 err = -ECONNREFUSED;
7f1f481263c3ce Jeya R 2022-02-14 1566 goto err;
7f1f481263c3ce Jeya R 2022-02-14 1567 }
7f1f481263c3ce Jeya R 2022-02-14 1568
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1569 if (init.filelen > INIT_FILELEN_MAX) {
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1570 err = -EINVAL;
b49f6d83e290f1 Thierry Escande 2019-03-07 1571 goto err;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1572 }
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1573
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1574 inbuf.pgid = fl->tgid;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1575 inbuf.namelen = strlen(current->comm) + 1;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1576 inbuf.filelen = init.filelen;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1577 inbuf.pageslen = 1;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1578 inbuf.attrs = init.attrs;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1579 inbuf.siglen = init.siglen;
84195d206e1fbd Jonathan Marek 2020-09-08 1580 fl->pd = USER_PD;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1581
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1582 if (init.filelen && init.filefd) {
e90d911906196b Vamsi Krishna Gattupalli 2022-02-14 1583 err = fastrpc_map_create(fl, init.filefd, init.filelen, 0, &map);
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1584 if (err)
b49f6d83e290f1 Thierry Escande 2019-03-07 1585 goto err;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1586 }
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1587
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1588 memlen = ALIGN(max(INIT_FILELEN_MAX, (int)init.filelen * 4),
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1589 1024 * 1024);
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1590 err = fastrpc_buf_alloc(fl, fl->sctx->dev, memlen,
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1591 &imem);
b49f6d83e290f1 Thierry Escande 2019-03-07 1592 if (err)
b49f6d83e290f1 Thierry Escande 2019-03-07 1593 goto err_alloc;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1594
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1595 fl->init_mem = imem;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1596 args[0].ptr = (u64)(uintptr_t)&inbuf;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1597 args[0].length = sizeof(inbuf);
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1598 args[0].fd = -1;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1599
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1600 args[1].ptr = (u64)(uintptr_t)current->comm;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1601 args[1].length = inbuf.namelen;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1602 args[1].fd = -1;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1603
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1604 args[2].ptr = (u64) init.file;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1605 args[2].length = inbuf.filelen;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1606 args[2].fd = init.filefd;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1607
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1608 pages[0].addr = imem->phys;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1609 pages[0].size = imem->size;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1610
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1611 args[3].ptr = (u64)(uintptr_t) pages;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1612 args[3].length = 1 * sizeof(*pages);
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1613 args[3].fd = -1;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1614
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1615 args[4].ptr = (u64)(uintptr_t)&inbuf.attrs;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1616 args[4].length = sizeof(inbuf.attrs);
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1617 args[4].fd = -1;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1618
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1619 args[5].ptr = (u64)(uintptr_t) &inbuf.siglen;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1620 args[5].length = sizeof(inbuf.siglen);
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1621 args[5].fd = -1;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1622
db2e49fb9bf108 Ekansh Gupta 2023-08-31 1623 ioctl.inv.handle = FASTRPC_INIT_HANDLE;
db2e49fb9bf108 Ekansh Gupta 2023-08-31 1624 ioctl.inv.sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_CREATE, 4, 0);
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1625 if (init.attrs)
db2e49fb9bf108 Ekansh Gupta 2023-08-31 1626 ioctl.inv.sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_CREATE_ATTR, 4, 0);
db2e49fb9bf108 Ekansh Gupta 2023-08-31 @1627 ioctl.inv.args = (__u64)args;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1628
db2e49fb9bf108 Ekansh Gupta 2023-08-31 1629 err = fastrpc_internal_invoke(fl, true, &ioctl);
b49f6d83e290f1 Thierry Escande 2019-03-07 1630 if (err)
b49f6d83e290f1 Thierry Escande 2019-03-07 1631 goto err_invoke;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1632
b49f6d83e290f1 Thierry Escande 2019-03-07 1633 kfree(args);
b49f6d83e290f1 Thierry Escande 2019-03-07 1634
b49f6d83e290f1 Thierry Escande 2019-03-07 1635 return 0;
b49f6d83e290f1 Thierry Escande 2019-03-07 1636
b49f6d83e290f1 Thierry Escande 2019-03-07 1637 err_invoke:
b49f6d83e290f1 Thierry Escande 2019-03-07 1638 fl->init_mem = NULL;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1639 fastrpc_buf_free(imem);
b49f6d83e290f1 Thierry Escande 2019-03-07 1640 err_alloc:
b49f6d83e290f1 Thierry Escande 2019-03-07 1641 fastrpc_map_put(map);
b49f6d83e290f1 Thierry Escande 2019-03-07 1642 err:
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1643 kfree(args);
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1644
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1645 return err;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1646 }
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1647
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1648 static struct fastrpc_session_ctx *fastrpc_session_alloc(
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1649 struct fastrpc_channel_ctx *cctx)
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1650 {
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1651 struct fastrpc_session_ctx *session = NULL;
977e6c8d1d1806 Srinivas Kandagatla 2019-03-07 1652 unsigned long flags;
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1653 int i;
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1654
977e6c8d1d1806 Srinivas Kandagatla 2019-03-07 1655 spin_lock_irqsave(&cctx->lock, flags);
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1656 for (i = 0; i < cctx->sesscount; i++) {
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1657 if (!cctx->session[i].used && cctx->session[i].valid) {
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1658 cctx->session[i].used = true;
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1659 session = &cctx->session[i];
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1660 break;
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1661 }
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1662 }
977e6c8d1d1806 Srinivas Kandagatla 2019-03-07 1663 spin_unlock_irqrestore(&cctx->lock, flags);
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1664
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1665 return session;
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1666 }
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1667
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1668 static void fastrpc_session_free(struct fastrpc_channel_ctx *cctx,
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1669 struct fastrpc_session_ctx *session)
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1670 {
977e6c8d1d1806 Srinivas Kandagatla 2019-03-07 1671 unsigned long flags;
977e6c8d1d1806 Srinivas Kandagatla 2019-03-07 1672
977e6c8d1d1806 Srinivas Kandagatla 2019-03-07 1673 spin_lock_irqsave(&cctx->lock, flags);
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1674 session->used = false;
977e6c8d1d1806 Srinivas Kandagatla 2019-03-07 1675 spin_unlock_irqrestore(&cctx->lock, flags);
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1676 }
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1677
1d9e27a4779236 Ekansh Gupta 2023-08-31 1678 static void fastrpc_context_list_free(struct fastrpc_user *fl)
1d9e27a4779236 Ekansh Gupta 2023-08-31 1679 {
1d9e27a4779236 Ekansh Gupta 2023-08-31 1680 struct fastrpc_invoke_ctx *ctx, *n;
1d9e27a4779236 Ekansh Gupta 2023-08-31 1681
1d9e27a4779236 Ekansh Gupta 2023-08-31 1682 list_for_each_entry_safe(ctx, n, &fl->interrupted, node) {
1d9e27a4779236 Ekansh Gupta 2023-08-31 1683 spin_lock(&fl->lock);
1d9e27a4779236 Ekansh Gupta 2023-08-31 1684 list_del(&ctx->node);
1d9e27a4779236 Ekansh Gupta 2023-08-31 1685 spin_unlock(&fl->lock);
1d9e27a4779236 Ekansh Gupta 2023-08-31 1686 fastrpc_context_put(ctx);
1d9e27a4779236 Ekansh Gupta 2023-08-31 1687 }
1d9e27a4779236 Ekansh Gupta 2023-08-31 1688
1d9e27a4779236 Ekansh Gupta 2023-08-31 1689 list_for_each_entry_safe(ctx, n, &fl->pending, node) {
1d9e27a4779236 Ekansh Gupta 2023-08-31 1690 spin_lock(&fl->lock);
1d9e27a4779236 Ekansh Gupta 2023-08-31 1691 list_del(&ctx->node);
1d9e27a4779236 Ekansh Gupta 2023-08-31 1692 spin_unlock(&fl->lock);
1d9e27a4779236 Ekansh Gupta 2023-08-31 1693 fastrpc_context_put(ctx);
1d9e27a4779236 Ekansh Gupta 2023-08-31 1694 }
1d9e27a4779236 Ekansh Gupta 2023-08-31 1695 }
1d9e27a4779236 Ekansh Gupta 2023-08-31 1696
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1697 static int fastrpc_release_current_dsp_process(struct fastrpc_user *fl)
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1698 {
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1699 struct fastrpc_invoke_args args[1];
db2e49fb9bf108 Ekansh Gupta 2023-08-31 1700 struct fastrpc_enhanced_invoke ioctl;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1701 int tgid = 0;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1702
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1703 tgid = fl->tgid;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1704 args[0].ptr = (u64)(uintptr_t) &tgid;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1705 args[0].length = sizeof(tgid);
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1706 args[0].fd = -1;
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1707
db2e49fb9bf108 Ekansh Gupta 2023-08-31 1708 ioctl.inv.handle = FASTRPC_INIT_HANDLE;
db2e49fb9bf108 Ekansh Gupta 2023-08-31 1709 ioctl.inv.sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_RELEASE, 1, 0);
db2e49fb9bf108 Ekansh Gupta 2023-08-31 @1710 ioctl.inv.args = (__u64)args;
db2e49fb9bf108 Ekansh Gupta 2023-08-31 1711
db2e49fb9bf108 Ekansh Gupta 2023-08-31 1712 return fastrpc_internal_invoke(fl, true, &ioctl);
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1713 }
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1714
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1715 static int fastrpc_device_release(struct inode *inode, struct file *file)
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1716 {
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1717 struct fastrpc_user *fl = (struct fastrpc_user *)file->private_data;
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1718 struct fastrpc_channel_ctx *cctx = fl->cctx;
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 @1719 struct fastrpc_invoke_ctx *ctx, *n;
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 1720 struct fastrpc_map *map, *m;
2419e55e532de1 Jorge Ramirez-Ortiz 2019-10-09 1721 struct fastrpc_buf *buf, *b;
977e6c8d1d1806 Srinivas Kandagatla 2019-03-07 1722 unsigned long flags;
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1723
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1724 fastrpc_release_current_dsp_process(fl);
d73f71c7c6ee15 Srinivas Kandagatla 2019-02-08 1725
977e6c8d1d1806 Srinivas Kandagatla 2019-03-07 1726 spin_lock_irqsave(&cctx->lock, flags);
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1727 list_del(&fl->user);
977e6c8d1d1806 Srinivas Kandagatla 2019-03-07 1728 spin_unlock_irqrestore(&cctx->lock, flags);
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1729
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 1730 if (fl->init_mem)
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 1731 fastrpc_buf_free(fl->init_mem);
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 1732
1d9e27a4779236 Ekansh Gupta 2023-08-31 1733 fastrpc_context_list_free(fl);
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 1734
5bb96c8f9268e2 Abel Vesa 2022-11-24 1735 list_for_each_entry_safe(map, m, &fl->maps, node)
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 1736 fastrpc_map_put(map);
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 1737
2419e55e532de1 Jorge Ramirez-Ortiz 2019-10-09 1738 list_for_each_entry_safe(buf, b, &fl->mmaps, node) {
2419e55e532de1 Jorge Ramirez-Ortiz 2019-10-09 1739 list_del(&buf->node);
2419e55e532de1 Jorge Ramirez-Ortiz 2019-10-09 1740 fastrpc_buf_free(buf);
2419e55e532de1 Jorge Ramirez-Ortiz 2019-10-09 1741 }
2419e55e532de1 Jorge Ramirez-Ortiz 2019-10-09 1742
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1743 fastrpc_session_free(cctx, fl->sctx);
278d56f970ae6e Bjorn Andersson 2019-08-29 1744 fastrpc_channel_ctx_put(cctx);
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1745
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1746 mutex_destroy(&fl->mutex);
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1747 kfree(fl);
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1748 file->private_data = NULL;
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1749
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1750 return 0;
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1751 }
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 1752
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
© 2016 - 2025 Red Hat, Inc.