aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Zijlstra <peterz@infradead.org>2017-02-08 09:48:01 -0500
committerJessica Yu <jeyu@redhat.com>2017-02-10 22:21:10 -0500
commit5ff22646d246e23bf8056c63bed6aaf9fd22ed12 (patch)
treea7e60df861e3c92e706b06a407c1f01bdbec2be3
parent1f318a8bafcfba9f0d623f4870c4e890fd22e659 (diff)
module: Optimize search_module_extables()
While looking through the __ex_table stuff I found that we do a linear lookup of the module. Also fix up a comment. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Jessica Yu <jeyu@redhat.com>
-rw-r--r--kernel/module.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/kernel/module.c b/kernel/module.c
index 330f64e7e193..32d0d32abbf6 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -4170,22 +4170,23 @@ const struct exception_table_entry *search_module_extables(unsigned long addr)
4170 struct module *mod; 4170 struct module *mod;
4171 4171
4172 preempt_disable(); 4172 preempt_disable();
4173 list_for_each_entry_rcu(mod, &modules, list) { 4173 mod = __module_address(addr);
4174 if (mod->state == MODULE_STATE_UNFORMED) 4174 if (!mod)
4175 continue; 4175 goto out;
4176 if (mod->num_exentries == 0)
4177 continue;
4178 4176
4179 e = search_extable(mod->extable, 4177 if (!mod->num_exentries)
4180 mod->extable + mod->num_exentries - 1, 4178 goto out;
4181 addr); 4179
4182 if (e) 4180 e = search_extable(mod->extable,
4183 break; 4181 mod->extable + mod->num_exentries - 1,
4184 } 4182 addr);
4183out:
4185 preempt_enable(); 4184 preempt_enable();
4186 4185
4187 /* Now, if we found one, we are running inside it now, hence 4186 /*
4188 we cannot unload the module, hence no refcnt needed. */ 4187 * Now, if we found one, we are running inside it now, hence
4188 * we cannot unload the module, hence no refcnt needed.
4189 */
4189 return e; 4190 return e;
4190} 4191}
4191 4192