7eedea7abf
It is reported that in low-memory situations the system-wide resume core code deadlocks, because async_schedule_dev() executes its argument function synchronously if it cannot allocate memory (and not only in that case) and that function attempts to acquire a mutex that is already held. Executing the argument function synchronously from within dpm_async_fn() may also be problematic for ordering reasons (it may cause a consumer device's resume callback to be invoked before a requisite supplier device's one, for example). Address this by changing the code in question to use async_schedule_dev_nocall() for scheduling the asynchronous execution of device suspend and resume functions and to directly run them synchronously if async_schedule_dev_nocall() returns false. Link: https://lore.kernel.org/linux-pm/ZYvjiqX6EsL15moe@perf/ Reported-by: Youngmin Nam <youngmin.nam@samsung.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com> Tested-by: Youngmin Nam <youngmin.nam@samsung.com> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org> Cc: 5.7+ <stable@vger.kernel.org> # 5.7+: 6aa09a5bccd8 async: Split async_schedule_node_domain() Cc: 5.7+ <stable@vger.kernel.org> # 5.7+: 7d4b5d7a37bd async: Introduce async_schedule_dev_nocall() Cc: 5.7+ <stable@vger.kernel.org> # 5.7+ Bug: 319759660 Change-Id: I1164a6a0b9899ab2f01d5efb413827b9d0983d98 (cherry picked from commit 7839d0078e0d5e6cc2fa0b0dfbee71de74f1e557) [Youngmin: Resolved minor conflict in drivers/base/power/main.c] Signed-off-by: Youngmin Nam <youngmin.nam@samsung.com> |
||
---|---|---|
.. | ||
clock_ops.c | ||
common.c | ||
domain_governor.c | ||
domain.c | ||
generic_ops.c | ||
main.c | ||
Makefile | ||
power.h | ||
qos-test.c | ||
qos.c | ||
runtime.c | ||
sysfs.c | ||
trace.c | ||
wakeirq.c | ||
wakeup_stats.c | ||
wakeup.c |