linux/drivers/soc/qcom
Saranya R f4489260f5 soc: qcom: pdr: Fix the potential deadlock
commit 2eeb03ad9f upstream.

When some client process A call pdr_add_lookup() to add the look up for
the service and does schedule locator work, later a process B got a new
server packet indicating locator is up and call pdr_locator_new_server()
which eventually sets pdr->locator_init_complete to true which process A
sees and takes list lock and queries domain list but it will timeout due
to deadlock as the response will queued to the same qmi->wq and it is
ordered workqueue and process B is not able to complete new server
request work due to deadlock on list lock.

Fix it by removing the unnecessary list iteration as the list iteration
is already being done inside locator work, so avoid it here and just
call schedule_work() here.

       Process A                        Process B

                                     process_scheduled_works()
pdr_add_lookup()                      qmi_data_ready_work()
 process_scheduled_works()             pdr_locator_new_server()
                                         pdr->locator_init_complete=true;
   pdr_locator_work()
    mutex_lock(&pdr->list_lock);

     pdr_locate_service()                  mutex_lock(&pdr->list_lock);

      pdr_get_domain_list()
       pr_err("PDR: %s get domain list
               txn wait failed: %d\n",
               req->service_name,
               ret);

Timeout error log due to deadlock:

"
 PDR: tms/servreg get domain list txn wait failed: -110
 PDR: service lookup for msm/adsp/sensor_pd:tms/servreg failed: -110
"

Thanks to Bjorn and Johan for letting me know that this commit also fixes
an audio regression when using the in-kernel pd-mapper as that makes it
easier to hit this race. [1]

