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 dd9ac6ad5cb..b7205f67cfa 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; |
