[PATCH v2] misc: fastrpc: Fix channel resource access in device_open
Ekansh Gupta
ekansh.gupta at oss.qualcomm.com
Thu Jun 19 05:10:26 UTC 2025
During rpmsg_probe, fastrpc device nodes are created first, then
channel specific resources are initialized, followed by
of_platform_populate, which triggers context bank probing. This
sequence can cause issues as applications might open the device
node before channel resources are initialized or the session is
available, leading to problems. For example, spin_lock is initialized
after the device node creation, but it is used in device_open,
potentially before initialization. Move device registration after
channel resource initialization in fastrpc_rpmsg_probe.
Fixes: f6f9279f2bf0e ("misc: fastrpc: Add Qualcomm fastrpc basic driver model")
Cc: stable at kernel.org
Signed-off-by: Ekansh Gupta <ekansh.gupta at oss.qualcomm.com>
---
Patch v1: https://lore.kernel.org/all/20250517072432.1331803-1-ekansh.gupta@oss.qualcomm.com/
Changes in v2:
- Moved device registration after channel resource initialization
to resolve the problem.
- Modified commit text accordingly.
drivers/misc/fastrpc.c | 32 ++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 378923594f02..f9a2ab82d823 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -2326,6 +2326,22 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
secure_dsp = !(of_property_read_bool(rdev->of_node, "qcom,non-secure-domain"));
data->secure = secure_dsp;
+ kref_init(&data->refcount);
+
+ dev_set_drvdata(&rpdev->dev, data);
+ rdev->dma_mask = &data->dma_mask;
+ dma_set_mask_and_coherent(rdev, DMA_BIT_MASK(32));
+ INIT_LIST_HEAD(&data->users);
+ INIT_LIST_HEAD(&data->invoke_interrupted_mmaps);
+ spin_lock_init(&data->lock);
+ idr_init(&data->ctx_idr);
+ data->domain_id = domain_id;
+ data->rpdev = rpdev;
+
+ err = of_platform_populate(rdev->of_node, NULL, NULL, rdev);
+ if (err)
+ goto err_free_data;
+
switch (domain_id) {
case ADSP_DOMAIN_ID:
case MDSP_DOMAIN_ID:
@@ -2353,22 +2369,6 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
goto err_free_data;
}
- kref_init(&data->refcount);
-
- dev_set_drvdata(&rpdev->dev, data);
- rdev->dma_mask = &data->dma_mask;
- dma_set_mask_and_coherent(rdev, DMA_BIT_MASK(32));
- INIT_LIST_HEAD(&data->users);
- INIT_LIST_HEAD(&data->invoke_interrupted_mmaps);
- spin_lock_init(&data->lock);
- idr_init(&data->ctx_idr);
- data->domain_id = domain_id;
- data->rpdev = rpdev;
-
- err = of_platform_populate(rdev->of_node, NULL, NULL, rdev);
- if (err)
- goto err_deregister_fdev;
-
return 0;
err_deregister_fdev:
--
2.34.1
More information about the dri-devel
mailing list