dyndbg: gather __dyndbg[] state into struct _ddebug_info
This new struct composes the linker provided (vector,len) section, and provides a place to add other __dyndbg[] state-data later: descs - the vector of descriptors in __dyndbg section. num_descs - length of the data/section. Use it, in several different ways, as follows: In lib/dynamic_debug.c: ddebug_add_module(): Alter params-list, replacing 2 args (array,index) with a struct _ddebug_info * containing them both, with room for expansion. This helps future-proof the function prototype against the looming addition of class-map info into the dyndbg-state, by providing a place to add more member fields later. NB: later add static struct _ddebug_info builtins_state declaration, not needed yet. ddebug_add_module() is called in 2 contexts: In dynamic_debug_init(), declare, init a struct _ddebug_info di auto-var to use as a cursor. Then iterate over the prdbg blocks of the builtin modules, and update the di cursor before calling _add_module for each. Its called from kernel/module/main.c:load_info() for each loaded module: In internal.h, alter struct load_info, replacing the dyndbg array,len fields with an embedded _ddebug_info containing them both; and populate its members in find_module_sections(). The 2 calling contexts differ in that _init deals with contiguous subranges of __dyndbgs[] section, packed together, while loadable modules are added one at a time. So rename ddebug_add_module() into outer/__inner fns, call __inner from _init, and provide the offset into the builtin __dyndbgs[] where the module's prdbgs reside. The cursor provides start, len of the subrange for each. The offset will be used later to pack the results of builtin __dyndbg_sites[] de-duplication, and is 0 and unneeded for loadable modules, Note: kernel/module/main.c includes <dynamic_debug.h> for struct _ddeubg_info. This might be prone to include loops, since its also included by printk.h. Nothing has broken in robot-land on this. cc: Luis Chamberlain <mcgrof@kernel.org> Signed-off-by: Jim Cromie <jim.cromie@gmail.com> Link: https://lore.kernel.org/r/20220904214134.408619-12-jim.cromie@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
aa86a15453
commit
b7b4eebdba
4 changed files with 50 additions and 25 deletions
|
|
@ -53,6 +53,7 @@ extern const struct kernel_symbol __stop___ksymtab_gpl[];
|
|||
extern const s32 __start___kcrctab[];
|
||||
extern const s32 __start___kcrctab_gpl[];
|
||||
|
||||
#include <linux/dynamic_debug.h>
|
||||
struct load_info {
|
||||
const char *name;
|
||||
/* pointer to module in temporary copy, freed at end of load_module() */
|
||||
|
|
@ -62,8 +63,7 @@ struct load_info {
|
|||
Elf_Shdr *sechdrs;
|
||||
char *secstrings, *strtab;
|
||||
unsigned long symoffs, stroffs, init_typeoffs, core_typeoffs;
|
||||
struct _ddebug *debug;
|
||||
unsigned int num_debug;
|
||||
struct _ddebug_info dyndbg;
|
||||
bool sig_ok;
|
||||
#ifdef CONFIG_KALLSYMS
|
||||
unsigned long mod_kallsyms_init_off;
|
||||
|
|
|
|||
|
|
@ -1598,16 +1598,16 @@ static void free_modinfo(struct module *mod)
|
|||
}
|
||||
}
|
||||
|
||||
static void dynamic_debug_setup(struct module *mod, struct _ddebug *debug, unsigned int num)
|
||||
static void dynamic_debug_setup(struct module *mod, struct _ddebug_info *dyndbg)
|
||||
{
|
||||
if (!debug)
|
||||
if (!dyndbg->num_descs)
|
||||
return;
|
||||
ddebug_add_module(debug, num, mod->name);
|
||||
ddebug_add_module(dyndbg, mod->name);
|
||||
}
|
||||
|
||||
static void dynamic_debug_remove(struct module *mod, struct _ddebug *debug)
|
||||
static void dynamic_debug_remove(struct module *mod, struct _ddebug_info *dyndbg)
|
||||
{
|
||||
if (debug)
|
||||
if (dyndbg->num_descs)
|
||||
ddebug_remove_module(mod->name);
|
||||
}
|
||||
|
||||
|
|
@ -2111,8 +2111,8 @@ static int find_module_sections(struct module *mod, struct load_info *info)
|
|||
if (section_addr(info, "__obsparm"))
|
||||
pr_warn("%s: Ignoring obsolete parameters\n", mod->name);
|
||||
|
||||
info->debug = section_objs(info, "__dyndbg",
|
||||
sizeof(*info->debug), &info->num_debug);
|
||||
info->dyndbg.descs = section_objs(info, "__dyndbg",
|
||||
sizeof(*info->dyndbg.descs), &info->dyndbg.num_descs);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -2807,7 +2807,7 @@ static int load_module(struct load_info *info, const char __user *uargs,
|
|||
}
|
||||
|
||||
init_build_id(mod, info);
|
||||
dynamic_debug_setup(mod, info->debug, info->num_debug);
|
||||
dynamic_debug_setup(mod, &info->dyndbg);
|
||||
|
||||
/* Ftrace init must be called in the MODULE_STATE_UNFORMED state */
|
||||
ftrace_module_init(mod);
|
||||
|
|
@ -2871,7 +2871,7 @@ static int load_module(struct load_info *info, const char __user *uargs,
|
|||
|
||||
ddebug_cleanup:
|
||||
ftrace_release_mod(mod);
|
||||
dynamic_debug_remove(mod, info->debug);
|
||||
dynamic_debug_remove(mod, &info->dyndbg);
|
||||
synchronize_rcu();
|
||||
kfree(mod->args);
|
||||
free_arch_cleanup:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue