Le 07/03/2022 à 18:47, Aaron Tomlin a écrit : > No functional change. > > This patch migrates the kdb 'lsmod' command support out of main > kdb code into its own file under kernel/module. In addition to > the above, a minor style warning i.e. missing a blank line after > declarations, was resolved too. The new file was added to > MAINTAINERS. > > Signed-off-by: Aaron Tomlin <atomlin@xxxxxxxxxx> > --- > MAINTAINERS | 1 + > include/linux/kdb.h | 1 + > kernel/debug/kdb/kdb_main.c | 49 --------------------------------- > kernel/module/Makefile | 1 + > kernel/module/kdb.c | 55 +++++++++++++++++++++++++++++++++++++ > kernel/module/main.c | 4 --- > 6 files changed, 58 insertions(+), 53 deletions(-) > create mode 100644 kernel/module/kdb.c > > diff --git a/MAINTAINERS b/MAINTAINERS > index 195cf1ac2ee8..40c717f93c1a 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -10689,6 +10689,7 @@ F: drivers/tty/serial/kgdboc.c > F: include/linux/kdb.h > F: include/linux/kgdb.h > F: kernel/debug/ > +F: kernel/module/kdb.c > > KHADAS MCU MFD DRIVER > M: Neil Armstrong <narmstrong@xxxxxxxxxxxx> > diff --git a/include/linux/kdb.h b/include/linux/kdb.h > index ea0f5e580fac..07dfb6a20a1c 100644 > --- a/include/linux/kdb.h > +++ b/include/linux/kdb.h > @@ -222,5 +222,6 @@ enum { > > extern int kdbgetintenv(const char *, int *); > extern int kdb_set(int, const char **); > +int kdb_lsmod(int argc, const char **argv); > > #endif /* !_KDB_H */ > diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c > index 0852a537dad4..f3a30cd5037f 100644 > --- a/kernel/debug/kdb/kdb_main.c > +++ b/kernel/debug/kdb/kdb_main.c > @@ -26,7 +26,6 @@ > #include <linux/utsname.h> > #include <linux/vmalloc.h> > #include <linux/atomic.h> > -#include <linux/module.h> > #include <linux/moduleparam.h> > #include <linux/mm.h> > #include <linux/init.h> No need of linux/module.h here anymore ? In that case, I see several other files in kernel/debug/kdb/ that include linux/module.h Should it be removed in those files as well ? > diff --git a/kernel/module/Makefile b/kernel/module/Makefile > index cf8dcdc6b55f..88f5cdcdb067 100644 > --- a/kernel/module/Makefile > +++ b/kernel/module/Makefile > @@ -17,3 +17,4 @@ obj-$(CONFIG_DEBUG_KMEMLEAK) += debug_kmemleak.o > obj-$(CONFIG_KALLSYMS) += kallsyms.o > obj-$(CONFIG_PROC_FS) += procfs.o > obj-$(CONFIG_SYSFS) += sysfs.o > +obj-$(CONFIG_KGDB_KDB) += kdb.o > diff --git a/kernel/module/kdb.c b/kernel/module/kdb.c > new file mode 100644 > index 000000000000..60baeebea3e0 > --- /dev/null > +++ b/kernel/module/kdb.c > @@ -0,0 +1,55 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Module kdb support > + * > + * Copyright (C) 2010 Jason Wessel > + */ > + > +#include <linux/module.h> > +#include <linux/kdb.h> > +#include "internal.h" > + > +/* > + * kdb_lsmod - This function implements the 'lsmod' command. Lists > + * currently loaded kernel modules. > + * Mostly taken from userland lsmod. > + */ > +int kdb_lsmod(int argc, const char **argv) > +{ > + struct module *mod; > + > + if (argc != 0) > + return KDB_ARGCOUNT; > + > + kdb_printf("Module Size modstruct Used by\n"); > + list_for_each_entry(mod, &modules, list) { > + if (mod->state == MODULE_STATE_UNFORMED) > + continue; > + > + kdb_printf("%-20s%8u 0x%px ", mod->name, > + mod->core_layout.size, (void *)mod); > +#ifdef CONFIG_MODULE_UNLOAD > + kdb_printf("%4d ", module_refcount(mod)); > +#endif > + if (mod->state == MODULE_STATE_GOING) > + kdb_printf(" (Unloading)"); > + else if (mod->state == MODULE_STATE_COMING) > + kdb_printf(" (Loading)"); > + else > + kdb_printf(" (Live)"); > + kdb_printf(" 0x%px", mod->core_layout.base); > + > +#ifdef CONFIG_MODULE_UNLOAD > + { > + struct module_use *use; > + kdb_printf(" [ "); > + list_for_each_entry(use, &mod->source_list, > + source_list) > + kdb_printf("%s ", use->target->name); > + kdb_printf("]\n"); > + } > +#endif That's a ugly construct. Could it be a function instead that you call from this loop, Something like: static void lsmod_in_use(struct module *mod) { #ifdef CONFIG_MODULE_UNLOAD struct module_use *use; kdb_printf(" [ "); list_for_each_entry(use, &mod->source_list, source_list) kdb_printf("%s ", use->target->name); kdb_printf("]\n"); #endif } > + } > + > + return 0; > +} > diff --git a/kernel/module/main.c b/kernel/module/main.c > index b8a59b5c3e3a..bcc4f7a82649 100644 > --- a/kernel/module/main.c > +++ b/kernel/module/main.c > @@ -108,10 +108,6 @@ static void mod_update_bounds(struct module *mod) > __mod_update_bounds(mod->init_layout.base, mod->init_layout.size); > } > > -#ifdef CONFIG_KGDB_KDB > -struct list_head *kdb_modules = &modules; /* kdb needs the list of modules */ It should be removed from kernel/debug/kdb/kdb_private.h as well. > -#endif /* CONFIG_KGDB_KDB */ > - > static void module_assert_mutex_or_preempt(void) > { > #ifdef CONFIG_LOCKDEP