Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

module: Use RCU in module_get_kallsym().

The modules list and module::kallsyms can be accessed under RCU
assumption.

Iterate the modules with RCU protection, use rcu_dereference() to access
the kallsyms pointer.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20250108090457.512198-6-bigeasy@linutronix.de
Signed-off-by: Petr Pavlu <petr.pavlu@suse.com>

authored by

Sebastian Andrzej Siewior and committed by
Petr Pavlu
c4fadf38 f0136923

+2 -4
+2 -4
kernel/module/kallsyms.c
··· 381 381 { 382 382 struct module *mod; 383 383 384 - preempt_disable(); 384 + guard(rcu)(); 385 385 list_for_each_entry_rcu(mod, &modules, list) { 386 386 struct mod_kallsyms *kallsyms; 387 387 388 388 if (mod->state == MODULE_STATE_UNFORMED) 389 389 continue; 390 - kallsyms = rcu_dereference_sched(mod->kallsyms); 390 + kallsyms = rcu_dereference(mod->kallsyms); 391 391 if (symnum < kallsyms->num_symtab) { 392 392 const Elf_Sym *sym = &kallsyms->symtab[symnum]; 393 393 ··· 396 396 strscpy(name, kallsyms_symbol_name(kallsyms, symnum), KSYM_NAME_LEN); 397 397 strscpy(module_name, mod->name, MODULE_NAME_LEN); 398 398 *exported = is_exported(name, *value, mod); 399 - preempt_enable(); 400 399 return 0; 401 400 } 402 401 symnum -= kallsyms->num_symtab; 403 402 } 404 - preempt_enable(); 405 403 return -ERANGE; 406 404 } 407 405