diff options
Diffstat (limited to 'lib/dynamic_debug.c')
-rw-r--r-- | lib/dynamic_debug.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index dbf2b457e47e..7bdf98c37e91 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c | |||
@@ -847,17 +847,19 @@ int ddebug_add_module(struct _ddebug *tab, unsigned int n, | |||
847 | const char *name) | 847 | const char *name) |
848 | { | 848 | { |
849 | struct ddebug_table *dt; | 849 | struct ddebug_table *dt; |
850 | const char *new_name; | ||
851 | 850 | ||
852 | dt = kzalloc(sizeof(*dt), GFP_KERNEL); | 851 | dt = kzalloc(sizeof(*dt), GFP_KERNEL); |
853 | if (dt == NULL) | 852 | if (dt == NULL) { |
854 | return -ENOMEM; | 853 | pr_err("error adding module: %s\n", name); |
855 | new_name = kstrdup_const(name, GFP_KERNEL); | ||
856 | if (new_name == NULL) { | ||
857 | kfree(dt); | ||
858 | return -ENOMEM; | 854 | return -ENOMEM; |
859 | } | 855 | } |
860 | dt->mod_name = new_name; | 856 | /* |
857 | * For built-in modules, name lives in .rodata and is | ||
858 | * immortal. For loaded modules, name points at the name[] | ||
859 | * member of struct module, which lives at least as long as | ||
860 | * this struct ddebug_table. | ||
861 | */ | ||
862 | dt->mod_name = name; | ||
861 | dt->num_ddebugs = n; | 863 | dt->num_ddebugs = n; |
862 | dt->ddebugs = tab; | 864 | dt->ddebugs = tab; |
863 | 865 | ||
@@ -868,7 +870,6 @@ int ddebug_add_module(struct _ddebug *tab, unsigned int n, | |||
868 | vpr_info("%u debug prints in module %s\n", n, dt->mod_name); | 870 | vpr_info("%u debug prints in module %s\n", n, dt->mod_name); |
869 | return 0; | 871 | return 0; |
870 | } | 872 | } |
871 | EXPORT_SYMBOL_GPL(ddebug_add_module); | ||
872 | 873 | ||
873 | /* helper for ddebug_dyndbg_(boot|module)_param_cb */ | 874 | /* helper for ddebug_dyndbg_(boot|module)_param_cb */ |
874 | static int ddebug_dyndbg_param_cb(char *param, char *val, | 875 | static int ddebug_dyndbg_param_cb(char *param, char *val, |
@@ -913,7 +914,6 @@ int ddebug_dyndbg_module_param_cb(char *param, char *val, const char *module) | |||
913 | static void ddebug_table_free(struct ddebug_table *dt) | 914 | static void ddebug_table_free(struct ddebug_table *dt) |
914 | { | 915 | { |
915 | list_del_init(&dt->link); | 916 | list_del_init(&dt->link); |
916 | kfree_const(dt->mod_name); | ||
917 | kfree(dt); | 917 | kfree(dt); |
918 | } | 918 | } |
919 | 919 | ||
@@ -930,15 +930,15 @@ int ddebug_remove_module(const char *mod_name) | |||
930 | 930 | ||
931 | mutex_lock(&ddebug_lock); | 931 | mutex_lock(&ddebug_lock); |
932 | list_for_each_entry_safe(dt, nextdt, &ddebug_tables, link) { | 932 | list_for_each_entry_safe(dt, nextdt, &ddebug_tables, link) { |
933 | if (!strcmp(dt->mod_name, mod_name)) { | 933 | if (dt->mod_name == mod_name) { |
934 | ddebug_table_free(dt); | 934 | ddebug_table_free(dt); |
935 | ret = 0; | 935 | ret = 0; |
936 | break; | ||
936 | } | 937 | } |
937 | } | 938 | } |
938 | mutex_unlock(&ddebug_lock); | 939 | mutex_unlock(&ddebug_lock); |
939 | return ret; | 940 | return ret; |
940 | } | 941 | } |
941 | EXPORT_SYMBOL_GPL(ddebug_remove_module); | ||
942 | 942 | ||
943 | static void ddebug_remove_all_tables(void) | 943 | static void ddebug_remove_all_tables(void) |
944 | { | 944 | { |