Petr Mladek 729d6a
From 4c0736a76a186e5df2cd2afda3e7a04d2a427d1b Mon Sep 17 00:00:00 2001
Petr Mladek 729d6a
From: Petr Mladek <pmladek@suse.com>
Petr Mladek 729d6a
Date: Tue, 7 Mar 2023 13:53:34 +0100
Petr Mladek 729d6a
Subject: [PATCH] workqueue: Warn when a rescuer could not be created
Petr Mladek 729d6a
Git-commit: 4c0736a76a186e5df2cd2afda3e7a04d2a427d1b
Petr Mladek 729d6a
Patch-mainline: v6.4-rc1
Petr Mladek 729d6a
References: bsc#1211044
Petr Mladek 729d6a
Petr Mladek 729d6a
Rescuers are created when a workqueue with WQ_MEM_RECLAIM is allocated.
Petr Mladek 729d6a
It typically happens during the system boot.
Petr Mladek 729d6a
Petr Mladek 729d6a
systemd switches the root filesystem from initrd to the booted system
Petr Mladek 729d6a
during boot. It kills processes that block the switch for too long.
Petr Mladek 729d6a
One of the process might be modprobe that tries to create a workqueue.
Petr Mladek 729d6a
Petr Mladek 729d6a
These problems are hard to reproduce. Also alloc_workqueue() does not
Petr Mladek 729d6a
pass the error code. Make the debugging easier by printing an error,
Petr Mladek 729d6a
similar to create_worker().
Petr Mladek 729d6a
Petr Mladek 729d6a
Signed-off-by: Petr Mladek <pmladek@suse.com>
Petr Mladek 729d6a
Signed-off-by: Tejun Heo <tj@kernel.org>
Petr Mladek 729d6a
Petr Mladek 729d6a
---
Petr Mladek 729d6a
 kernel/workqueue.c |    7 ++++++-
Petr Mladek 729d6a
 1 file changed, 6 insertions(+), 1 deletion(-)
Petr Mladek 729d6a
Petr Mladek 729d6a
--- a/kernel/workqueue.c
Petr Mladek 729d6a
+++ b/kernel/workqueue.c
Petr Mladek 729d6a
@@ -4074,13 +4074,18 @@ struct workqueue_struct *__alloc_workque
Petr Mladek 729d6a
 		struct worker *rescuer;
Petr Mladek 729d6a
 
Petr Mladek 729d6a
 		rescuer = alloc_worker(NUMA_NO_NODE);
Petr Mladek 729d6a
-		if (!rescuer)
Petr Mladek 729d6a
+		if (!rescuer) {
Petr Mladek 729d6a
+			pr_err("workqueue: Failed to allocate a rescuer for wq \"%s\"\n",
Petr Mladek 729d6a
+			       wq->name);
Petr Mladek 729d6a
 			goto err_destroy;
Petr Mladek 729d6a
+		}
Petr Mladek 729d6a
 
Petr Mladek 729d6a
 		rescuer->rescue_wq = wq;
Petr Mladek 729d6a
 		rescuer->task = kthread_create(rescuer_thread, rescuer, "%s",
Petr Mladek 729d6a
 					       wq->name);
Petr Mladek 729d6a
 		if (IS_ERR(rescuer->task)) {
Petr Mladek 729d6a
+			pr_err("workqueue: Failed to create a rescuer kthread for wq \"%s\": %ld",
Petr Mladek 729d6a
+			       wq->name, PTR_ERR(rescuer->task));
Petr Mladek 729d6a
 			kfree(rescuer);
Petr Mladek 729d6a
 			goto err_destroy;
Petr Mladek 729d6a
 		}