diff options
Diffstat (limited to 'kernel/module.c')
-rw-r--r-- | kernel/module.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/kernel/module.c b/kernel/module.c index 281172f01e9a..35e1b1f859d7 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -1121,6 +1121,9 @@ static void free_module(struct module *mod) | |||
1121 | if (mod->percpu) | 1121 | if (mod->percpu) |
1122 | percpu_modfree(mod->percpu); | 1122 | percpu_modfree(mod->percpu); |
1123 | 1123 | ||
1124 | /* Free lock-classes: */ | ||
1125 | lockdep_free_key_range(mod->module_core, mod->core_size); | ||
1126 | |||
1124 | /* Finally, free the core (containing the module structure) */ | 1127 | /* Finally, free the core (containing the module structure) */ |
1125 | module_free(mod, mod->module_core); | 1128 | module_free(mod, mod->module_core); |
1126 | } | 1129 | } |
@@ -2159,6 +2162,29 @@ const struct exception_table_entry *search_module_extables(unsigned long addr) | |||
2159 | return e; | 2162 | return e; |
2160 | } | 2163 | } |
2161 | 2164 | ||
2165 | /* | ||
2166 | * Is this a valid module address? | ||
2167 | */ | ||
2168 | int is_module_address(unsigned long addr) | ||
2169 | { | ||
2170 | unsigned long flags; | ||
2171 | struct module *mod; | ||
2172 | |||
2173 | spin_lock_irqsave(&modlist_lock, flags); | ||
2174 | |||
2175 | list_for_each_entry(mod, &modules, list) { | ||
2176 | if (within(addr, mod->module_core, mod->core_size)) { | ||
2177 | spin_unlock_irqrestore(&modlist_lock, flags); | ||
2178 | return 1; | ||
2179 | } | ||
2180 | } | ||
2181 | |||
2182 | spin_unlock_irqrestore(&modlist_lock, flags); | ||
2183 | |||
2184 | return 0; | ||
2185 | } | ||
2186 | |||
2187 | |||
2162 | /* Is this a valid kernel address? We don't grab the lock: we are oopsing. */ | 2188 | /* Is this a valid kernel address? We don't grab the lock: we are oopsing. */ |
2163 | struct module *__module_text_address(unsigned long addr) | 2189 | struct module *__module_text_address(unsigned long addr) |
2164 | { | 2190 | { |