* [PATCH 0/7] slimbus: qcom-ngd-ctrl: Fix some race conditions and deadlocks
@ 2026-03-10 4:09 Bjorn Andersson
2026-03-10 4:09 ` [PATCH 1/7] slimbus: qcom-ngd-ctrl: Fix up platform_driver registration Bjorn Andersson
` (7 more replies)
0 siblings, 8 replies; 26+ messages in thread
From: Bjorn Andersson @ 2026-03-10 4:09 UTC (permalink / raw)
To: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski
Cc: linux-arm-msm, linux-sound, linux-kernel, Bjorn Andersson, stable
When the qcom-ngd-ctrl driver is probed after the ADSP remoteproc, the
SSR notifier will fire immediately, which results in
qcom_slim_ngd_ssr_pdr_notify() attempting to schedule_work() on an
unitialized work_struct.
The concrete result of this is that my db845c/RB3 now fails to boot 100%
of the time.
In reviewing the problematic code, a few other problems where
discovered, such that platform_driver_unregister() is used to unregister
the child device.
Lastly, with the db845c booting, it was determined that attempting to
stop the ADSP remoteproc causes the slimbus driver to deadlock.
Note that while this solves the problems described above, and unblock
boot as well as restart of the remoteproc, this stack needs more love.
Upon tearing down the slimbus controller (when the ADSP goes down), the
slimbus devices attempts to access their slimbus devices - which is
prevented by the controller being runtime suspended. This results in a
wall of errors in the log, about failing transactions.
Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
---
Bjorn Andersson (7):
slimbus: qcom-ngd-ctrl: Fix up platform_driver registration
slimbus: qcom-ngd-ctrl: Fix probe error path ordering
slimbus: qcom-ngd-ctrl: Correct PDR and SSR cleanup ownership
slimbus: qcom-ngd-ctrl: Register callbacks after creating the ngd
slimbus: qcom-ngd-ctrl: Initialize controller resources in controller
slimbus: qcom-ngd-ctrl: Balance pm_runtime enablement for NGD
slimbus: qcom-ngd-ctrl: Avoid ABBA on tx_lock/ctrl->lock
drivers/slimbus/qcom-ngd-ctrl.c | 127 +++++++++++++++++++++++++---------------
1 file changed, 80 insertions(+), 47 deletions(-)
---
base-commit: a0ae2a256046c0c5d3778d1a194ff2e171f16e5f
change-id: 20260211-slim-ngd-dev-74166f29f035
Best regards,
--
Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 1/7] slimbus: qcom-ngd-ctrl: Fix up platform_driver registration
2026-03-10 4:09 [PATCH 0/7] slimbus: qcom-ngd-ctrl: Fix some race conditions and deadlocks Bjorn Andersson
@ 2026-03-10 4:09 ` Bjorn Andersson
2026-03-10 7:33 ` Mukesh Ojha
2026-03-11 1:30 ` Dmitry Baryshkov
2026-03-10 4:09 ` [PATCH 2/7] slimbus: qcom-ngd-ctrl: Fix probe error path ordering Bjorn Andersson
` (6 subsequent siblings)
7 siblings, 2 replies; 26+ messages in thread
From: Bjorn Andersson @ 2026-03-10 4:09 UTC (permalink / raw)
To: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski
Cc: linux-arm-msm, linux-sound, linux-kernel, Bjorn Andersson, stable
Device drivers should not invoke platform_driver_register()/unregister()
in their probe and remove paths. They should further not rely on
platform_driver_unregister() as their only means of "deleting" their
child devices.
Introduce a helper to unregister the child device and move the
platform_driver_register()/unregister() to module_init()/exit().
Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
Cc: stable@vger.kernel.org
Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
---
drivers/slimbus/qcom-ngd-ctrl.c | 36 +++++++++++++++++++++++++++++++++---
1 file changed, 33 insertions(+), 3 deletions(-)
diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
index 9aa7218b4e8d2b350835626839371ed6e19860e2..c69656a0ef1766d5a9df40bdf37bae8f64789fab 100644
--- a/drivers/slimbus/qcom-ngd-ctrl.c
+++ b/drivers/slimbus/qcom-ngd-ctrl.c
@@ -1562,6 +1562,13 @@ static int of_qcom_slim_ngd_register(struct device *parent,
return -ENODEV;
}
+static void qcom_slim_ngd_unregister(struct qcom_slim_ngd_ctrl *ctrl)
+{
+ struct qcom_slim_ngd *ngd = ctrl->ngd;
+
+ platform_device_del(ngd->pdev);
+}
+
static int qcom_slim_ngd_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
@@ -1664,7 +1671,6 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
goto err_pdr_lookup;
}
- platform_driver_register(&qcom_slim_ngd_driver);
return of_qcom_slim_ngd_register(dev, ctrl);
err_pdr_alloc:
@@ -1678,7 +1684,9 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
static void qcom_slim_ngd_ctrl_remove(struct platform_device *pdev)
{
- platform_driver_unregister(&qcom_slim_ngd_driver);
+ struct qcom_slim_ngd_ctrl *ctrl = platform_get_drvdata(pdev);
+
+ qcom_slim_ngd_unregister(ctrl);
}
static void qcom_slim_ngd_remove(struct platform_device *pdev)
@@ -1754,6 +1762,28 @@ static struct platform_driver qcom_slim_ngd_driver = {
},
};
-module_platform_driver(qcom_slim_ngd_ctrl_driver);
+static int qcom_slim_ngd_init(void)
+{
+ int ret;
+
+ ret = platform_driver_register(&qcom_slim_ngd_ctrl_driver);
+ if (ret)
+ return ret;
+
+ ret = platform_driver_register(&qcom_slim_ngd_driver);
+ if (ret)
+ platform_driver_unregister(&qcom_slim_ngd_ctrl_driver);
+
+ return ret;
+}
+
+static void qcom_slim_ngd_exit(void)
+{
+ platform_driver_unregister(&qcom_slim_ngd_driver);
+ platform_driver_unregister(&qcom_slim_ngd_ctrl_driver);
+}
+
+module_init(qcom_slim_ngd_init);
+module_exit(qcom_slim_ngd_exit);
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("Qualcomm SLIMBus NGD controller");
--
2.51.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 2/7] slimbus: qcom-ngd-ctrl: Fix probe error path ordering
2026-03-10 4:09 [PATCH 0/7] slimbus: qcom-ngd-ctrl: Fix some race conditions and deadlocks Bjorn Andersson
2026-03-10 4:09 ` [PATCH 1/7] slimbus: qcom-ngd-ctrl: Fix up platform_driver registration Bjorn Andersson
@ 2026-03-10 4:09 ` Bjorn Andersson
2026-03-10 7:36 ` Mukesh Ojha
2026-03-11 1:30 ` Dmitry Baryshkov
2026-03-10 4:09 ` [PATCH 3/7] slimbus: qcom-ngd-ctrl: Correct PDR and SSR cleanup ownership Bjorn Andersson
` (5 subsequent siblings)
7 siblings, 2 replies; 26+ messages in thread
From: Bjorn Andersson @ 2026-03-10 4:09 UTC (permalink / raw)
To: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski
Cc: linux-arm-msm, linux-sound, linux-kernel, Bjorn Andersson, stable
qcom_slim_ngd_ctrl_probe() first registers the SSR callback then
allocates the PDR context, as such the error path needs to come in
opposite order to allow us to unroll each step.
Fixes: 16f14551d0df ("slimbus: qcom-ngd: cleanup in probe error path")
Cc: stable@vger.kernel.org
Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
---
drivers/slimbus/qcom-ngd-ctrl.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
index c69656a0ef1766d5a9df40bdf37bae8f64789fab..b34e727bab086c95dc7e760bf1141baac9ccf6a7 100644
--- a/drivers/slimbus/qcom-ngd-ctrl.c
+++ b/drivers/slimbus/qcom-ngd-ctrl.c
@@ -1662,22 +1662,21 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
if (IS_ERR(ctrl->pdr)) {
ret = dev_err_probe(dev, PTR_ERR(ctrl->pdr),
"Failed to init PDR handle\n");
- goto err_pdr_alloc;
+ goto err_unregister_ssr;
}
pds = pdr_add_lookup(ctrl->pdr, "avs/audio", "msm/adsp/audio_pd");
if (IS_ERR(pds) && PTR_ERR(pds) != -EALREADY) {
ret = dev_err_probe(dev, PTR_ERR(pds), "pdr add lookup failed\n");
- goto err_pdr_lookup;
+ goto err_pdr_release;
}
return of_qcom_slim_ngd_register(dev, ctrl);
-err_pdr_alloc:
- qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb);
-
-err_pdr_lookup:
+err_pdr_release:
pdr_handle_release(ctrl->pdr);
+err_unregister_ssr:
+ qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb);
return ret;
}
--
2.51.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 3/7] slimbus: qcom-ngd-ctrl: Correct PDR and SSR cleanup ownership
2026-03-10 4:09 [PATCH 0/7] slimbus: qcom-ngd-ctrl: Fix some race conditions and deadlocks Bjorn Andersson
2026-03-10 4:09 ` [PATCH 1/7] slimbus: qcom-ngd-ctrl: Fix up platform_driver registration Bjorn Andersson
2026-03-10 4:09 ` [PATCH 2/7] slimbus: qcom-ngd-ctrl: Fix probe error path ordering Bjorn Andersson
@ 2026-03-10 4:09 ` Bjorn Andersson
2026-03-10 7:39 ` Mukesh Ojha
2026-03-11 1:32 ` Dmitry Baryshkov
2026-03-10 4:09 ` [PATCH 4/7] slimbus: qcom-ngd-ctrl: Register callbacks after creating the ngd Bjorn Andersson
` (4 subsequent siblings)
7 siblings, 2 replies; 26+ messages in thread
From: Bjorn Andersson @ 2026-03-10 4:09 UTC (permalink / raw)
To: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski
Cc: linux-arm-msm, linux-sound, linux-kernel, Bjorn Andersson, stable
PDR and SSR callbacks are registred from the controller probe function,
but currently released from the child device's remove function.
In the next commit the controller probe function will be modified such
that the error path will unregister the child device, resulting in a
double free of these resources.
Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
Cc: stable@vger.kernel.org
Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
---
drivers/slimbus/qcom-ngd-ctrl.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
index b34e727bab086c95dc7e760bf1141baac9ccf6a7..09ce3299e15c25b1b9cf6b1559850adf4aa20737 100644
--- a/drivers/slimbus/qcom-ngd-ctrl.c
+++ b/drivers/slimbus/qcom-ngd-ctrl.c
@@ -1685,6 +1685,9 @@ static void qcom_slim_ngd_ctrl_remove(struct platform_device *pdev)
{
struct qcom_slim_ngd_ctrl *ctrl = platform_get_drvdata(pdev);
+ pdr_handle_release(ctrl->pdr);
+ qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb);
+
qcom_slim_ngd_unregister(ctrl);
}
@@ -1693,8 +1696,6 @@ static void qcom_slim_ngd_remove(struct platform_device *pdev)
struct qcom_slim_ngd_ctrl *ctrl = platform_get_drvdata(pdev);
pm_runtime_disable(&pdev->dev);
- pdr_handle_release(ctrl->pdr);
- qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb);
qcom_slim_ngd_enable(ctrl, false);
qcom_slim_ngd_exit_dma(ctrl);
qcom_slim_ngd_qmi_svc_event_deinit(&ctrl->qmi);
--
2.51.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 4/7] slimbus: qcom-ngd-ctrl: Register callbacks after creating the ngd
2026-03-10 4:09 [PATCH 0/7] slimbus: qcom-ngd-ctrl: Fix some race conditions and deadlocks Bjorn Andersson
` (2 preceding siblings ...)
2026-03-10 4:09 ` [PATCH 3/7] slimbus: qcom-ngd-ctrl: Correct PDR and SSR cleanup ownership Bjorn Andersson
@ 2026-03-10 4:09 ` Bjorn Andersson
2026-03-10 7:49 ` Mukesh Ojha
2026-03-11 1:45 ` Dmitry Baryshkov
2026-03-10 4:09 ` [PATCH 5/7] slimbus: qcom-ngd-ctrl: Initialize controller resources in controller Bjorn Andersson
` (3 subsequent siblings)
7 siblings, 2 replies; 26+ messages in thread
From: Bjorn Andersson @ 2026-03-10 4:09 UTC (permalink / raw)
To: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski
Cc: linux-arm-msm, linux-sound, linux-kernel, Bjorn Andersson, stable
When the remoteproc starts in parallel with the NGD driver being probed,
or the remoteproc is already up when the PDR lookup is being registered,
or in the theoretical event that we get an interrupt from the hardware,
these callbacks will operate on uninitialized data. This result in
issues to boot the affected boards.
One such example can be seen in the following fault, where
qcom_slim_ngd_ssr_pdr_notify() schedules work on the NULL ngd_up_work.
[ 21.858578] ------------[ cut here ]------------
[ 21.858745] WARNING: kernel/workqueue.c:2338 at __queue_work+0x5e0/0x790, CPU#2: kworker/2:2/116
...
[ 21.859251] Call trace:
[ 21.859255] __queue_work+0x5e0/0x790 (P)
[ 21.859265] queue_work_on+0x6c/0xf0
[ 21.859273] qcom_slim_ngd_ssr_pdr_notify+0x110/0x150 [slim_qcom_ngd_ctrl]
[ 21.859304] qcom_slim_ngd_ssr_notify+0x24/0x40 [slim_qcom_ngd_ctrl]
[ 21.859318] notifier_call_chain+0xa4/0x230
[ 21.859329] srcu_notifier_call_chain+0x64/0xb8
[ 21.859338] ssr_notify_start+0x40/0x78 [qcom_common]
[ 21.859355] rproc_start+0x130/0x230
[ 21.859367] rproc_boot+0x3d4/0x518
...
Move the three registrations of interrupts, SSR and PDR until after the
NGD device has been registered.
This could be further refined by moving initialization to the control
driver probe and by removing the platform driver model from the picture.
Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
Cc: stable@vger.kernel.org
Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
---
drivers/slimbus/qcom-ngd-ctrl.c | 52 ++++++++++++++++++++++++-----------------
1 file changed, 30 insertions(+), 22 deletions(-)
diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
index 09ce3299e15c25b1b9cf6b1559850adf4aa20737..76944c515291a62fb9cb192bec5cd5c2caa542f4 100644
--- a/drivers/slimbus/qcom-ngd-ctrl.c
+++ b/drivers/slimbus/qcom-ngd-ctrl.c
@@ -1613,6 +1613,7 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
struct qcom_slim_ngd_ctrl *ctrl;
int ret;
struct pdr_service *pds;
+ int irq;
ctrl = devm_kzalloc(dev, sizeof(*ctrl), GFP_KERNEL);
if (!ctrl)
@@ -1624,19 +1625,9 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
if (IS_ERR(ctrl->base))
return PTR_ERR(ctrl->base);
- ret = platform_get_irq(pdev, 0);
- if (ret < 0)
- return ret;
-
- ret = devm_request_irq(dev, ret, qcom_slim_ngd_interrupt,
- IRQF_TRIGGER_HIGH, "slim-ngd", ctrl);
- if (ret)
- return dev_err_probe(&pdev->dev, ret, "request IRQ failed\n");
-
- ctrl->nb.notifier_call = qcom_slim_ngd_ssr_notify;
- ctrl->notifier = qcom_register_ssr_notifier("lpass", &ctrl->nb);
- if (IS_ERR(ctrl->notifier))
- return PTR_ERR(ctrl->notifier);
+ irq = platform_get_irq(pdev, 0);
+ if (irq < 0)
+ return irq;
ctrl->dev = dev;
ctrl->framer.rootfreq = SLIM_ROOT_FREQ >> 3;
@@ -1659,24 +1650,41 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
init_completion(&ctrl->qmi_up);
ctrl->pdr = pdr_handle_alloc(slim_pd_status, ctrl);
- if (IS_ERR(ctrl->pdr)) {
- ret = dev_err_probe(dev, PTR_ERR(ctrl->pdr),
- "Failed to init PDR handle\n");
- goto err_unregister_ssr;
- }
+ if (IS_ERR(ctrl->pdr))
+ return dev_err_probe(dev, PTR_ERR(ctrl->pdr), "Failed to init PDR handle\n");
+
+ ret = of_qcom_slim_ngd_register(dev, ctrl);
+ if (ret)
+ goto err_pdr_release;
pds = pdr_add_lookup(ctrl->pdr, "avs/audio", "msm/adsp/audio_pd");
if (IS_ERR(pds) && PTR_ERR(pds) != -EALREADY) {
ret = dev_err_probe(dev, PTR_ERR(pds), "pdr add lookup failed\n");
- goto err_pdr_release;
+ goto err_unregister_ngd;
}
- return of_qcom_slim_ngd_register(dev, ctrl);
+ ctrl->nb.notifier_call = qcom_slim_ngd_ssr_notify;
+ ctrl->notifier = qcom_register_ssr_notifier("lpass", &ctrl->nb);
+ if (IS_ERR(ctrl->notifier)) {
+ ret = PTR_ERR(ctrl->notifier);
+ goto err_unregister_ngd;
+ }
+
+ ret = devm_request_irq(dev, irq, qcom_slim_ngd_interrupt,
+ IRQF_TRIGGER_HIGH, "slim-ngd", ctrl);
+ if (ret) {
+ ret = dev_err_probe(&pdev->dev, ret, "request IRQ failed\n");
+ goto err_unregister_ssr;
+ }
+
+ return 0;
-err_pdr_release:
- pdr_handle_release(ctrl->pdr);
err_unregister_ssr:
qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb);
+err_unregister_ngd:
+ qcom_slim_ngd_unregister(ctrl);
+err_pdr_release:
+ pdr_handle_release(ctrl->pdr);
return ret;
}
--
2.51.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 5/7] slimbus: qcom-ngd-ctrl: Initialize controller resources in controller
2026-03-10 4:09 [PATCH 0/7] slimbus: qcom-ngd-ctrl: Fix some race conditions and deadlocks Bjorn Andersson
` (3 preceding siblings ...)
2026-03-10 4:09 ` [PATCH 4/7] slimbus: qcom-ngd-ctrl: Register callbacks after creating the ngd Bjorn Andersson
@ 2026-03-10 4:09 ` Bjorn Andersson
2026-03-10 7:54 ` Mukesh Ojha
2026-03-11 1:34 ` Dmitry Baryshkov
2026-03-10 4:09 ` [PATCH 6/7] slimbus: qcom-ngd-ctrl: Balance pm_runtime enablement for NGD Bjorn Andersson
` (2 subsequent siblings)
7 siblings, 2 replies; 26+ messages in thread
From: Bjorn Andersson @ 2026-03-10 4:09 UTC (permalink / raw)
To: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski
Cc: linux-arm-msm, linux-sound, linux-kernel, Bjorn Andersson, stable
The work structs and work queue are controller resources, create and
destroy them in the controller context. Creating them as part of the
child device's probe path seems to be okay now that the controller's
probe has been updated, but if for some reason the child does not probe
successfully a SSR or PDR notification will schedule_work() on an
uninitialized "ngd_up_work".
Move the initialization of these controller resources to the controller
probe function to avoid any issues, and to clarify the ownership.
Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
Cc: stable@vger.kernel.org
Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
---
drivers/slimbus/qcom-ngd-ctrl.c | 38 ++++++++++++++++----------------------
1 file changed, 16 insertions(+), 22 deletions(-)
diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
index 76944c515291a62fb9cb192bec5cd5c2caa542f4..d932f7fd6170773890f561e3af444ac2c5730338 100644
--- a/drivers/slimbus/qcom-ngd-ctrl.c
+++ b/drivers/slimbus/qcom-ngd-ctrl.c
@@ -1584,25 +1584,8 @@ static int qcom_slim_ngd_probe(struct platform_device *pdev)
pm_runtime_enable(dev);
pm_runtime_get_noresume(dev);
ret = qcom_slim_ngd_qmi_svc_event_init(ctrl);
- if (ret) {
+ if (ret)
dev_err(&pdev->dev, "QMI service registration failed:%d", ret);
- return ret;
- }
-
- INIT_WORK(&ctrl->m_work, qcom_slim_ngd_master_worker);
- INIT_WORK(&ctrl->ngd_up_work, qcom_slim_ngd_up_worker);
- ctrl->mwq = create_singlethread_workqueue("ngd_master");
- if (!ctrl->mwq) {
- dev_err(&pdev->dev, "Failed to start master worker\n");
- ret = -ENOMEM;
- goto wq_err;
- }
-
- return 0;
-wq_err:
- qcom_slim_ngd_qmi_svc_event_deinit(&ctrl->qmi);
- if (ctrl->mwq)
- destroy_workqueue(ctrl->mwq);
return ret;
}
@@ -1649,9 +1632,18 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
init_completion(&ctrl->qmi.qmi_comp);
init_completion(&ctrl->qmi_up);
+ INIT_WORK(&ctrl->m_work, qcom_slim_ngd_master_worker);
+ INIT_WORK(&ctrl->ngd_up_work, qcom_slim_ngd_up_worker);
+
+ ctrl->mwq = create_singlethread_workqueue("ngd_master");
+ if (!ctrl->mwq)
+ return dev_err_probe(dev, -ENOMEM, "Failed to start master worker\n");
+
ctrl->pdr = pdr_handle_alloc(slim_pd_status, ctrl);
- if (IS_ERR(ctrl->pdr))
- return dev_err_probe(dev, PTR_ERR(ctrl->pdr), "Failed to init PDR handle\n");
+ if (IS_ERR(ctrl->pdr)) {
+ ret = dev_err_probe(dev, PTR_ERR(ctrl->pdr), "Failed to init PDR handle\n");
+ goto err_destroy_mwq;
+ }
ret = of_qcom_slim_ngd_register(dev, ctrl);
if (ret)
@@ -1685,6 +1677,8 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
qcom_slim_ngd_unregister(ctrl);
err_pdr_release:
pdr_handle_release(ctrl->pdr);
+err_destroy_mwq:
+ destroy_workqueue(ctrl->mwq);
return ret;
}
@@ -1697,6 +1691,8 @@ static void qcom_slim_ngd_ctrl_remove(struct platform_device *pdev)
qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb);
qcom_slim_ngd_unregister(ctrl);
+
+ destroy_workqueue(ctrl->mwq);
}
static void qcom_slim_ngd_remove(struct platform_device *pdev)
@@ -1707,8 +1703,6 @@ static void qcom_slim_ngd_remove(struct platform_device *pdev)
qcom_slim_ngd_enable(ctrl, false);
qcom_slim_ngd_exit_dma(ctrl);
qcom_slim_ngd_qmi_svc_event_deinit(&ctrl->qmi);
- if (ctrl->mwq)
- destroy_workqueue(ctrl->mwq);
kfree(ctrl->ngd);
ctrl->ngd = NULL;
--
2.51.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 6/7] slimbus: qcom-ngd-ctrl: Balance pm_runtime enablement for NGD
2026-03-10 4:09 [PATCH 0/7] slimbus: qcom-ngd-ctrl: Fix some race conditions and deadlocks Bjorn Andersson
` (4 preceding siblings ...)
2026-03-10 4:09 ` [PATCH 5/7] slimbus: qcom-ngd-ctrl: Initialize controller resources in controller Bjorn Andersson
@ 2026-03-10 4:09 ` Bjorn Andersson
2026-03-10 8:00 ` Mukesh Ojha
2026-03-11 1:34 ` Dmitry Baryshkov
2026-03-10 4:09 ` [PATCH 7/7] slimbus: qcom-ngd-ctrl: Avoid ABBA on tx_lock/ctrl->lock Bjorn Andersson
2026-03-11 1:40 ` [PATCH 0/7] slimbus: qcom-ngd-ctrl: Fix some race conditions and deadlocks Dmitry Baryshkov
7 siblings, 2 replies; 26+ messages in thread
From: Bjorn Andersson @ 2026-03-10 4:09 UTC (permalink / raw)
To: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski
Cc: linux-arm-msm, linux-sound, linux-kernel, Bjorn Andersson, stable
The pm_runtime_enable() and pm_runtime_use_autosuspend() calls are
supposed to be balanced on exit, add these calls.
Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
Cc: stable@vger.kernel.org
Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
---
drivers/slimbus/qcom-ngd-ctrl.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
index d932f7fd6170773890f561e3af444ac2c5730338..54a4c6ee1e71fe55794f09575979826d9aa5be9f 100644
--- a/drivers/slimbus/qcom-ngd-ctrl.c
+++ b/drivers/slimbus/qcom-ngd-ctrl.c
@@ -1584,8 +1584,11 @@ static int qcom_slim_ngd_probe(struct platform_device *pdev)
pm_runtime_enable(dev);
pm_runtime_get_noresume(dev);
ret = qcom_slim_ngd_qmi_svc_event_init(ctrl);
- if (ret)
+ if (ret) {
dev_err(&pdev->dev, "QMI service registration failed:%d", ret);
+ pm_runtime_dont_use_autosuspend(dev);
+ pm_runtime_disable(dev);
+ }
return ret;
}
@@ -1699,6 +1702,7 @@ static void qcom_slim_ngd_remove(struct platform_device *pdev)
{
struct qcom_slim_ngd_ctrl *ctrl = platform_get_drvdata(pdev);
+ pm_runtime_dont_use_autosuspend(&pdev->dev);
pm_runtime_disable(&pdev->dev);
qcom_slim_ngd_enable(ctrl, false);
qcom_slim_ngd_exit_dma(ctrl);
--
2.51.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 7/7] slimbus: qcom-ngd-ctrl: Avoid ABBA on tx_lock/ctrl->lock
2026-03-10 4:09 [PATCH 0/7] slimbus: qcom-ngd-ctrl: Fix some race conditions and deadlocks Bjorn Andersson
` (5 preceding siblings ...)
2026-03-10 4:09 ` [PATCH 6/7] slimbus: qcom-ngd-ctrl: Balance pm_runtime enablement for NGD Bjorn Andersson
@ 2026-03-10 4:09 ` Bjorn Andersson
2026-03-10 10:03 ` Mukesh Ojha
2026-03-11 1:37 ` Dmitry Baryshkov
2026-03-11 1:40 ` [PATCH 0/7] slimbus: qcom-ngd-ctrl: Fix some race conditions and deadlocks Dmitry Baryshkov
7 siblings, 2 replies; 26+ messages in thread
From: Bjorn Andersson @ 2026-03-10 4:09 UTC (permalink / raw)
To: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski
Cc: linux-arm-msm, linux-sound, linux-kernel, Bjorn Andersson, stable
During the SSR/PDR down notification the tx_lock is taken with the
intent to provide synchronization with active DMA transfers.
But during this period qcom_slim_ngd_down() is invoked, which ends up in
slim_report_absent(), which takes the slim_controller lock. In multiple
other codepaths these two locks are taken in the opposite order (i.e.
slim_controller then tx_lock).
The result is a lockdep splat, and a possible deadlock:
rprocctl/449 is trying to acquire lock:
ffff00009793e620 (&ctrl->lock){+.+.}-{4:4}, at: slim_report_absent (drivers/slimbus/core.c:322) slimbus
but task is already holding lock:
ffff00009793fb50 (&ctrl->tx_lock){+.+.}-{4:4}, at: qcom_slim_ngd_ssr_pdr_notify (drivers/slimbus/qcom-ngd-ctrl.c:1475) slim_qcom_ngd_ctrl
which lock already depends on the new lock.
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&ctrl->tx_lock);
lock(&ctrl->lock);
lock(&ctrl->tx_lock);
lock(&ctrl->lock);
The assumption is that the comment refers to the desire to not call
qcom_slim_ngd_exit_dma() while we have an ongoing DMA TX transaction.
But any such transaction is initiated and completed within a single
qcom_slim_ngd_xfer_msg().
Prior to calling qcom_slim_ngd_exit_dma() the slim_controller is torn
down, all child devices are notified that the slimbus is gone and the
child devices are removed.
Stop taking the tx_lock in qcom_slim_ngd_ssr_pdr_notify() to avoid the
deadlock.
Fixes: a899d324863a ("slimbus: qcom-ngd-ctrl: add Sub System Restart support")
Cc: stable@vger.kernel.org
Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
---
drivers/slimbus/qcom-ngd-ctrl.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
index 54a4c6ee1e71fe55794f09575979826d9aa5be9f..75d70de0909a8d17e2410d30f7811f32d5eebea3 100644
--- a/drivers/slimbus/qcom-ngd-ctrl.c
+++ b/drivers/slimbus/qcom-ngd-ctrl.c
@@ -1471,15 +1471,12 @@ static int qcom_slim_ngd_ssr_pdr_notify(struct qcom_slim_ngd_ctrl *ctrl,
switch (action) {
case QCOM_SSR_BEFORE_SHUTDOWN:
case SERVREG_SERVICE_STATE_DOWN:
- /* Make sure the last dma xfer is finished */
- mutex_lock(&ctrl->tx_lock);
if (ctrl->state != QCOM_SLIM_NGD_CTRL_DOWN) {
pm_runtime_get_noresume(ctrl->ctrl.dev);
ctrl->state = QCOM_SLIM_NGD_CTRL_DOWN;
qcom_slim_ngd_down(ctrl);
qcom_slim_ngd_exit_dma(ctrl);
}
- mutex_unlock(&ctrl->tx_lock);
break;
case QCOM_SSR_AFTER_POWERUP:
case SERVREG_SERVICE_STATE_UP:
--
2.51.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* Re: [PATCH 1/7] slimbus: qcom-ngd-ctrl: Fix up platform_driver registration
2026-03-10 4:09 ` [PATCH 1/7] slimbus: qcom-ngd-ctrl: Fix up platform_driver registration Bjorn Andersson
@ 2026-03-10 7:33 ` Mukesh Ojha
2026-03-11 1:30 ` Dmitry Baryshkov
1 sibling, 0 replies; 26+ messages in thread
From: Mukesh Ojha @ 2026-03-10 7:33 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski, linux-arm-msm, linux-sound, linux-kernel,
stable
On Mon, Mar 09, 2026 at 11:09:02PM -0500, Bjorn Andersson wrote:
> Device drivers should not invoke platform_driver_register()/unregister()
> in their probe and remove paths. They should further not rely on
> platform_driver_unregister() as their only means of "deleting" their
> child devices.
>
> Introduce a helper to unregister the child device and move the
> platform_driver_register()/unregister() to module_init()/exit().
>
> Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
Reviewed-by: Mukesh Ojha <mukesh.ojha@oss.qualcomm.com>
> ---
> drivers/slimbus/qcom-ngd-ctrl.c | 36 +++++++++++++++++++++++++++++++++---
> 1 file changed, 33 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
> index 9aa7218b4e8d2b350835626839371ed6e19860e2..c69656a0ef1766d5a9df40bdf37bae8f64789fab 100644
> --- a/drivers/slimbus/qcom-ngd-ctrl.c
> +++ b/drivers/slimbus/qcom-ngd-ctrl.c
> @@ -1562,6 +1562,13 @@ static int of_qcom_slim_ngd_register(struct device *parent,
> return -ENODEV;
> }
>
> +static void qcom_slim_ngd_unregister(struct qcom_slim_ngd_ctrl *ctrl)
> +{
> + struct qcom_slim_ngd *ngd = ctrl->ngd;
> +
> + platform_device_del(ngd->pdev);
First, it surprised me why only once, then I saw there is return 0 in
for_each_available_child_of_node_scoped() loop..
> +}
> +
> static int qcom_slim_ngd_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> @@ -1664,7 +1671,6 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
> goto err_pdr_lookup;
> }
>
> - platform_driver_register(&qcom_slim_ngd_driver);
> return of_qcom_slim_ngd_register(dev, ctrl);
>
> err_pdr_alloc:
> @@ -1678,7 +1684,9 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
>
> static void qcom_slim_ngd_ctrl_remove(struct platform_device *pdev)
> {
> - platform_driver_unregister(&qcom_slim_ngd_driver);
> + struct qcom_slim_ngd_ctrl *ctrl = platform_get_drvdata(pdev);
> +
> + qcom_slim_ngd_unregister(ctrl);
> }
>
> static void qcom_slim_ngd_remove(struct platform_device *pdev)
> @@ -1754,6 +1762,28 @@ static struct platform_driver qcom_slim_ngd_driver = {
> },
> };
>
> -module_platform_driver(qcom_slim_ngd_ctrl_driver);
> +static int qcom_slim_ngd_init(void)
> +{
> + int ret;
> +
> + ret = platform_driver_register(&qcom_slim_ngd_ctrl_driver);
> + if (ret)
> + return ret;
> +
> + ret = platform_driver_register(&qcom_slim_ngd_driver);
> + if (ret)
> + platform_driver_unregister(&qcom_slim_ngd_ctrl_driver);
> +
> + return ret;
> +}
> +
> +static void qcom_slim_ngd_exit(void)
> +{
> + platform_driver_unregister(&qcom_slim_ngd_driver);
> + platform_driver_unregister(&qcom_slim_ngd_ctrl_driver);
> +}
> +
> +module_init(qcom_slim_ngd_init);
> +module_exit(qcom_slim_ngd_exit);
> MODULE_LICENSE("GPL v2");
> MODULE_DESCRIPTION("Qualcomm SLIMBus NGD controller");
>
> --
> 2.51.0
>
--
-Mukesh Ojha
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 2/7] slimbus: qcom-ngd-ctrl: Fix probe error path ordering
2026-03-10 4:09 ` [PATCH 2/7] slimbus: qcom-ngd-ctrl: Fix probe error path ordering Bjorn Andersson
@ 2026-03-10 7:36 ` Mukesh Ojha
2026-03-11 1:30 ` Dmitry Baryshkov
1 sibling, 0 replies; 26+ messages in thread
From: Mukesh Ojha @ 2026-03-10 7:36 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski, linux-arm-msm, linux-sound, linux-kernel,
stable
On Mon, Mar 09, 2026 at 11:09:03PM -0500, Bjorn Andersson wrote:
> qcom_slim_ngd_ctrl_probe() first registers the SSR callback then
> allocates the PDR context, as such the error path needs to come in
> opposite order to allow us to unroll each step.
>
> Fixes: 16f14551d0df ("slimbus: qcom-ngd: cleanup in probe error path")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
> ---
> drivers/slimbus/qcom-ngd-ctrl.c | 11 +++++------
> 1 file changed, 5 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
> index c69656a0ef1766d5a9df40bdf37bae8f64789fab..b34e727bab086c95dc7e760bf1141baac9ccf6a7 100644
> --- a/drivers/slimbus/qcom-ngd-ctrl.c
> +++ b/drivers/slimbus/qcom-ngd-ctrl.c
> @@ -1662,22 +1662,21 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
> if (IS_ERR(ctrl->pdr)) {
> ret = dev_err_probe(dev, PTR_ERR(ctrl->pdr),
> "Failed to init PDR handle\n");
> - goto err_pdr_alloc;
> + goto err_unregister_ssr;
> }
>
> pds = pdr_add_lookup(ctrl->pdr, "avs/audio", "msm/adsp/audio_pd");
> if (IS_ERR(pds) && PTR_ERR(pds) != -EALREADY) {
> ret = dev_err_probe(dev, PTR_ERR(pds), "pdr add lookup failed\n");
> - goto err_pdr_lookup;
> + goto err_pdr_release;
> }
>
> return of_qcom_slim_ngd_register(dev, ctrl);
>
> -err_pdr_alloc:
> - qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb);
> -
> -err_pdr_lookup:
> +err_pdr_release:
> pdr_handle_release(ctrl->pdr);
> +err_unregister_ssr:
> + qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb);
>
> return ret;
> }
Reviewed-by: Mukesh Ojha <mukesh.ojha@oss.qualcomm.com>
>
> --
> 2.51.0
>
--
-Mukesh Ojha
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/7] slimbus: qcom-ngd-ctrl: Correct PDR and SSR cleanup ownership
2026-03-10 4:09 ` [PATCH 3/7] slimbus: qcom-ngd-ctrl: Correct PDR and SSR cleanup ownership Bjorn Andersson
@ 2026-03-10 7:39 ` Mukesh Ojha
2026-03-24 2:36 ` Bjorn Andersson
2026-03-11 1:32 ` Dmitry Baryshkov
1 sibling, 1 reply; 26+ messages in thread
From: Mukesh Ojha @ 2026-03-10 7:39 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski, linux-arm-msm, linux-sound, linux-kernel,
stable
On Mon, Mar 09, 2026 at 11:09:04PM -0500, Bjorn Andersson wrote:
> PDR and SSR callbacks are registred from the controller probe function,
> but currently released from the child device's remove function.
>
> In the next commit the controller probe function will be modified such
> that the error path will unregister the child device, resulting in a
> double free of these resources.
Change is fine, Could this not be accommodated in the next commit?
>
> Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
Reviewed-by: Mukesh Ojha <mukesh.ojha@oss.qualcomm.com>
> ---
> drivers/slimbus/qcom-ngd-ctrl.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
> index b34e727bab086c95dc7e760bf1141baac9ccf6a7..09ce3299e15c25b1b9cf6b1559850adf4aa20737 100644
> --- a/drivers/slimbus/qcom-ngd-ctrl.c
> +++ b/drivers/slimbus/qcom-ngd-ctrl.c
> @@ -1685,6 +1685,9 @@ static void qcom_slim_ngd_ctrl_remove(struct platform_device *pdev)
> {
> struct qcom_slim_ngd_ctrl *ctrl = platform_get_drvdata(pdev);
>
> + pdr_handle_release(ctrl->pdr);
> + qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb);
> +
> qcom_slim_ngd_unregister(ctrl);
> }
>
> @@ -1693,8 +1696,6 @@ static void qcom_slim_ngd_remove(struct platform_device *pdev)
> struct qcom_slim_ngd_ctrl *ctrl = platform_get_drvdata(pdev);
>
> pm_runtime_disable(&pdev->dev);
> - pdr_handle_release(ctrl->pdr);
> - qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb);
> qcom_slim_ngd_enable(ctrl, false);
> qcom_slim_ngd_exit_dma(ctrl);
> qcom_slim_ngd_qmi_svc_event_deinit(&ctrl->qmi);
>
> --
> 2.51.0
>
--
-Mukesh Ojha
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 4/7] slimbus: qcom-ngd-ctrl: Register callbacks after creating the ngd
2026-03-10 4:09 ` [PATCH 4/7] slimbus: qcom-ngd-ctrl: Register callbacks after creating the ngd Bjorn Andersson
@ 2026-03-10 7:49 ` Mukesh Ojha
2026-03-11 1:45 ` Dmitry Baryshkov
1 sibling, 0 replies; 26+ messages in thread
From: Mukesh Ojha @ 2026-03-10 7:49 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski, linux-arm-msm, linux-sound, linux-kernel,
stable
On Mon, Mar 09, 2026 at 11:09:05PM -0500, Bjorn Andersson wrote:
> When the remoteproc starts in parallel with the NGD driver being probed,
> or the remoteproc is already up when the PDR lookup is being registered,
> or in the theoretical event that we get an interrupt from the hardware,
> these callbacks will operate on uninitialized data. This result in
> issues to boot the affected boards.
>
> One such example can be seen in the following fault, where
> qcom_slim_ngd_ssr_pdr_notify() schedules work on the NULL ngd_up_work.
>
> [ 21.858578] ------------[ cut here ]------------
> [ 21.858745] WARNING: kernel/workqueue.c:2338 at __queue_work+0x5e0/0x790, CPU#2: kworker/2:2/116
> ...
> [ 21.859251] Call trace:
> [ 21.859255] __queue_work+0x5e0/0x790 (P)
> [ 21.859265] queue_work_on+0x6c/0xf0
> [ 21.859273] qcom_slim_ngd_ssr_pdr_notify+0x110/0x150 [slim_qcom_ngd_ctrl]
> [ 21.859304] qcom_slim_ngd_ssr_notify+0x24/0x40 [slim_qcom_ngd_ctrl]
> [ 21.859318] notifier_call_chain+0xa4/0x230
> [ 21.859329] srcu_notifier_call_chain+0x64/0xb8
> [ 21.859338] ssr_notify_start+0x40/0x78 [qcom_common]
> [ 21.859355] rproc_start+0x130/0x230
> [ 21.859367] rproc_boot+0x3d4/0x518
> ...
>
> Move the three registrations of interrupts, SSR and PDR until after the
> NGD device has been registered.
>
> This could be further refined by moving initialization to the control
> driver probe and by removing the platform driver model from the picture.
>
> Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
> ---
> drivers/slimbus/qcom-ngd-ctrl.c | 52 ++++++++++++++++++++++++-----------------
> 1 file changed, 30 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
> index 09ce3299e15c25b1b9cf6b1559850adf4aa20737..76944c515291a62fb9cb192bec5cd5c2caa542f4 100644
> --- a/drivers/slimbus/qcom-ngd-ctrl.c
> +++ b/drivers/slimbus/qcom-ngd-ctrl.c
> @@ -1613,6 +1613,7 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
> struct qcom_slim_ngd_ctrl *ctrl;
> int ret;
> struct pdr_service *pds;
> + int irq;
>
> ctrl = devm_kzalloc(dev, sizeof(*ctrl), GFP_KERNEL);
> if (!ctrl)
> @@ -1624,19 +1625,9 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
> if (IS_ERR(ctrl->base))
> return PTR_ERR(ctrl->base);
>
> - ret = platform_get_irq(pdev, 0);
> - if (ret < 0)
> - return ret;
> -
> - ret = devm_request_irq(dev, ret, qcom_slim_ngd_interrupt,
> - IRQF_TRIGGER_HIGH, "slim-ngd", ctrl);
> - if (ret)
> - return dev_err_probe(&pdev->dev, ret, "request IRQ failed\n");
> -
> - ctrl->nb.notifier_call = qcom_slim_ngd_ssr_notify;
> - ctrl->notifier = qcom_register_ssr_notifier("lpass", &ctrl->nb);
> - if (IS_ERR(ctrl->notifier))
> - return PTR_ERR(ctrl->notifier);
> + irq = platform_get_irq(pdev, 0);
> + if (irq < 0)
> + return irq;
>
> ctrl->dev = dev;
> ctrl->framer.rootfreq = SLIM_ROOT_FREQ >> 3;
> @@ -1659,24 +1650,41 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
> init_completion(&ctrl->qmi_up);
>
> ctrl->pdr = pdr_handle_alloc(slim_pd_status, ctrl);
> - if (IS_ERR(ctrl->pdr)) {
> - ret = dev_err_probe(dev, PTR_ERR(ctrl->pdr),
> - "Failed to init PDR handle\n");
> - goto err_unregister_ssr;
> - }
> + if (IS_ERR(ctrl->pdr))
> + return dev_err_probe(dev, PTR_ERR(ctrl->pdr), "Failed to init PDR handle\n");
> +
> + ret = of_qcom_slim_ngd_register(dev, ctrl);
> + if (ret)
> + goto err_pdr_release;
>
> pds = pdr_add_lookup(ctrl->pdr, "avs/audio", "msm/adsp/audio_pd");
> if (IS_ERR(pds) && PTR_ERR(pds) != -EALREADY) {
> ret = dev_err_probe(dev, PTR_ERR(pds), "pdr add lookup failed\n");
> - goto err_pdr_release;
> + goto err_unregister_ngd;
> }
>
> - return of_qcom_slim_ngd_register(dev, ctrl);
> + ctrl->nb.notifier_call = qcom_slim_ngd_ssr_notify;
> + ctrl->notifier = qcom_register_ssr_notifier("lpass", &ctrl->nb);
> + if (IS_ERR(ctrl->notifier)) {
> + ret = PTR_ERR(ctrl->notifier);
> + goto err_unregister_ngd;
> + }
> +
> + ret = devm_request_irq(dev, irq, qcom_slim_ngd_interrupt,
> + IRQF_TRIGGER_HIGH, "slim-ngd", ctrl);
> + if (ret) {
> + ret = dev_err_probe(&pdev->dev, ret, "request IRQ failed\n");
> + goto err_unregister_ssr;
> + }
> +
> + return 0;
>
> -err_pdr_release:
> - pdr_handle_release(ctrl->pdr);
> err_unregister_ssr:
> qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb);
> +err_unregister_ngd:
> + qcom_slim_ngd_unregister(ctrl);
> +err_pdr_release:
> + pdr_handle_release(ctrl->pdr);
>
> return ret;
> }
Reviewed-by: Mukesh Ojha <mukesh.ojha@oss.qualcomm.com>
>
> --
> 2.51.0
>
--
-Mukesh Ojha
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 5/7] slimbus: qcom-ngd-ctrl: Initialize controller resources in controller
2026-03-10 4:09 ` [PATCH 5/7] slimbus: qcom-ngd-ctrl: Initialize controller resources in controller Bjorn Andersson
@ 2026-03-10 7:54 ` Mukesh Ojha
2026-03-11 1:34 ` Dmitry Baryshkov
1 sibling, 0 replies; 26+ messages in thread
From: Mukesh Ojha @ 2026-03-10 7:54 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski, linux-arm-msm, linux-sound, linux-kernel,
stable
On Mon, Mar 09, 2026 at 11:09:06PM -0500, Bjorn Andersson wrote:
> The work structs and work queue are controller resources, create and
> destroy them in the controller context. Creating them as part of the
> child device's probe path seems to be okay now that the controller's
> probe has been updated, but if for some reason the child does not probe
> successfully a SSR or PDR notification will schedule_work() on an
> uninitialized "ngd_up_work".
>
> Move the initialization of these controller resources to the controller
> probe function to avoid any issues, and to clarify the ownership.
>
> Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
> ---
> drivers/slimbus/qcom-ngd-ctrl.c | 38 ++++++++++++++++----------------------
> 1 file changed, 16 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
> index 76944c515291a62fb9cb192bec5cd5c2caa542f4..d932f7fd6170773890f561e3af444ac2c5730338 100644
> --- a/drivers/slimbus/qcom-ngd-ctrl.c
> +++ b/drivers/slimbus/qcom-ngd-ctrl.c
> @@ -1584,25 +1584,8 @@ static int qcom_slim_ngd_probe(struct platform_device *pdev)
> pm_runtime_enable(dev);
> pm_runtime_get_noresume(dev);
> ret = qcom_slim_ngd_qmi_svc_event_init(ctrl);
> - if (ret) {
> + if (ret)
> dev_err(&pdev->dev, "QMI service registration failed:%d", ret);
> - return ret;
> - }
> -
> - INIT_WORK(&ctrl->m_work, qcom_slim_ngd_master_worker);
> - INIT_WORK(&ctrl->ngd_up_work, qcom_slim_ngd_up_worker);
> - ctrl->mwq = create_singlethread_workqueue("ngd_master");
> - if (!ctrl->mwq) {
> - dev_err(&pdev->dev, "Failed to start master worker\n");
> - ret = -ENOMEM;
> - goto wq_err;
> - }
> -
> - return 0;
> -wq_err:
> - qcom_slim_ngd_qmi_svc_event_deinit(&ctrl->qmi);
> - if (ctrl->mwq)
> - destroy_workqueue(ctrl->mwq);
>
> return ret;
> }
> @@ -1649,9 +1632,18 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
> init_completion(&ctrl->qmi.qmi_comp);
> init_completion(&ctrl->qmi_up);
>
> + INIT_WORK(&ctrl->m_work, qcom_slim_ngd_master_worker);
> + INIT_WORK(&ctrl->ngd_up_work, qcom_slim_ngd_up_worker);
> +
> + ctrl->mwq = create_singlethread_workqueue("ngd_master");
> + if (!ctrl->mwq)
> + return dev_err_probe(dev, -ENOMEM, "Failed to start master worker\n");
> +
> ctrl->pdr = pdr_handle_alloc(slim_pd_status, ctrl);
> - if (IS_ERR(ctrl->pdr))
> - return dev_err_probe(dev, PTR_ERR(ctrl->pdr), "Failed to init PDR handle\n");
> + if (IS_ERR(ctrl->pdr)) {
> + ret = dev_err_probe(dev, PTR_ERR(ctrl->pdr), "Failed to init PDR handle\n");
> + goto err_destroy_mwq;
> + }
>
> ret = of_qcom_slim_ngd_register(dev, ctrl);
> if (ret)
> @@ -1685,6 +1677,8 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
> qcom_slim_ngd_unregister(ctrl);
> err_pdr_release:
> pdr_handle_release(ctrl->pdr);
> +err_destroy_mwq:
> + destroy_workqueue(ctrl->mwq);
>
> return ret;
> }
> @@ -1697,6 +1691,8 @@ static void qcom_slim_ngd_ctrl_remove(struct platform_device *pdev)
> qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb);
>
> qcom_slim_ngd_unregister(ctrl);
> +
> + destroy_workqueue(ctrl->mwq);
> }
>
> static void qcom_slim_ngd_remove(struct platform_device *pdev)
> @@ -1707,8 +1703,6 @@ static void qcom_slim_ngd_remove(struct platform_device *pdev)
> qcom_slim_ngd_enable(ctrl, false);
> qcom_slim_ngd_exit_dma(ctrl);
> qcom_slim_ngd_qmi_svc_event_deinit(&ctrl->qmi);
> - if (ctrl->mwq)
> - destroy_workqueue(ctrl->mwq);
>
> kfree(ctrl->ngd);
> ctrl->ngd = NULL;
Reviewed-by: Mukesh Ojha <mukesh.ojha@oss.qualcomm.com>
>
> --
> 2.51.0
>
--
-Mukesh Ojha
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 6/7] slimbus: qcom-ngd-ctrl: Balance pm_runtime enablement for NGD
2026-03-10 4:09 ` [PATCH 6/7] slimbus: qcom-ngd-ctrl: Balance pm_runtime enablement for NGD Bjorn Andersson
@ 2026-03-10 8:00 ` Mukesh Ojha
2026-03-11 1:34 ` Dmitry Baryshkov
1 sibling, 0 replies; 26+ messages in thread
From: Mukesh Ojha @ 2026-03-10 8:00 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski, linux-arm-msm, linux-sound, linux-kernel,
stable
On Mon, Mar 09, 2026 at 11:09:07PM -0500, Bjorn Andersson wrote:
> The pm_runtime_enable() and pm_runtime_use_autosuspend() calls are
> supposed to be balanced on exit, add these calls.
>
> Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
> ---
> drivers/slimbus/qcom-ngd-ctrl.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
> index d932f7fd6170773890f561e3af444ac2c5730338..54a4c6ee1e71fe55794f09575979826d9aa5be9f 100644
> --- a/drivers/slimbus/qcom-ngd-ctrl.c
> +++ b/drivers/slimbus/qcom-ngd-ctrl.c
> @@ -1584,8 +1584,11 @@ static int qcom_slim_ngd_probe(struct platform_device *pdev)
> pm_runtime_enable(dev);
> pm_runtime_get_noresume(dev);
> ret = qcom_slim_ngd_qmi_svc_event_init(ctrl);
> - if (ret)
> + if (ret) {
> dev_err(&pdev->dev, "QMI service registration failed:%d", ret);
> + pm_runtime_dont_use_autosuspend(dev);
> + pm_runtime_disable(dev);
> + }
Can this entire pm_runtime_* calls moved after
qcom_slim_ngd_qmi_svc_event_init() ?
>
> return ret;
> }
> @@ -1699,6 +1702,7 @@ static void qcom_slim_ngd_remove(struct platform_device *pdev)
> {
> struct qcom_slim_ngd_ctrl *ctrl = platform_get_drvdata(pdev);
>
> + pm_runtime_dont_use_autosuspend(&pdev->dev);
> pm_runtime_disable(&pdev->dev);
> qcom_slim_ngd_enable(ctrl, false);
> qcom_slim_ngd_exit_dma(ctrl);
>
> --
> 2.51.0
>
--
-Mukesh Ojha
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 7/7] slimbus: qcom-ngd-ctrl: Avoid ABBA on tx_lock/ctrl->lock
2026-03-10 4:09 ` [PATCH 7/7] slimbus: qcom-ngd-ctrl: Avoid ABBA on tx_lock/ctrl->lock Bjorn Andersson
@ 2026-03-10 10:03 ` Mukesh Ojha
2026-03-11 0:06 ` Bjorn Andersson
2026-03-11 1:37 ` Dmitry Baryshkov
1 sibling, 1 reply; 26+ messages in thread
From: Mukesh Ojha @ 2026-03-10 10:03 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski, linux-arm-msm, linux-sound, linux-kernel,
stable
On Mon, Mar 09, 2026 at 11:09:08PM -0500, Bjorn Andersson wrote:
> During the SSR/PDR down notification the tx_lock is taken with the
> intent to provide synchronization with active DMA transfers.
>
> But during this period qcom_slim_ngd_down() is invoked, which ends up in
> slim_report_absent(), which takes the slim_controller lock. In multiple
> other codepaths these two locks are taken in the opposite order (i.e.
> slim_controller then tx_lock).
>
> The result is a lockdep splat, and a possible deadlock:
>
> rprocctl/449 is trying to acquire lock:
> ffff00009793e620 (&ctrl->lock){+.+.}-{4:4}, at: slim_report_absent (drivers/slimbus/core.c:322) slimbus
>
> but task is already holding lock:
> ffff00009793fb50 (&ctrl->tx_lock){+.+.}-{4:4}, at: qcom_slim_ngd_ssr_pdr_notify (drivers/slimbus/qcom-ngd-ctrl.c:1475) slim_qcom_ngd_ctrl
>
> which lock already depends on the new lock.
>
> Possible unsafe locking scenario:
>
> CPU0 CPU1
> ---- ----
> lock(&ctrl->tx_lock);
> lock(&ctrl->lock);
> lock(&ctrl->tx_lock);
> lock(&ctrl->lock);
>
> The assumption is that the comment refers to the desire to not call
> qcom_slim_ngd_exit_dma() while we have an ongoing DMA TX transaction.
> But any such transaction is initiated and completed within a single
> qcom_slim_ngd_xfer_msg().
>
> Prior to calling qcom_slim_ngd_exit_dma() the slim_controller is torn
> down, all child devices are notified that the slimbus is gone and the
> child devices are removed.
>
> Stop taking the tx_lock in qcom_slim_ngd_ssr_pdr_notify() to avoid the
> deadlock.
>
> Fixes: a899d324863a ("slimbus: qcom-ngd-ctrl: add Sub System Restart support")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
> ---
> drivers/slimbus/qcom-ngd-ctrl.c | 3 ---
> 1 file changed, 3 deletions(-)
>
> diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
> index 54a4c6ee1e71fe55794f09575979826d9aa5be9f..75d70de0909a8d17e2410d30f7811f32d5eebea3 100644
> --- a/drivers/slimbus/qcom-ngd-ctrl.c
> +++ b/drivers/slimbus/qcom-ngd-ctrl.c
> @@ -1471,15 +1471,12 @@ static int qcom_slim_ngd_ssr_pdr_notify(struct qcom_slim_ngd_ctrl *ctrl,
> switch (action) {
> case QCOM_SSR_BEFORE_SHUTDOWN:
> case SERVREG_SERVICE_STATE_DOWN:
> - /* Make sure the last dma xfer is finished */
> - mutex_lock(&ctrl->tx_lock);
> if (ctrl->state != QCOM_SLIM_NGD_CTRL_DOWN) {
> pm_runtime_get_noresume(ctrl->ctrl.dev);
> ctrl->state = QCOM_SLIM_NGD_CTRL_DOWN;
> qcom_slim_ngd_down(ctrl);
> qcom_slim_ngd_exit_dma(ctrl);
> }
> - mutex_unlock(&ctrl->tx_lock);
is it not much more safer, to put this tx_lock around qcom_slim_ngd_exit_dma() ?
> break;
> case QCOM_SSR_AFTER_POWERUP:
> case SERVREG_SERVICE_STATE_UP:
>
> --
> 2.51.0
>
--
-Mukesh Ojha
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 7/7] slimbus: qcom-ngd-ctrl: Avoid ABBA on tx_lock/ctrl->lock
2026-03-10 10:03 ` Mukesh Ojha
@ 2026-03-11 0:06 ` Bjorn Andersson
0 siblings, 0 replies; 26+ messages in thread
From: Bjorn Andersson @ 2026-03-11 0:06 UTC (permalink / raw)
To: Mukesh Ojha
Cc: Bjorn Andersson, Srinivas Kandagatla, Greg Kroah-Hartman,
Vinod Koul, Krzysztof Kozlowski, linux-arm-msm, linux-sound,
linux-kernel, stable
On Tue, Mar 10, 2026 at 03:33:19PM +0530, Mukesh Ojha wrote:
> On Mon, Mar 09, 2026 at 11:09:08PM -0500, Bjorn Andersson wrote:
> > During the SSR/PDR down notification the tx_lock is taken with the
> > intent to provide synchronization with active DMA transfers.
> >
> > But during this period qcom_slim_ngd_down() is invoked, which ends up in
> > slim_report_absent(), which takes the slim_controller lock. In multiple
> > other codepaths these two locks are taken in the opposite order (i.e.
> > slim_controller then tx_lock).
> >
> > The result is a lockdep splat, and a possible deadlock:
> >
> > rprocctl/449 is trying to acquire lock:
> > ffff00009793e620 (&ctrl->lock){+.+.}-{4:4}, at: slim_report_absent (drivers/slimbus/core.c:322) slimbus
> >
> > but task is already holding lock:
> > ffff00009793fb50 (&ctrl->tx_lock){+.+.}-{4:4}, at: qcom_slim_ngd_ssr_pdr_notify (drivers/slimbus/qcom-ngd-ctrl.c:1475) slim_qcom_ngd_ctrl
> >
> > which lock already depends on the new lock.
> >
> > Possible unsafe locking scenario:
> >
> > CPU0 CPU1
> > ---- ----
> > lock(&ctrl->tx_lock);
> > lock(&ctrl->lock);
> > lock(&ctrl->tx_lock);
> > lock(&ctrl->lock);
> >
> > The assumption is that the comment refers to the desire to not call
> > qcom_slim_ngd_exit_dma() while we have an ongoing DMA TX transaction.
> > But any such transaction is initiated and completed within a single
> > qcom_slim_ngd_xfer_msg().
> >
> > Prior to calling qcom_slim_ngd_exit_dma() the slim_controller is torn
> > down, all child devices are notified that the slimbus is gone and the
> > child devices are removed.
> >
> > Stop taking the tx_lock in qcom_slim_ngd_ssr_pdr_notify() to avoid the
> > deadlock.
> >
> > Fixes: a899d324863a ("slimbus: qcom-ngd-ctrl: add Sub System Restart support")
> > Cc: stable@vger.kernel.org
> > Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
> > ---
> > drivers/slimbus/qcom-ngd-ctrl.c | 3 ---
> > 1 file changed, 3 deletions(-)
> >
> > diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
> > index 54a4c6ee1e71fe55794f09575979826d9aa5be9f..75d70de0909a8d17e2410d30f7811f32d5eebea3 100644
> > --- a/drivers/slimbus/qcom-ngd-ctrl.c
> > +++ b/drivers/slimbus/qcom-ngd-ctrl.c
> > @@ -1471,15 +1471,12 @@ static int qcom_slim_ngd_ssr_pdr_notify(struct qcom_slim_ngd_ctrl *ctrl,
> > switch (action) {
> > case QCOM_SSR_BEFORE_SHUTDOWN:
> > case SERVREG_SERVICE_STATE_DOWN:
> > - /* Make sure the last dma xfer is finished */
> > - mutex_lock(&ctrl->tx_lock);
> > if (ctrl->state != QCOM_SLIM_NGD_CTRL_DOWN) {
> > pm_runtime_get_noresume(ctrl->ctrl.dev);
> > ctrl->state = QCOM_SLIM_NGD_CTRL_DOWN;
> > qcom_slim_ngd_down(ctrl);
> > qcom_slim_ngd_exit_dma(ctrl);
> > }
> > - mutex_unlock(&ctrl->tx_lock);
>
>
> is it not much more safer, to put this tx_lock around qcom_slim_ngd_exit_dma() ?
>
It would avoid the deadlock in question, so that's good.
But I don't think it's reasonable to guard against the case where
qcom_slim_ngd_xfer_msg() is running beyond qcom_slim_ngd_down().
qcom_slim_ngd_down() will tear down the world around the caller
of qcom_slim_ngd_xfer_msg(), so it's unlikely we're in a good place if
this happens.
One concrete example of this is that the wcd934x "ddata" will be
released by devres as qcom_slim_ngd_down() is cleaning up the children.
But to clarify, this is not something that is handled properly today -
more work is needed in this area.
Regards,
Bjorn
>
> > break;
> > case QCOM_SSR_AFTER_POWERUP:
> > case SERVREG_SERVICE_STATE_UP:
> >
> > --
> > 2.51.0
> >
>
> --
> -Mukesh Ojha
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/7] slimbus: qcom-ngd-ctrl: Fix up platform_driver registration
2026-03-10 4:09 ` [PATCH 1/7] slimbus: qcom-ngd-ctrl: Fix up platform_driver registration Bjorn Andersson
2026-03-10 7:33 ` Mukesh Ojha
@ 2026-03-11 1:30 ` Dmitry Baryshkov
1 sibling, 0 replies; 26+ messages in thread
From: Dmitry Baryshkov @ 2026-03-11 1:30 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski, linux-arm-msm, linux-sound, linux-kernel,
stable
On Mon, Mar 09, 2026 at 11:09:02PM -0500, Bjorn Andersson wrote:
> Device drivers should not invoke platform_driver_register()/unregister()
> in their probe and remove paths. They should further not rely on
> platform_driver_unregister() as their only means of "deleting" their
> child devices.
>
> Introduce a helper to unregister the child device and move the
> platform_driver_register()/unregister() to module_init()/exit().
>
> Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
> ---
> drivers/slimbus/qcom-ngd-ctrl.c | 36 +++++++++++++++++++++++++++++++++---
> 1 file changed, 33 insertions(+), 3 deletions(-)
>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 2/7] slimbus: qcom-ngd-ctrl: Fix probe error path ordering
2026-03-10 4:09 ` [PATCH 2/7] slimbus: qcom-ngd-ctrl: Fix probe error path ordering Bjorn Andersson
2026-03-10 7:36 ` Mukesh Ojha
@ 2026-03-11 1:30 ` Dmitry Baryshkov
1 sibling, 0 replies; 26+ messages in thread
From: Dmitry Baryshkov @ 2026-03-11 1:30 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski, linux-arm-msm, linux-sound, linux-kernel,
stable
On Mon, Mar 09, 2026 at 11:09:03PM -0500, Bjorn Andersson wrote:
> qcom_slim_ngd_ctrl_probe() first registers the SSR callback then
> allocates the PDR context, as such the error path needs to come in
> opposite order to allow us to unroll each step.
>
> Fixes: 16f14551d0df ("slimbus: qcom-ngd: cleanup in probe error path")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
> ---
> drivers/slimbus/qcom-ngd-ctrl.c | 11 +++++------
> 1 file changed, 5 insertions(+), 6 deletions(-)
>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/7] slimbus: qcom-ngd-ctrl: Correct PDR and SSR cleanup ownership
2026-03-10 4:09 ` [PATCH 3/7] slimbus: qcom-ngd-ctrl: Correct PDR and SSR cleanup ownership Bjorn Andersson
2026-03-10 7:39 ` Mukesh Ojha
@ 2026-03-11 1:32 ` Dmitry Baryshkov
1 sibling, 0 replies; 26+ messages in thread
From: Dmitry Baryshkov @ 2026-03-11 1:32 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski, linux-arm-msm, linux-sound, linux-kernel,
stable
On Mon, Mar 09, 2026 at 11:09:04PM -0500, Bjorn Andersson wrote:
> PDR and SSR callbacks are registred from the controller probe function,
> but currently released from the child device's remove function.
>
> In the next commit the controller probe function will be modified such
> that the error path will unregister the child device, resulting in a
> double free of these resources.
I'd just say that the foo_remove() should (only) be unwinding what was
done in foo_probe().
With that in place:
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
>
> Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
> ---
> drivers/slimbus/qcom-ngd-ctrl.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 5/7] slimbus: qcom-ngd-ctrl: Initialize controller resources in controller
2026-03-10 4:09 ` [PATCH 5/7] slimbus: qcom-ngd-ctrl: Initialize controller resources in controller Bjorn Andersson
2026-03-10 7:54 ` Mukesh Ojha
@ 2026-03-11 1:34 ` Dmitry Baryshkov
1 sibling, 0 replies; 26+ messages in thread
From: Dmitry Baryshkov @ 2026-03-11 1:34 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski, linux-arm-msm, linux-sound, linux-kernel,
stable
On Mon, Mar 09, 2026 at 11:09:06PM -0500, Bjorn Andersson wrote:
> The work structs and work queue are controller resources, create and
> destroy them in the controller context. Creating them as part of the
> child device's probe path seems to be okay now that the controller's
> probe has been updated, but if for some reason the child does not probe
> successfully a SSR or PDR notification will schedule_work() on an
> uninitialized "ngd_up_work".
>
> Move the initialization of these controller resources to the controller
> probe function to avoid any issues, and to clarify the ownership.
>
> Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
> ---
> drivers/slimbus/qcom-ngd-ctrl.c | 38 ++++++++++++++++----------------------
> 1 file changed, 16 insertions(+), 22 deletions(-)
>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 6/7] slimbus: qcom-ngd-ctrl: Balance pm_runtime enablement for NGD
2026-03-10 4:09 ` [PATCH 6/7] slimbus: qcom-ngd-ctrl: Balance pm_runtime enablement for NGD Bjorn Andersson
2026-03-10 8:00 ` Mukesh Ojha
@ 2026-03-11 1:34 ` Dmitry Baryshkov
1 sibling, 0 replies; 26+ messages in thread
From: Dmitry Baryshkov @ 2026-03-11 1:34 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski, linux-arm-msm, linux-sound, linux-kernel,
stable
On Mon, Mar 09, 2026 at 11:09:07PM -0500, Bjorn Andersson wrote:
> The pm_runtime_enable() and pm_runtime_use_autosuspend() calls are
> supposed to be balanced on exit, add these calls.
Use devm_pm_runtime_enable()?
>
> Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
> ---
> drivers/slimbus/qcom-ngd-ctrl.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 7/7] slimbus: qcom-ngd-ctrl: Avoid ABBA on tx_lock/ctrl->lock
2026-03-10 4:09 ` [PATCH 7/7] slimbus: qcom-ngd-ctrl: Avoid ABBA on tx_lock/ctrl->lock Bjorn Andersson
2026-03-10 10:03 ` Mukesh Ojha
@ 2026-03-11 1:37 ` Dmitry Baryshkov
1 sibling, 0 replies; 26+ messages in thread
From: Dmitry Baryshkov @ 2026-03-11 1:37 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski, linux-arm-msm, linux-sound, linux-kernel,
stable
On Mon, Mar 09, 2026 at 11:09:08PM -0500, Bjorn Andersson wrote:
> During the SSR/PDR down notification the tx_lock is taken with the
> intent to provide synchronization with active DMA transfers.
>
> But during this period qcom_slim_ngd_down() is invoked, which ends up in
> slim_report_absent(), which takes the slim_controller lock. In multiple
> other codepaths these two locks are taken in the opposite order (i.e.
> slim_controller then tx_lock).
>
> The result is a lockdep splat, and a possible deadlock:
>
> rprocctl/449 is trying to acquire lock:
> ffff00009793e620 (&ctrl->lock){+.+.}-{4:4}, at: slim_report_absent (drivers/slimbus/core.c:322) slimbus
>
> but task is already holding lock:
> ffff00009793fb50 (&ctrl->tx_lock){+.+.}-{4:4}, at: qcom_slim_ngd_ssr_pdr_notify (drivers/slimbus/qcom-ngd-ctrl.c:1475) slim_qcom_ngd_ctrl
>
> which lock already depends on the new lock.
>
> Possible unsafe locking scenario:
>
> CPU0 CPU1
> ---- ----
> lock(&ctrl->tx_lock);
> lock(&ctrl->lock);
> lock(&ctrl->tx_lock);
> lock(&ctrl->lock);
>
> The assumption is that the comment refers to the desire to not call
> qcom_slim_ngd_exit_dma() while we have an ongoing DMA TX transaction.
> But any such transaction is initiated and completed within a single
> qcom_slim_ngd_xfer_msg().
>
> Prior to calling qcom_slim_ngd_exit_dma() the slim_controller is torn
> down, all child devices are notified that the slimbus is gone and the
> child devices are removed.
>
> Stop taking the tx_lock in qcom_slim_ngd_ssr_pdr_notify() to avoid the
> deadlock.
>
> Fixes: a899d324863a ("slimbus: qcom-ngd-ctrl: add Sub System Restart support")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
> ---
> drivers/slimbus/qcom-ngd-ctrl.c | 3 ---
> 1 file changed, 3 deletions(-)
>
> diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
> index 54a4c6ee1e71fe55794f09575979826d9aa5be9f..75d70de0909a8d17e2410d30f7811f32d5eebea3 100644
> --- a/drivers/slimbus/qcom-ngd-ctrl.c
> +++ b/drivers/slimbus/qcom-ngd-ctrl.c
> @@ -1471,15 +1471,12 @@ static int qcom_slim_ngd_ssr_pdr_notify(struct qcom_slim_ngd_ctrl *ctrl,
> switch (action) {
> case QCOM_SSR_BEFORE_SHUTDOWN:
> case SERVREG_SERVICE_STATE_DOWN:
> - /* Make sure the last dma xfer is finished */
> - mutex_lock(&ctrl->tx_lock);
> if (ctrl->state != QCOM_SLIM_NGD_CTRL_DOWN) {
> pm_runtime_get_noresume(ctrl->ctrl.dev);
> ctrl->state = QCOM_SLIM_NGD_CTRL_DOWN;
What will protect ctrl->state from the possible concurrent modification?
> qcom_slim_ngd_down(ctrl);
> qcom_slim_ngd_exit_dma(ctrl);
> }
> - mutex_unlock(&ctrl->tx_lock);
> break;
> case QCOM_SSR_AFTER_POWERUP:
> case SERVREG_SERVICE_STATE_UP:
>
> --
> 2.51.0
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 0/7] slimbus: qcom-ngd-ctrl: Fix some race conditions and deadlocks
2026-03-10 4:09 [PATCH 0/7] slimbus: qcom-ngd-ctrl: Fix some race conditions and deadlocks Bjorn Andersson
` (6 preceding siblings ...)
2026-03-10 4:09 ` [PATCH 7/7] slimbus: qcom-ngd-ctrl: Avoid ABBA on tx_lock/ctrl->lock Bjorn Andersson
@ 2026-03-11 1:40 ` Dmitry Baryshkov
7 siblings, 0 replies; 26+ messages in thread
From: Dmitry Baryshkov @ 2026-03-11 1:40 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski, linux-arm-msm, linux-sound, linux-kernel,
stable
On Mon, Mar 09, 2026 at 11:09:01PM -0500, Bjorn Andersson wrote:
> When the qcom-ngd-ctrl driver is probed after the ADSP remoteproc, the
> SSR notifier will fire immediately, which results in
> qcom_slim_ngd_ssr_pdr_notify() attempting to schedule_work() on an
> unitialized work_struct.
>
> The concrete result of this is that my db845c/RB3 now fails to boot 100%
> of the time.
>
> In reviewing the problematic code, a few other problems where
> discovered, such that platform_driver_unregister() is used to unregister
> the child device.
>
> Lastly, with the db845c booting, it was determined that attempting to
> stop the ADSP remoteproc causes the slimbus driver to deadlock.
>
> Note that while this solves the problems described above, and unblock
> boot as well as restart of the remoteproc, this stack needs more love.
>
> Upon tearing down the slimbus controller (when the ADSP goes down), the
> slimbus devices attempts to access their slimbus devices - which is
> prevented by the controller being runtime suspended. This results in a
> wall of errors in the log, about failing transactions.
>
> Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
> ---
> Bjorn Andersson (7):
> slimbus: qcom-ngd-ctrl: Fix up platform_driver registration
> slimbus: qcom-ngd-ctrl: Fix probe error path ordering
> slimbus: qcom-ngd-ctrl: Correct PDR and SSR cleanup ownership
> slimbus: qcom-ngd-ctrl: Register callbacks after creating the ngd
> slimbus: qcom-ngd-ctrl: Initialize controller resources in controller
> slimbus: qcom-ngd-ctrl: Balance pm_runtime enablement for NGD
> slimbus: qcom-ngd-ctrl: Avoid ABBA on tx_lock/ctrl->lock
>
> drivers/slimbus/qcom-ngd-ctrl.c | 127 +++++++++++++++++++++++++---------------
> 1 file changed, 80 insertions(+), 47 deletions(-)
> ---
> base-commit: a0ae2a256046c0c5d3778d1a194ff2e171f16e5f
> change-id: 20260211-slim-ngd-dev-74166f29f035
>
> Best regards,
> --
> Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
Bjorn,
While you are at it, it looks like there is another possible issue:
ngd->base is set after platform_device_add(), possibly letting NGD
driver to use uninitialized base.
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 4/7] slimbus: qcom-ngd-ctrl: Register callbacks after creating the ngd
2026-03-10 4:09 ` [PATCH 4/7] slimbus: qcom-ngd-ctrl: Register callbacks after creating the ngd Bjorn Andersson
2026-03-10 7:49 ` Mukesh Ojha
@ 2026-03-11 1:45 ` Dmitry Baryshkov
1 sibling, 0 replies; 26+ messages in thread
From: Dmitry Baryshkov @ 2026-03-11 1:45 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Krzysztof Kozlowski, linux-arm-msm, linux-sound, linux-kernel,
stable
On Mon, Mar 09, 2026 at 11:09:05PM -0500, Bjorn Andersson wrote:
> When the remoteproc starts in parallel with the NGD driver being probed,
> or the remoteproc is already up when the PDR lookup is being registered,
> or in the theoretical event that we get an interrupt from the hardware,
> these callbacks will operate on uninitialized data. This result in
> issues to boot the affected boards.
>
> One such example can be seen in the following fault, where
> qcom_slim_ngd_ssr_pdr_notify() schedules work on the NULL ngd_up_work.
>
> [ 21.858578] ------------[ cut here ]------------
> [ 21.858745] WARNING: kernel/workqueue.c:2338 at __queue_work+0x5e0/0x790, CPU#2: kworker/2:2/116
> ...
> [ 21.859251] Call trace:
> [ 21.859255] __queue_work+0x5e0/0x790 (P)
> [ 21.859265] queue_work_on+0x6c/0xf0
> [ 21.859273] qcom_slim_ngd_ssr_pdr_notify+0x110/0x150 [slim_qcom_ngd_ctrl]
> [ 21.859304] qcom_slim_ngd_ssr_notify+0x24/0x40 [slim_qcom_ngd_ctrl]
> [ 21.859318] notifier_call_chain+0xa4/0x230
> [ 21.859329] srcu_notifier_call_chain+0x64/0xb8
> [ 21.859338] ssr_notify_start+0x40/0x78 [qcom_common]
> [ 21.859355] rproc_start+0x130/0x230
> [ 21.859367] rproc_boot+0x3d4/0x518
> ...
>
> Move the three registrations of interrupts, SSR and PDR until after the
> NGD device has been registered.
>
> This could be further refined by moving initialization to the control
> driver probe and by removing the platform driver model from the picture.
>
> Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
> ---
> drivers/slimbus/qcom-ngd-ctrl.c | 52 ++++++++++++++++++++++++-----------------
> 1 file changed, 30 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
> index 09ce3299e15c25b1b9cf6b1559850adf4aa20737..76944c515291a62fb9cb192bec5cd5c2caa542f4 100644
> --- a/drivers/slimbus/qcom-ngd-ctrl.c
> +++ b/drivers/slimbus/qcom-ngd-ctrl.c
> @@ -1613,6 +1613,7 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
> struct qcom_slim_ngd_ctrl *ctrl;
> int ret;
> struct pdr_service *pds;
> + int irq;
>
> ctrl = devm_kzalloc(dev, sizeof(*ctrl), GFP_KERNEL);
> if (!ctrl)
> @@ -1624,19 +1625,9 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
> if (IS_ERR(ctrl->base))
> return PTR_ERR(ctrl->base);
>
> - ret = platform_get_irq(pdev, 0);
> - if (ret < 0)
> - return ret;
> -
> - ret = devm_request_irq(dev, ret, qcom_slim_ngd_interrupt,
> - IRQF_TRIGGER_HIGH, "slim-ngd", ctrl);
This should be still called here, with the IRQF_NO_AUTOEN flag and then
manually enabled after registering the subdevice.
> - if (ret)
> - return dev_err_probe(&pdev->dev, ret, "request IRQ failed\n");
> -
> - ctrl->nb.notifier_call = qcom_slim_ngd_ssr_notify;
> - ctrl->notifier = qcom_register_ssr_notifier("lpass", &ctrl->nb);
> - if (IS_ERR(ctrl->notifier))
> - return PTR_ERR(ctrl->notifier);
> + irq = platform_get_irq(pdev, 0);
> + if (irq < 0)
> + return irq;
>
> ctrl->dev = dev;
> ctrl->framer.rootfreq = SLIM_ROOT_FREQ >> 3;
> @@ -1659,24 +1650,41 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev)
> init_completion(&ctrl->qmi_up);
>
> ctrl->pdr = pdr_handle_alloc(slim_pd_status, ctrl);
> - if (IS_ERR(ctrl->pdr)) {
> - ret = dev_err_probe(dev, PTR_ERR(ctrl->pdr),
> - "Failed to init PDR handle\n");
> - goto err_unregister_ssr;
> - }
> + if (IS_ERR(ctrl->pdr))
> + return dev_err_probe(dev, PTR_ERR(ctrl->pdr), "Failed to init PDR handle\n");
> +
> + ret = of_qcom_slim_ngd_register(dev, ctrl);
> + if (ret)
> + goto err_pdr_release;
>
> pds = pdr_add_lookup(ctrl->pdr, "avs/audio", "msm/adsp/audio_pd");
> if (IS_ERR(pds) && PTR_ERR(pds) != -EALREADY) {
> ret = dev_err_probe(dev, PTR_ERR(pds), "pdr add lookup failed\n");
> - goto err_pdr_release;
> + goto err_unregister_ngd;
> }
>
> - return of_qcom_slim_ngd_register(dev, ctrl);
> + ctrl->nb.notifier_call = qcom_slim_ngd_ssr_notify;
> + ctrl->notifier = qcom_register_ssr_notifier("lpass", &ctrl->nb);
> + if (IS_ERR(ctrl->notifier)) {
> + ret = PTR_ERR(ctrl->notifier);
> + goto err_unregister_ngd;
> + }
> +
> + ret = devm_request_irq(dev, irq, qcom_slim_ngd_interrupt,
> + IRQF_TRIGGER_HIGH, "slim-ngd", ctrl);
> + if (ret) {
> + ret = dev_err_probe(&pdev->dev, ret, "request IRQ failed\n");
> + goto err_unregister_ssr;
> + }
> +
> + return 0;
>
> -err_pdr_release:
> - pdr_handle_release(ctrl->pdr);
> err_unregister_ssr:
> qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb);
> +err_unregister_ngd:
> + qcom_slim_ngd_unregister(ctrl);
> +err_pdr_release:
> + pdr_handle_release(ctrl->pdr);
>
> return ret;
> }
>
> --
> 2.51.0
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/7] slimbus: qcom-ngd-ctrl: Correct PDR and SSR cleanup ownership
2026-03-10 7:39 ` Mukesh Ojha
@ 2026-03-24 2:36 ` Bjorn Andersson
2026-03-24 6:32 ` Mukesh Ojha
0 siblings, 1 reply; 26+ messages in thread
From: Bjorn Andersson @ 2026-03-24 2:36 UTC (permalink / raw)
To: Mukesh Ojha
Cc: Bjorn Andersson, Srinivas Kandagatla, Greg Kroah-Hartman,
Vinod Koul, Krzysztof Kozlowski, linux-arm-msm, linux-sound,
linux-kernel, stable
On Tue, Mar 10, 2026 at 01:09:33PM +0530, Mukesh Ojha wrote:
> On Mon, Mar 09, 2026 at 11:09:04PM -0500, Bjorn Andersson wrote:
> > PDR and SSR callbacks are registred from the controller probe function,
> > but currently released from the child device's remove function.
> >
> > In the next commit the controller probe function will be modified such
> > that the error path will unregister the child device, resulting in a
> > double free of these resources.
>
> Change is fine, Could this not be accommodated in the next commit?
>
The problem solved by patch 4 relates to the oreder that we're acquiring
the resources in probe and how the error handling of that works.
If I squash the two patches, it seems that I would have a lengthy commit
message talking about that part and then a "also, while at it move the
unregister from X to Y because...".
I.e. it doesn't feel like the same logical change to me.
Please let me know if you disagree.
Regards,
Bjorn
> >
> > Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
> > Cc: stable@vger.kernel.org
> > Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
>
> Reviewed-by: Mukesh Ojha <mukesh.ojha@oss.qualcomm.com>
>
> > ---
> > drivers/slimbus/qcom-ngd-ctrl.c | 5 +++--
> > 1 file changed, 3 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
> > index b34e727bab086c95dc7e760bf1141baac9ccf6a7..09ce3299e15c25b1b9cf6b1559850adf4aa20737 100644
> > --- a/drivers/slimbus/qcom-ngd-ctrl.c
> > +++ b/drivers/slimbus/qcom-ngd-ctrl.c
> > @@ -1685,6 +1685,9 @@ static void qcom_slim_ngd_ctrl_remove(struct platform_device *pdev)
> > {
> > struct qcom_slim_ngd_ctrl *ctrl = platform_get_drvdata(pdev);
> >
> > + pdr_handle_release(ctrl->pdr);
> > + qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb);
> > +
> > qcom_slim_ngd_unregister(ctrl);
> > }
> >
> > @@ -1693,8 +1696,6 @@ static void qcom_slim_ngd_remove(struct platform_device *pdev)
> > struct qcom_slim_ngd_ctrl *ctrl = platform_get_drvdata(pdev);
> >
> > pm_runtime_disable(&pdev->dev);
> > - pdr_handle_release(ctrl->pdr);
> > - qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb);
> > qcom_slim_ngd_enable(ctrl, false);
> > qcom_slim_ngd_exit_dma(ctrl);
> > qcom_slim_ngd_qmi_svc_event_deinit(&ctrl->qmi);
> >
> > --
> > 2.51.0
> >
>
> --
> -Mukesh Ojha
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/7] slimbus: qcom-ngd-ctrl: Correct PDR and SSR cleanup ownership
2026-03-24 2:36 ` Bjorn Andersson
@ 2026-03-24 6:32 ` Mukesh Ojha
0 siblings, 0 replies; 26+ messages in thread
From: Mukesh Ojha @ 2026-03-24 6:32 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Bjorn Andersson, Srinivas Kandagatla, Greg Kroah-Hartman,
Vinod Koul, Krzysztof Kozlowski, linux-arm-msm, linux-sound,
linux-kernel, stable
On Mon, Mar 23, 2026 at 09:36:49PM -0500, Bjorn Andersson wrote:
> On Tue, Mar 10, 2026 at 01:09:33PM +0530, Mukesh Ojha wrote:
> > On Mon, Mar 09, 2026 at 11:09:04PM -0500, Bjorn Andersson wrote:
> > > PDR and SSR callbacks are registred from the controller probe function,
> > > but currently released from the child device's remove function.
> > >
> > > In the next commit the controller probe function will be modified such
> > > that the error path will unregister the child device, resulting in a
> > > double free of these resources.
> >
> > Change is fine, Could this not be accommodated in the next commit?
> >
>
> The problem solved by patch 4 relates to the oreder that we're acquiring
> the resources in probe and how the error handling of that works.
>
> If I squash the two patches, it seems that I would have a lengthy commit
> message talking about that part and then a "also, while at it move the
> unregister from X to Y because...".
>
> I.e. it doesn't feel like the same logical change to me.
>
> Please let me know if you disagree.
Agree..
I was not sure about these text usage "next commit" and "will be modified",
Hence, was asking if we can accomodate it in one commit as both are Cced to
stable
>
> Regards,
> Bjorn
>
> > >
> > > Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
> > > Cc: stable@vger.kernel.org
> > > Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
> >
> > Reviewed-by: Mukesh Ojha <mukesh.ojha@oss.qualcomm.com>
> >
> > > ---
> > > drivers/slimbus/qcom-ngd-ctrl.c | 5 +++--
> > > 1 file changed, 3 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
> > > index b34e727bab086c95dc7e760bf1141baac9ccf6a7..09ce3299e15c25b1b9cf6b1559850adf4aa20737 100644
> > > --- a/drivers/slimbus/qcom-ngd-ctrl.c
> > > +++ b/drivers/slimbus/qcom-ngd-ctrl.c
> > > @@ -1685,6 +1685,9 @@ static void qcom_slim_ngd_ctrl_remove(struct platform_device *pdev)
> > > {
> > > struct qcom_slim_ngd_ctrl *ctrl = platform_get_drvdata(pdev);
> > >
> > > + pdr_handle_release(ctrl->pdr);
> > > + qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb);
> > > +
> > > qcom_slim_ngd_unregister(ctrl);
> > > }
> > >
> > > @@ -1693,8 +1696,6 @@ static void qcom_slim_ngd_remove(struct platform_device *pdev)
> > > struct qcom_slim_ngd_ctrl *ctrl = platform_get_drvdata(pdev);
> > >
> > > pm_runtime_disable(&pdev->dev);
> > > - pdr_handle_release(ctrl->pdr);
> > > - qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb);
> > > qcom_slim_ngd_enable(ctrl, false);
> > > qcom_slim_ngd_exit_dma(ctrl);
> > > qcom_slim_ngd_qmi_svc_event_deinit(&ctrl->qmi);
> > >
> > > --
> > > 2.51.0
> > >
> >
> > --
> > -Mukesh Ojha
--
-Mukesh Ojha
^ permalink raw reply [flat|nested] 26+ messages in thread
end of thread, other threads:[~2026-03-24 6:32 UTC | newest]
Thread overview: 26+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-10 4:09 [PATCH 0/7] slimbus: qcom-ngd-ctrl: Fix some race conditions and deadlocks Bjorn Andersson
2026-03-10 4:09 ` [PATCH 1/7] slimbus: qcom-ngd-ctrl: Fix up platform_driver registration Bjorn Andersson
2026-03-10 7:33 ` Mukesh Ojha
2026-03-11 1:30 ` Dmitry Baryshkov
2026-03-10 4:09 ` [PATCH 2/7] slimbus: qcom-ngd-ctrl: Fix probe error path ordering Bjorn Andersson
2026-03-10 7:36 ` Mukesh Ojha
2026-03-11 1:30 ` Dmitry Baryshkov
2026-03-10 4:09 ` [PATCH 3/7] slimbus: qcom-ngd-ctrl: Correct PDR and SSR cleanup ownership Bjorn Andersson
2026-03-10 7:39 ` Mukesh Ojha
2026-03-24 2:36 ` Bjorn Andersson
2026-03-24 6:32 ` Mukesh Ojha
2026-03-11 1:32 ` Dmitry Baryshkov
2026-03-10 4:09 ` [PATCH 4/7] slimbus: qcom-ngd-ctrl: Register callbacks after creating the ngd Bjorn Andersson
2026-03-10 7:49 ` Mukesh Ojha
2026-03-11 1:45 ` Dmitry Baryshkov
2026-03-10 4:09 ` [PATCH 5/7] slimbus: qcom-ngd-ctrl: Initialize controller resources in controller Bjorn Andersson
2026-03-10 7:54 ` Mukesh Ojha
2026-03-11 1:34 ` Dmitry Baryshkov
2026-03-10 4:09 ` [PATCH 6/7] slimbus: qcom-ngd-ctrl: Balance pm_runtime enablement for NGD Bjorn Andersson
2026-03-10 8:00 ` Mukesh Ojha
2026-03-11 1:34 ` Dmitry Baryshkov
2026-03-10 4:09 ` [PATCH 7/7] slimbus: qcom-ngd-ctrl: Avoid ABBA on tx_lock/ctrl->lock Bjorn Andersson
2026-03-10 10:03 ` Mukesh Ojha
2026-03-11 0:06 ` Bjorn Andersson
2026-03-11 1:37 ` Dmitry Baryshkov
2026-03-11 1:40 ` [PATCH 0/7] slimbus: qcom-ngd-ctrl: Fix some race conditions and deadlocks Dmitry Baryshkov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox