Skip to content

Commit 0c6f18c

Browse files
mhiramatgregkh
authored andcommitted
modules: lockdep: Suppress suspicious RCU usage warning
[ Upstream commit bf08949 ] While running kprobe module test, find_module_all() caused a suspicious RCU usage warning. ----- ============================= WARNING: suspicious RCU usage 5.4.0-next-20191202+ #63 Not tainted ----------------------------- kernel/module.c:619 RCU-list traversed in non-reader section!! other info that might help us debug this: rcu_scheduler_active = 2, debug_locks = 1 1 lock held by rmmod/642: #0: ffffffff8227da80 (module_mutex){+.+.}, at: __x64_sys_delete_module+0x9a/0x230 stack backtrace: CPU: 0 PID: 642 Comm: rmmod Not tainted 5.4.0-next-20191202+ #63 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org 04/01/2014 Call Trace: dump_stack+0x71/0xa0 find_module_all+0xc1/0xd0 __x64_sys_delete_module+0xac/0x230 ? do_syscall_64+0x12/0x1f0 do_syscall_64+0x50/0x1f0 entry_SYSCALL_64_after_hwframe+0x49/0xbe RIP: 0033:0x4b6d49 ----- This is because list_for_each_entry_rcu(modules) is called without rcu_read_lock(). This is safe because the module_mutex is locked. Pass lockdep_is_held(&module_mutex) to the list_for_each_entry_rcu() to suppress this warning, This also fixes similar issue in mod_find() and each_symbol_section(). Signed-off-by: Masami Hiramatsu <[email protected]> Signed-off-by: Jessica Yu <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 358bd73 commit 0c6f18c

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

kernel/module.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,8 @@ static struct module *mod_find(unsigned long addr)
214214
{
215215
struct module *mod;
216216

217-
list_for_each_entry_rcu(mod, &modules, list) {
217+
list_for_each_entry_rcu(mod, &modules, list,
218+
lockdep_is_held(&module_mutex)) {
218219
if (within_module(addr, mod))
219220
return mod;
220221
}
@@ -448,7 +449,8 @@ bool each_symbol_section(bool (*fn)(const struct symsearch *arr,
448449
if (each_symbol_in_section(arr, ARRAY_SIZE(arr), NULL, fn, data))
449450
return true;
450451

451-
list_for_each_entry_rcu(mod, &modules, list) {
452+
list_for_each_entry_rcu(mod, &modules, list,
453+
lockdep_is_held(&module_mutex)) {
452454
struct symsearch arr[] = {
453455
{ mod->syms, mod->syms + mod->num_syms, mod->crcs,
454456
NOT_GPL_ONLY, false },
@@ -616,7 +618,8 @@ static struct module *find_module_all(const char *name, size_t len,
616618

617619
module_assert_mutex_or_preempt();
618620

619-
list_for_each_entry_rcu(mod, &modules, list) {
621+
list_for_each_entry_rcu(mod, &modules, list,
622+
lockdep_is_held(&module_mutex)) {
620623
if (!even_unformed && mod->state == MODULE_STATE_UNFORMED)
621624
continue;
622625
if (strlen(mod->name) == len && !memcmp(mod->name, name, len))

0 commit comments

Comments
 (0)