mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-29 17:22:07 +00:00
dyndbg: add ddebug_attach_module_classes
Add ddebug_attach_module_classes(), call it from ddebug_add_module(). It scans the classes/section its given, finds records where the module-name matches the module being added, and adds them to the module's maps list. No locking here, since the record isn't yet linked into the ddebug_tables list. It is called indirectly from 2 sources: - from load_module(), where it scans the module's __dyndbg_classes section, which contains DYNAMIC_DEBUG_CLASSES definitions from just the module. - from dynamic_debug_init(), where all DYNAMIC_DEBUG_CLASSES definitions of each builtin module have been packed together. This is why ddebug_attach_module_classes() checks module-name. NOTES Its (highly) likely that builtin classes will be ordered by module name (just like prdbg descriptors are in the __dyndbg section). So the list can be replaced by a vector (ptr + length), which will work for loaded modules too. This would imitate whats currently done for the _ddebug descriptors. That said, converting to vector,len is close to pointless; a small minority of modules will ever define a class-map, and almost all of them will have only 1 or 2 class-maps, so theres only a couple dozen pointers to save. TODO: re-evaluate for lines removable. Signed-off-by: Jim Cromie <jim.cromie@gmail.com> Link: https://lore.kernel.org/r/20220904214134.408619-17-jim.cromie@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
66f4006b6a
commit
c45f67ace8
@ -45,7 +45,7 @@ extern struct ddebug_class_map __start___dyndbg_classes[];
|
||||
extern struct ddebug_class_map __stop___dyndbg_classes[];
|
||||
|
||||
struct ddebug_table {
|
||||
struct list_head link;
|
||||
struct list_head link, maps;
|
||||
const char *mod_name;
|
||||
unsigned int num_ddebugs;
|
||||
struct _ddebug *ddebugs;
|
||||
@ -921,6 +921,32 @@ static const struct proc_ops proc_fops = {
|
||||
.proc_write = ddebug_proc_write
|
||||
};
|
||||
|
||||
static void ddebug_attach_module_classes(struct ddebug_table *dt,
|
||||
struct ddebug_class_map *classes,
|
||||
int num_classes)
|
||||
{
|
||||
struct ddebug_class_map *cm;
|
||||
int i, j, ct = 0;
|
||||
|
||||
for (cm = classes, i = 0; i < num_classes; i++, cm++) {
|
||||
|
||||
if (!strcmp(cm->mod_name, dt->mod_name)) {
|
||||
|
||||
v2pr_info("class[%d]: module:%s base:%d len:%d ty:%d\n", i,
|
||||
cm->mod_name, cm->base, cm->length, cm->map_type);
|
||||
|
||||
for (j = 0; j < cm->length; j++)
|
||||
v3pr_info(" %d: %d %s\n", j + cm->base, j,
|
||||
cm->class_names[j]);
|
||||
|
||||
list_add(&cm->link, &dt->maps);
|
||||
ct++;
|
||||
}
|
||||
}
|
||||
if (ct)
|
||||
vpr_info("module:%s attached %d classes\n", dt->mod_name, ct);
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate a new ddebug_table for the given module
|
||||
* and add it to the global list.
|
||||
@ -952,6 +978,10 @@ static int __ddebug_add_module(struct _ddebug_info *di, unsigned int base,
|
||||
dt->num_ddebugs = di->num_descs;
|
||||
|
||||
INIT_LIST_HEAD(&dt->link);
|
||||
INIT_LIST_HEAD(&dt->maps);
|
||||
|
||||
if (di->classes && di->num_classes)
|
||||
ddebug_attach_module_classes(dt, di->classes, di->num_classes);
|
||||
|
||||
mutex_lock(&ddebug_lock);
|
||||
list_add_tail(&dt->link, &ddebug_tables);
|
||||
|
Loading…
Reference in New Issue
Block a user