All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] rpmsg: mtk_rpmsg: Fix circular locking dependency
@ 2022-01-14 14:47 ` AngeloGioacchino Del Regno
  0 siblings, 0 replies; 30+ messages in thread
From: AngeloGioacchino Del Regno @ 2022-01-14 14:47 UTC (permalink / raw)
  To: bjorn.andersson
  Cc: mathieu.poirier, matthias.bgg, pihsun, linux-remoteproc,
	linux-arm-kernel, linux-mediatek, linux-kernel, kernel,
	AngeloGioacchino Del Regno

During execution of the worker that's used to register rpmsg devices
we are safely locking the channels mutex but, when creating a new
endpoint for such devices, we are registering a IPI on the SCP, which
then makes the SCP to trigger an interrupt, lock its own mutex and in
turn register more subdevices.
This creates a circular locking dependency situation, as the mtk_rpmsg
channels_lock will then depend on the SCP IPI lock.

[   18.014514]  Possible unsafe locking scenario:
[   18.014515]        CPU0                    CPU1
[   18.014517]        ----                    ----
[   18.045467]   lock(&mtk_subdev->channels_lock);
[   18.045474]                                lock(&scp->ipi_desc[i].lock);
[   18.228399]                                lock(&mtk_subdev->channels_lock);
[   18.228405]   lock(&scp->ipi_desc[i].lock);
[   18.264405]

To solve this, simply unlock the channels_lock mutex before calling
mtk_rpmsg_register_device() and relock it right after, as safety is
still ensured by the locking mechanism that happens right after
through SCP.
Notably, mtk_rpmsg_register_device() does not even require locking.

Fixes: 7017996951fd ("rpmsg: add rpmsg support for mt8183 SCP.")
Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
---
 drivers/rpmsg/mtk_rpmsg.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/rpmsg/mtk_rpmsg.c b/drivers/rpmsg/mtk_rpmsg.c
index 5b4404b8be4c..d1213c33da20 100644
--- a/drivers/rpmsg/mtk_rpmsg.c
+++ b/drivers/rpmsg/mtk_rpmsg.c
@@ -234,7 +234,9 @@ static void mtk_register_device_work_function(struct work_struct *register_work)
 		if (info->registered)
 			continue;
 
+		mutex_unlock(&subdev->channels_lock);
 		ret = mtk_rpmsg_register_device(subdev, &info->info);
+		mutex_lock(&subdev->channels_lock);
 		if (ret) {
 			dev_err(&pdev->dev, "Can't create rpmsg_device\n");
 			continue;
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 30+ messages in thread

end of thread, other threads:[~2022-04-29 13:38 UTC | newest]

Thread overview: 30+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-14 14:47 [PATCH] rpmsg: mtk_rpmsg: Fix circular locking dependency AngeloGioacchino Del Regno
2022-01-14 14:47 ` AngeloGioacchino Del Regno
2022-01-14 14:47 ` AngeloGioacchino Del Regno
2022-02-16 16:06 ` AngeloGioacchino Del Regno
2022-02-16 16:06   ` AngeloGioacchino Del Regno
2022-02-16 16:06   ` AngeloGioacchino Del Regno
2022-02-17 16:08   ` Mathieu Poirier
2022-02-17 16:08     ` Mathieu Poirier
2022-02-17 16:08     ` Mathieu Poirier
2022-02-17 19:03 ` Mathieu Poirier
2022-02-17 19:03   ` Mathieu Poirier
2022-02-17 19:03   ` Mathieu Poirier
2022-02-18  9:16   ` AngeloGioacchino Del Regno
2022-02-18  9:16     ` AngeloGioacchino Del Regno
2022-02-18  9:16     ` AngeloGioacchino Del Regno
2022-02-18 18:01     ` Mathieu Poirier
2022-02-18 18:01       ` Mathieu Poirier
2022-02-18 18:01       ` Mathieu Poirier
2022-03-29 10:55       ` AngeloGioacchino Del Regno
2022-03-29 10:55         ` AngeloGioacchino Del Regno
2022-03-29 10:55         ` AngeloGioacchino Del Regno
2022-03-29 15:08         ` Mathieu Poirier
2022-03-29 15:08           ` Mathieu Poirier
2022-03-29 15:08           ` Mathieu Poirier
2022-04-28 17:31 ` Mathieu Poirier
2022-04-28 17:31   ` Mathieu Poirier
2022-04-28 17:31   ` Mathieu Poirier
2022-04-29 13:37   ` AngeloGioacchino Del Regno
2022-04-29 13:37     ` AngeloGioacchino Del Regno
2022-04-29 13:37     ` AngeloGioacchino Del Regno

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.