| From 45a6ca4b10b00f2cab69f6131376053c89bf6e7d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 8 Oct 2020 13:32:20 -0400 |
| Subject: module: statically initialize init section freeing data |
| |
| From: Daniel Jordan <daniel.m.jordan@oracle.com> |
| |
| [ Upstream commit fdf09ab887829cd1b671e45d9549f8ec1ffda0fa ] |
| |
| Corentin hit the following workqueue warning when running with |
| CRYPTO_MANAGER_EXTRA_TESTS: |
| |
| WARNING: CPU: 2 PID: 147 at kernel/workqueue.c:1473 __queue_work+0x3b8/0x3d0 |
| Modules linked in: ghash_generic |
| CPU: 2 PID: 147 Comm: modprobe Not tainted |
| 5.6.0-rc1-next-20200214-00068-g166c9264f0b1-dirty #545 |
| Hardware name: Pine H64 model A (DT) |
| pc : __queue_work+0x3b8/0x3d0 |
| Call trace: |
| __queue_work+0x3b8/0x3d0 |
| queue_work_on+0x6c/0x90 |
| do_init_module+0x188/0x1f0 |
| load_module+0x1d00/0x22b0 |
| |
| I wasn't able to reproduce on x86 or rpi 3b+. |
| |
| This is |
| |
| WARN_ON(!list_empty(&work->entry)) |
| |
| from __queue_work(), and it happens because the init_free_wq work item |
| isn't initialized in time for a crypto test that requests the gcm |
| module. Some crypto tests were recently moved earlier in boot as |
| explained in commit c4741b230597 ("crypto: run initcalls for generic |
| implementations earlier"), which went into mainline less than two weeks |
| before the Fixes commit. |
| |
| Avoid the warning by statically initializing init_free_wq and the |
| corresponding llist. |
| |
| Link: https://lore.kernel.org/lkml/20200217204803.GA13479@Red/ |
| Fixes: 1a7b7d922081 ("modules: Use vmalloc special flag") |
| Reported-by: Corentin Labbe <clabbe.montjoie@gmail.com> |
| Tested-by: Corentin Labbe <clabbe.montjoie@gmail.com> |
| Tested-on: sun50i-h6-pine-h64 |
| Tested-on: imx8mn-ddr4-evk |
| Tested-on: sun50i-a64-bananapi-m64 |
| Reviewed-by: Eric Biggers <ebiggers@google.com> |
| Signed-off-by: Daniel Jordan <daniel.m.jordan@oracle.com> |
| Signed-off-by: Jessica Yu <jeyu@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/module.c | 13 +++---------- |
| 1 file changed, 3 insertions(+), 10 deletions(-) |
| |
| diff --git a/kernel/module.c b/kernel/module.c |
| index 1c5cff34d9f28..8486123ffd7af 100644 |
| --- a/kernel/module.c |
| +++ b/kernel/module.c |
| @@ -91,8 +91,9 @@ EXPORT_SYMBOL_GPL(module_mutex); |
| static LIST_HEAD(modules); |
| |
| /* Work queue for freeing init sections in success case */ |
| -static struct work_struct init_free_wq; |
| -static struct llist_head init_free_list; |
| +static void do_free_init(struct work_struct *w); |
| +static DECLARE_WORK(init_free_wq, do_free_init); |
| +static LLIST_HEAD(init_free_list); |
| |
| #ifdef CONFIG_MODULES_TREE_LOOKUP |
| |
| @@ -3579,14 +3580,6 @@ static void do_free_init(struct work_struct *w) |
| } |
| } |
| |
| -static int __init modules_wq_init(void) |
| -{ |
| - INIT_WORK(&init_free_wq, do_free_init); |
| - init_llist_head(&init_free_list); |
| - return 0; |
| -} |
| -module_init(modules_wq_init); |
| - |
| /* |
| * This is where the real work happens. |
| * |
| -- |
| 2.25.1 |
| |