mirror of https://github.com/OpenIPC/firmware.git
74 lines
2.2 KiB
Diff
74 lines
2.2 KiB
Diff
diff -drupN a/kernel/power/process.c b/kernel/power/process.c
|
|
--- a/kernel/power/process.c 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/kernel/power/process.c 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -19,6 +19,7 @@
|
|
#include <linux/kmod.h>
|
|
#include <trace/events/power.h>
|
|
#include <linux/cpuset.h>
|
|
+#include <linux/wakeup_reason.h>
|
|
|
|
/*
|
|
* Timeout for stopping processes
|
|
@@ -35,6 +36,9 @@ static int try_to_freeze_tasks(bool user
|
|
unsigned int elapsed_msecs;
|
|
bool wakeup = false;
|
|
int sleep_usecs = USEC_PER_MSEC;
|
|
+#ifdef CONFIG_PM_SLEEP
|
|
+ char suspend_abort[MAX_SUSPEND_ABORT_LEN];
|
|
+#endif
|
|
|
|
start = ktime_get_boottime();
|
|
|
|
@@ -64,6 +68,11 @@ static int try_to_freeze_tasks(bool user
|
|
break;
|
|
|
|
if (pm_wakeup_pending()) {
|
|
+#ifdef CONFIG_PM_SLEEP
|
|
+ pm_get_active_wakeup_sources(suspend_abort,
|
|
+ MAX_SUSPEND_ABORT_LEN);
|
|
+ log_suspend_abort_reason(suspend_abort);
|
|
+#endif
|
|
wakeup = true;
|
|
break;
|
|
}
|
|
@@ -82,26 +91,27 @@ static int try_to_freeze_tasks(bool user
|
|
elapsed = ktime_sub(end, start);
|
|
elapsed_msecs = ktime_to_ms(elapsed);
|
|
|
|
- if (todo) {
|
|
+ if (wakeup) {
|
|
pr_cont("\n");
|
|
- pr_err("Freezing of tasks %s after %d.%03d seconds "
|
|
- "(%d tasks refusing to freeze, wq_busy=%d):\n",
|
|
- wakeup ? "aborted" : "failed",
|
|
+ pr_err("Freezing of tasks aborted after %d.%03d seconds",
|
|
+ elapsed_msecs / 1000, elapsed_msecs % 1000);
|
|
+ } else if (todo) {
|
|
+ pr_cont("\n");
|
|
+ pr_err("Freezing of tasks failed after %d.%03d seconds"
|
|
+ " (%d tasks refusing to freeze, wq_busy=%d):\n",
|
|
elapsed_msecs / 1000, elapsed_msecs % 1000,
|
|
todo - wq_busy, wq_busy);
|
|
|
|
if (wq_busy)
|
|
show_workqueue_state();
|
|
|
|
- if (!wakeup) {
|
|
- read_lock(&tasklist_lock);
|
|
- for_each_process_thread(g, p) {
|
|
- if (p != current && !freezer_should_skip(p)
|
|
- && freezing(p) && !frozen(p))
|
|
- sched_show_task(p);
|
|
- }
|
|
- read_unlock(&tasklist_lock);
|
|
+ read_lock(&tasklist_lock);
|
|
+ for_each_process_thread(g, p) {
|
|
+ if (p != current && !freezer_should_skip(p)
|
|
+ && freezing(p) && !frozen(p))
|
|
+ sched_show_task(p);
|
|
}
|
|
+ read_unlock(&tasklist_lock);
|
|
} else {
|
|
pr_cont("(elapsed %d.%03d seconds) ", elapsed_msecs / 1000,
|
|
elapsed_msecs % 1000);
|