workqueue: Interrupted create_worker() is not a repeated event
authorPetr Mladek <pmladek@suse.com>
Tue, 7 Mar 2023 12:53:33 +0000 (13:53 +0100)
committerTejun Heo <tj@kernel.org>
Fri, 17 Mar 2023 22:03:46 +0000 (12:03 -1000)
kthread_create_on_node() might get interrupted(). It is rare but realistic.
For example, when an unbound workqueue is allocated in module_init()
callback. It is done in the context of the "modprobe" process. And,
for example, systemd might kill pending processes when switching root
from initrd to the booted system.

The interrupt is a one-off event and the race might be hard to reproduce.
It is always worth printing.

Signed-off-by: Petr Mladek <pmladek@suse.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
kernel/workqueue.c

index 9760f0f..5f0ecaa 100644 (file)
@@ -1959,8 +1959,13 @@ static struct worker *create_worker(struct worker_pool *pool)
        worker->task = kthread_create_on_node(worker_thread, worker, pool->node,
                                              "kworker/%s", id_buf);
        if (IS_ERR(worker->task)) {
-               pr_err_once("workqueue: Failed to create a worker thread: %pe",
-                           worker->task);
+               if (PTR_ERR(worker->task) == -EINTR) {
+                       pr_err("workqueue: Interrupted when creating a worker thread \"kworker/%s\"\n",
+                              id_buf);
+               } else {
+                       pr_err_once("workqueue: Failed to create a worker thread: %pe",
+                                   worker->task);
+               }
                goto fail;
        }