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.
Showing the changes to kernel/workqueue.c (1 of 1 file). Show all
Unified · Split
| @@ -1959,8 +1959,13 @@ static struct worker *create_worker(struct worker_pool *pool) · 1958 unmodified lines | ||
| 1959 | 1959 | worker->task = kthread_create_on_node(worker_thread, worker, pool->node, |
| 1960 | 1960 | "kworker/%s", id_buf); |
| 1961 | 1961 | if (IS_ERR(worker->task)) { |
| 1962 | − pr_err_once("workqueue: Failed to create a worker thread: %pe", | |
| 1963 | − worker->task); | |
| 1962 | + if (PTR_ERR(worker->task) == -EINTR) { | |
| 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 | 1969 | goto fail; |
| 1965 | 1970 | } |
| 1966 | 1971 | |