History

workqueue: Interrupted create_worker() is not a repeated event

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.

Petr Mladek committed 3 years ago

Commit 60f54031 parent 3f0ea0b1 file · +7 −2Browse files

Showing the changes to kernel/workqueue.c (1 of 1 file). Show all

Unified · Split

kernel/workqueue.c+7−2
@@ -1959,8 +1959,13 @@ static struct worker *create_worker(struct worker_pool *pool) · 1958 unmodified lines
1959 worker->task = kthread_create_on_node(worker_thread, worker, pool->node,1959 worker->task = kthread_create_on_node(worker_thread, worker, pool->node,
1960 "kworker/%s", id_buf);1960 "kworker/%s", id_buf);
1961 if (IS_ERR(worker->task)) {1961 if (IS_ERR(worker->task)) {
1962 pr_err_once("workqueue: Failed to create a worker thread: %pe",1962 if (PTR_ERR(worker->task) == -EINTR) {
1963 worker->task);1963 pr_err("workqueue: Interrupted when creating a worker thread \"kworker/%s\"\n",
1964 id_buf);
1965 } else {
1966 pr_err_once("workqueue: Failed to create a worker thread: %pe",
1967 worker->task);
1968 }
1964 goto fail;1969 goto fail;
1965 }1970 }
1966 1971