Message ID | 20220126135304.16340-2-srinivas.kandagatla@linaro.org |
---|---|
State | Accepted |
Commit | 965602eabb57d086466ad749e81941e3dd66b595 |
Headers | show |
Series | misc: fastrpc: Add missing DSP FastRPC features | expand |
Hi Srinivas, url: https://github.com/0day-ci/linux/commits/Srinivas-Kandagatla/misc-fastrpc-Add-missing-DSP-FastRPC-features/20220126-215705 base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git 515a2f507491e7c3818e74ef4f4e088c1fecb190 config: openrisc-randconfig-m031-20220124 (https://download.01.org/0day-ci/archive/20220127/202201271857.MGiOkhFo-lkp@intel.com/config) compiler: or1k-linux-gcc (GCC) 11.2.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> Reported-by: Dan Carpenter <dan.carpenter@oracle.com> New smatch warnings: drivers/misc/fastrpc.c:1636 fastrpc_device_register() warn: passing devm_ allocated variable to kfree. 'fdev' vim +/fdev +1636 drivers/misc/fastrpc.c 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1620 static int fastrpc_device_register(struct device *dev, struct fastrpc_channel_ctx *cctx, 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1621 const char *domain) 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1622 { 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1623 struct fastrpc_device *fdev; 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1624 int err; 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1625 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1626 fdev = devm_kzalloc(dev, sizeof(*fdev), GFP_KERNEL); ^^^^^^^^^^^^^^^^^^^ 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1627 if (!fdev) 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1628 return -ENOMEM; 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1629 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1630 fdev->cctx = cctx; 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1631 fdev->miscdev.minor = MISC_DYNAMIC_MINOR; 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1632 fdev->miscdev.fops = &fastrpc_fops; 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1633 fdev->miscdev.name = devm_kasprintf(dev, GFP_KERNEL, "fastrpc-%s", domain); 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1634 err = misc_register(&fdev->miscdev); 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1635 if (err) 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 @1636 kfree(fdev); ^^^^^^^^^^^ Double free 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1637 else 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1638 cctx->fdevice = fdev; 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1639 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1640 return err; 99d9d7a1c5f2dae Srinivas Kandagatla 2022-01-26 1641 } --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c index 4ccbf43e6bfa..00cf0dbb6084 100644 --- a/drivers/misc/fastrpc.c +++ b/drivers/misc/fastrpc.c @@ -78,7 +78,7 @@ #define USER_PD (1) #define SENSORS_PD (2) -#define miscdev_to_cctx(d) container_of(d, struct fastrpc_channel_ctx, miscdev) +#define miscdev_to_fdevice(d) container_of(d, struct fastrpc_device, miscdev) static const char *domains[FASTRPC_DEV_MAX] = { "adsp", "mdsp", "sdsp", "cdsp"}; @@ -212,8 +212,13 @@ struct fastrpc_channel_ctx { spinlock_t lock; struct idr ctx_idr; struct list_head users; - struct miscdevice miscdev; struct kref refcount; + struct fastrpc_device *fdevice; +}; + +struct fastrpc_device { + struct fastrpc_channel_ctx *cctx; + struct miscdevice miscdev; }; struct fastrpc_user { @@ -1220,10 +1225,14 @@ static int fastrpc_device_release(struct inode *inode, struct file *file) static int fastrpc_device_open(struct inode *inode, struct file *filp) { - struct fastrpc_channel_ctx *cctx = miscdev_to_cctx(filp->private_data); + struct fastrpc_channel_ctx *cctx = NULL; + struct fastrpc_device *fdevice = NULL; struct fastrpc_user *fl = NULL; unsigned long flags; + fdevice = miscdev_to_fdevice(filp->private_data); + cctx = fdevice->cctx; + fl = kzalloc(sizeof(*fl), GFP_KERNEL); if (!fl) return -ENOMEM; @@ -1608,6 +1617,29 @@ static struct platform_driver fastrpc_cb_driver = { }, }; +static int fastrpc_device_register(struct device *dev, struct fastrpc_channel_ctx *cctx, + const char *domain) +{ + struct fastrpc_device *fdev; + int err; + + fdev = devm_kzalloc(dev, sizeof(*fdev), GFP_KERNEL); + if (!fdev) + return -ENOMEM; + + fdev->cctx = cctx; + fdev->miscdev.minor = MISC_DYNAMIC_MINOR; + fdev->miscdev.fops = &fastrpc_fops; + fdev->miscdev.name = devm_kasprintf(dev, GFP_KERNEL, "fastrpc-%s", domain); + err = misc_register(&fdev->miscdev); + if (err) + kfree(fdev); + else + cctx->fdevice = fdev; + + return err; +} + static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev) { struct device *rdev = &rpdev->dev; @@ -1637,11 +1669,7 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev) if (!data) return -ENOMEM; - data->miscdev.minor = MISC_DYNAMIC_MINOR; - data->miscdev.name = devm_kasprintf(rdev, GFP_KERNEL, "fastrpc-%s", - domains[domain_id]); - data->miscdev.fops = &fastrpc_fops; - err = misc_register(&data->miscdev); + err = fastrpc_device_register(rdev, data, domains[domain_id]); if (err) { kfree(data); return err; @@ -1681,7 +1709,9 @@ static void fastrpc_rpmsg_remove(struct rpmsg_device *rpdev) fastrpc_notify_users(user); spin_unlock_irqrestore(&cctx->lock, flags); - misc_deregister(&cctx->miscdev); + if (cctx->fdevice) + misc_deregister(&cctx->fdevice->miscdev); + of_platform_depopulate(&rpdev->dev); cctx->rpdev = NULL;
Currently fastrpc misc device instance is within channel context struct with a kref. So we have 2 structs with refcount, both of them managing the same channel context structure. Separate fastrpc device from channel context and by adding a dedicated fastrpc_device structure, this should clean the structures a bit and also help when adding secure device node support. Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> --- drivers/misc/fastrpc.c | 48 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 9 deletions(-)