diff options
Diffstat (limited to 'kernel/module.c')
-rw-r--r-- | kernel/module.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/kernel/module.c b/kernel/module.c index dd9ac6ad5cb9..b7205f67cfaf 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -784,6 +784,7 @@ sys_delete_module(const char __user *name_user, unsigned int flags) | |||
784 | mutex_lock(&module_mutex); | 784 | mutex_lock(&module_mutex); |
785 | /* Store the name of the last unloaded module for diagnostic purposes */ | 785 | /* Store the name of the last unloaded module for diagnostic purposes */ |
786 | strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module)); | 786 | strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module)); |
787 | unregister_dynamic_debug_module(mod->name); | ||
787 | free_module(mod); | 788 | free_module(mod); |
788 | 789 | ||
789 | out: | 790 | out: |
@@ -1173,7 +1174,7 @@ static void free_notes_attrs(struct module_notes_attrs *notes_attrs, | |||
1173 | while (i-- > 0) | 1174 | while (i-- > 0) |
1174 | sysfs_remove_bin_file(notes_attrs->dir, | 1175 | sysfs_remove_bin_file(notes_attrs->dir, |
1175 | ¬es_attrs->attrs[i]); | 1176 | ¬es_attrs->attrs[i]); |
1176 | kobject_del(notes_attrs->dir); | 1177 | kobject_put(notes_attrs->dir); |
1177 | } | 1178 | } |
1178 | kfree(notes_attrs); | 1179 | kfree(notes_attrs); |
1179 | } | 1180 | } |
@@ -1783,6 +1784,33 @@ static inline void add_kallsyms(struct module *mod, | |||
1783 | } | 1784 | } |
1784 | #endif /* CONFIG_KALLSYMS */ | 1785 | #endif /* CONFIG_KALLSYMS */ |
1785 | 1786 | ||
1787 | #ifdef CONFIG_DYNAMIC_PRINTK_DEBUG | ||
1788 | static void dynamic_printk_setup(Elf_Shdr *sechdrs, unsigned int verboseindex) | ||
1789 | { | ||
1790 | struct mod_debug *debug_info; | ||
1791 | unsigned long pos, end; | ||
1792 | unsigned int num_verbose; | ||
1793 | |||
1794 | pos = sechdrs[verboseindex].sh_addr; | ||
1795 | num_verbose = sechdrs[verboseindex].sh_size / | ||
1796 | sizeof(struct mod_debug); | ||
1797 | end = pos + (num_verbose * sizeof(struct mod_debug)); | ||
1798 | |||
1799 | for (; pos < end; pos += sizeof(struct mod_debug)) { | ||
1800 | debug_info = (struct mod_debug *)pos; | ||
1801 | register_dynamic_debug_module(debug_info->modname, | ||
1802 | debug_info->type, debug_info->logical_modname, | ||
1803 | debug_info->flag_names, debug_info->hash, | ||
1804 | debug_info->hash2); | ||
1805 | } | ||
1806 | } | ||
1807 | #else | ||
1808 | static inline void dynamic_printk_setup(Elf_Shdr *sechdrs, | ||
1809 | unsigned int verboseindex) | ||
1810 | { | ||
1811 | } | ||
1812 | #endif /* CONFIG_DYNAMIC_PRINTK_DEBUG */ | ||
1813 | |||
1786 | static void *module_alloc_update_bounds(unsigned long size) | 1814 | static void *module_alloc_update_bounds(unsigned long size) |
1787 | { | 1815 | { |
1788 | void *ret = module_alloc(size); | 1816 | void *ret = module_alloc(size); |
@@ -1831,6 +1859,7 @@ static noinline struct module *load_module(void __user *umod, | |||
1831 | #endif | 1859 | #endif |
1832 | unsigned int markersindex; | 1860 | unsigned int markersindex; |
1833 | unsigned int markersstringsindex; | 1861 | unsigned int markersstringsindex; |
1862 | unsigned int verboseindex; | ||
1834 | struct module *mod; | 1863 | struct module *mod; |
1835 | long err = 0; | 1864 | long err = 0; |
1836 | void *percpu = NULL, *ptr = NULL; /* Stops spurious gcc warning */ | 1865 | void *percpu = NULL, *ptr = NULL; /* Stops spurious gcc warning */ |
@@ -2117,6 +2146,7 @@ static noinline struct module *load_module(void __user *umod, | |||
2117 | markersindex = find_sec(hdr, sechdrs, secstrings, "__markers"); | 2146 | markersindex = find_sec(hdr, sechdrs, secstrings, "__markers"); |
2118 | markersstringsindex = find_sec(hdr, sechdrs, secstrings, | 2147 | markersstringsindex = find_sec(hdr, sechdrs, secstrings, |
2119 | "__markers_strings"); | 2148 | "__markers_strings"); |
2149 | verboseindex = find_sec(hdr, sechdrs, secstrings, "__verbose"); | ||
2120 | 2150 | ||
2121 | /* Now do relocations. */ | 2151 | /* Now do relocations. */ |
2122 | for (i = 1; i < hdr->e_shnum; i++) { | 2152 | for (i = 1; i < hdr->e_shnum; i++) { |
@@ -2167,6 +2197,7 @@ static noinline struct module *load_module(void __user *umod, | |||
2167 | marker_update_probe_range(mod->markers, | 2197 | marker_update_probe_range(mod->markers, |
2168 | mod->markers + mod->num_markers); | 2198 | mod->markers + mod->num_markers); |
2169 | #endif | 2199 | #endif |
2200 | dynamic_printk_setup(sechdrs, verboseindex); | ||
2170 | err = module_finalize(hdr, sechdrs, mod); | 2201 | err = module_finalize(hdr, sechdrs, mod); |
2171 | if (err < 0) | 2202 | if (err < 0) |
2172 | goto cleanup; | 2203 | goto cleanup; |