Re: WARNING: at kernel/workqueue.c:1473 __queue_work+0x3b8/0x3d0
From: Daniel Jordan <daniel.m.jordan@oracle.com>
Date: 2020-10-05 17:00:22
Also in:
linux-arm-kernel, lkml
Subsystem:
crypto api, the rest · Maintainers:
Herbert Xu, "David S. Miller", Linus Torvalds
On Thu, Oct 01, 2020 at 07:50:22PM +0200, Corentin Labbe wrote:
On Tue, Mar 03, 2020 at 04:30:17PM -0500, Daniel Jordan wrote:quoted
Barring other ideas, Corentin, would you be willing to boot with trace_event=initcall:*,module:* trace_options=stacktrace anddiff --git a/kernel/module.c b/kernel/module.c index 33569a01d6e1..393be6979a27 100644 --- a/kernel/module.c +++ b/kernel/module.c@@ -3604,8 +3604,11 @@ static noinline int do_init_module(struct module *mod) * be cleaned up needs to sync with the queued work - ie * rcu_barrier() */ - if (llist_add(&freeinit->node, &init_free_list)) + if (llist_add(&freeinit->node, &init_free_list)) { + pr_warn("%s: schedule_work for mod=%s\n", __func__, mod->name); + dump_stack(); schedule_work(&init_free_wq); + } mutex_unlock(&module_mutex); wake_up_all(&module_wq);but not my earlier fix and share the dmesg and ftrace output to see if the theory holds? Also, could you attach your config? Curious now what your crypto options look like after fiddling with some of them today while trying and failing to see this on x86. thanks, DanielHello Sorry for the very delayed answer. I fail to reproduce it on x86 (qemu and real hw) and arm. It seems to only happen on arm64.
Thanks for the config and dmesg, but there's no ftrace. I see it's not configured in your kernel, so could you boot with my earlier debug patch plus this one and the kernel argument initcall_debug instead? I'm trying to see whether it really is a request module call from the crypto tests that's triggering this warning. Preeetty likely that's what's happening, but want to be sure since I can't reproduce this. Then I can post the fix.
diff --git a/crypto/algapi.c b/crypto/algapi.c
index fdabf2675b63..0667c6b4588e 100644
--- a/crypto/algapi.c
+++ b/crypto/algapi.c@@ -393,6 +393,10 @@ static void crypto_wait_for_test(struct crypto_larval *larval) { int err; + pr_warn("%s: cra_name %s cra_driver_name %s\n", __func__, + larval->adult->cra_name, larval->adult->cra_driver_name); + dump_stack(); + err = crypto_probing_notify(CRYPTO_MSG_ALG_REGISTER, larval->adult); if (err != NOTIFY_STOP) { if (WARN_ON(err != NOTIFY_DONE))
diff --git a/kernel/kmod.c b/kernel/kmod.c
index 3cd075ce2a1e..46c4645be763 100644
--- a/kernel/kmod.c
+++ b/kernel/kmod.c@@ -166,6 +166,8 @@ int __request_module(bool wait, const char *fmt, ...) } trace_module_request(module_name, wait, _RET_IP_); + pr_warn("%s: %s\n", __func__, module_name); + dump_stack(); ret = call_modprobe(module_name, wait ? UMH_WAIT_PROC : UMH_WAIT_EXEC);