|
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 |
}
|