Link: https://lore.kernel.org/lkml/Zqet8iInnDhnxkT9@hovoldconsulting.com/ # [1]
Fixes: fbe639b44a ("soc: qcom: Introduce Protection Domain Restart helpers")
CC: stable@vger.kernel.org
Reviewed-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
Tested-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
Tested-by: Johan Hovold <johan+linaro@kernel.org>
Signed-off-by: Saranya R <quic_sarar@quicinc.com>
Co-developed-by: Mukesh Ojha <mukesh.ojha@oss.qualcomm.com>
Signed-off-by: Mukesh Ojha <mukesh.ojha@oss.qualcomm.com>
Link: https://lore.kernel.org/r/20250212163720.1577876-1-mukesh.ojha@oss.qualcomm.com
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2025-03-28 22:03:31 +01:00
..
apr.c soc: qcom: apr: simplify with scoped for each OF child loop 2024-08-14 22:14:43 -05:00
cmd-db.c soc: qcom: cmd-db: Map shared memory as WC, not WB 2024-07-28 21:59:45 -05:00
icc-bwmon.c soc: qcom: icc-bwmon: Add tracepoints in bwmon_intr_thread 2024-07-31 22:22:47 -05:00
ice.c soc: qcom: ice: use scoped device node handling to simplify error paths 2024-08-14 22:14:43 -05:00
Kconfig soc: qcom: pd-mapper: Depend on ARCH_QCOM || COMPILE_TEST 2024-07-28 21:37:00 -05:00
kryo-l2-accessors.c soc: qcom: Switch to EXPORT_SYMBOL_GPL() 2023-09-27 16:08:38 -07:00
llcc-qcom.c soc: qcom: llcc: Enable LLCC_WRCACHE at boot on X1 2025-02-17 10:05:32 +01:00
Makefile soc: qcom: smp2p: Introduce tracepoint support 2024-07-28 21:58:46 -05:00
mdt_loader.c soc: qcom: mdt_loader: simplify with cleanup.h 2024-07-06 12:56:50 -05:00
ocmem.c soc: qcom: ocmem: use scoped device node handling to simplify error paths 2024-08-14 22:14:43 -05:00
pdr_interface.c soc: qcom: pdr: Fix the potential deadlock 2025-03-28 22:03:31 +01:00
pdr_internal.h soc: qcom: add pd-mapper implementation 2024-06-24 17:32:07 -05:00
pmic_glink.c soc: qcom: pmic_glink: Handle GLINK intent allocation rejections 2024-10-24 13:03:37 -05:00
pmic_glink_altmode.c soc: qcom: pmic_glink: Fix race during initialization 2024-08-21 08:37:30 -05:00
pmic_pdcharger_ulog.c soc: qcom: mention intentionally broken module autoloading 2024-04-21 11:22:11 -05:00
pmic_pdcharger_ulog.h tracing/treewide: Remove second parameter of __assign_str() 2024-05-22 20:14:47 -04:00
qcom-geni-se.c soc: qcom: geni-se: fix array underflow in geni_se_clk_tbl_get() 2024-12-05 14:01:26 +01:00
qcom-pbs.c soc: qcom: pbs: use scoped device node handling to simplify error paths 2024-08-14 22:14:43 -05:00
qcom_aoss.c soc: qcom: aoss: simplify with scoped for each OF child loop 2024-08-14 22:14:43 -05:00
qcom_gsbi.c soc: qcom: qcom_gsbi: Convert to platform remove callback returning void 2023-10-02 11:30:19 -07:00
qcom_pd_mapper.c soc: qcom: pd-mapper: Add QCM6490 PD maps 2024-12-14 20:03:39 +01:00
qcom_pdr_msg.c soc: qcom: add pd-mapper implementation 2024-06-24 17:32:07 -05:00
qcom_stats.c soc: qcom: qcom_stats: Add DSPs and apss subsystem stats 2024-03-17 22:19:08 -05:00
qmi_encdec.c soc: qcom: Switch to EXPORT_SYMBOL_GPL() 2023-09-27 16:08:38 -07:00
qmi_interface.c soc: qcom: Switch to EXPORT_SYMBOL_GPL() 2023-09-27 16:08:38 -07:00
ramp_controller.c ARM: SoC drivers for 6.5 2023-06-29 15:22:19 -07:00
rmtfs_mem.c soc: qcom: rmtfs_mem: Convert to platform remove callback returning void 2023-10-02 11:30:26 -07:00
rpm-proc.c soc: qcom: Add RPM processor/subsystem driver 2023-07-13 22:18:57 -07:00
rpm_master_stats.c soc: qcom: mention intentionally broken module autoloading 2024-04-21 11:22:11 -05:00
rpmh-internal.h soc: qcom: rpmh-rsc: Avoid unnecessary checks on irq-done response 2022-12-05 15:12:17 -06:00
rpmh-rsc.c soc: qcom: rpmh-rsc: Ensure irqs aren't disabled by rpmh_rsc_send_data() callers 2024-05-27 11:50:09 -05:00
rpmh.c soc: qcom: rpmh-rsc: Ensure irqs aren't disabled by rpmh_rsc_send_data() callers 2024-05-27 11:50:09 -05:00
smd-rpm.c soc: qcom: smd-rpm: add qcom,smd-rpm compatible 2024-08-14 22:14:42 -05:00
smem.c remoteproc updates for v6.11 2024-07-23 13:36:51 -07:00
smem_state.c soc: qcom: smem_state: fix missing of_node_put in error path 2025-02-17 10:05:33 +01:00
smp2p.c soc: qcom: smp2p: use scoped device node handling to simplify error paths 2024-08-14 22:14:43 -05:00
smsm.c soc: qcom: smsm: Support using mailbox interface 2024-06-12 23:09:25 -05:00
socinfo.c soc: qcom: socinfo: Avoid out of bounds read of serial number 2025-02-17 10:05:18 +01:00
spm.c soc: qcom: spm: add missing MODULE_DESCRIPTION() 2024-06-05 22:02:16 -05:00
trace-aoss.h tracing/treewide: Remove second parameter of __assign_str() 2024-05-22 20:14:47 -04:00
trace-rpmh.h tracing/treewide: Remove second parameter of __assign_str() 2024-05-22 20:14:47 -04:00
trace-smp2p.h soc: qcom: smp2p: Introduce tracepoint support 2024-07-28 21:58:46 -05:00
trace_icc-bwmon.h soc: qcom: icc-bwmon: Add tracepoints in bwmon_intr_thread 2024-07-31 22:22:47 -05:00
wcnss_ctrl.c soc: qcom: wcnss: simplify with cleanup.h 2024-07-06 12:56:50 -05:00