Skip to content

Commit

Permalink
PM: sleep: Avoid using pr_cont() in the tasks freezing code
Browse files Browse the repository at this point in the history
commit a449dfb upstream.

Using pr_cont() in the tasks freezing code related to system-wide
suspend and hibernation is problematic, because the continuation
messages printed there are susceptible to interspersing with other
unrelated messages which results in output that is hard to
understand.

Address this issue by modifying try_to_freeze_tasks() to print
messages that don't require continuations and adjusting its
callers accordingly.

Reported-by: Thomas Weißschuh <linux@weissschuh.net>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Cc: Paul Menzel <pmenzel@molgen.mpg.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
rafaeljw authored and gregkh committed Mar 3, 2023
1 parent 0c2f28f commit f217350
Showing 1 changed file with 8 additions and 13 deletions.
21 changes: 8 additions & 13 deletions kernel/power/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ unsigned int __read_mostly freeze_timeout_msecs = 20 * MSEC_PER_SEC;

static int try_to_freeze_tasks(bool user_only)
{
const char *what = user_only ? "user space processes" :
"remaining freezable tasks";
struct task_struct *g, *p;
unsigned long end_time;
unsigned int todo;
Expand All @@ -36,6 +38,8 @@ static int try_to_freeze_tasks(bool user_only)
bool wakeup = false;
int sleep_usecs = USEC_PER_MSEC;

pr_info("Freezing %s\n", what);

start = ktime_get_boottime();

end_time = jiffies + msecs_to_jiffies(freeze_timeout_msecs);
Expand Down Expand Up @@ -82,7 +86,6 @@ static int try_to_freeze_tasks(bool user_only)
elapsed_msecs = ktime_to_ms(elapsed);

if (todo) {
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",
Expand All @@ -101,8 +104,8 @@ static int try_to_freeze_tasks(bool user_only)
read_unlock(&tasklist_lock);
}
} else {
pr_cont("(elapsed %d.%03d seconds) ", elapsed_msecs / 1000,
elapsed_msecs % 1000);
pr_info("Freezing %s completed (elapsed %d.%03d seconds)\n",
what, elapsed_msecs / 1000, elapsed_msecs % 1000);
}

return todo ? -EBUSY : 0;
Expand Down Expand Up @@ -130,14 +133,11 @@ int freeze_processes(void)
static_branch_inc(&freezer_active);

pm_wakeup_clear(0);
pr_info("Freezing user space processes ... ");
pm_freezing = true;
error = try_to_freeze_tasks(true);
if (!error) {
if (!error)
__usermodehelper_set_disable_depth(UMH_DISABLED);
pr_cont("done.");
}
pr_cont("\n");

BUG_ON(in_atomic());

/*
Expand Down Expand Up @@ -166,14 +166,9 @@ int freeze_kernel_threads(void)
{
int error;

pr_info("Freezing remaining freezable tasks ... ");

pm_nosig_freezing = true;
error = try_to_freeze_tasks(false);
if (!error)
pr_cont("done.");

pr_cont("\n");
BUG_ON(in_atomic());

if (error)
Expand Down

0 comments on commit f217350

Please sign in to comment.