module: Increase readability of module_kallsyms_lookup_name()
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Mon, 13 Jun 2022 06:02:02 +0000 (08:02 +0200)
committerLuis Chamberlain <mcgrof@kernel.org>
Mon, 11 Jul 2022 17:49:14 +0000 (10:49 -0700)
module_kallsyms_lookup_name() has several exit conditions but
can't return immediately due to preempt_disable().

Refactor module_kallsyms_lookup_name() to allow returning from
anywhere, and reduce depth.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
kernel/module/kallsyms.c

index 6a74545..f5c5c91 100644 (file)
@@ -457,29 +457,39 @@ unsigned long find_kallsyms_symbol_value(struct module *mod, const char *name)
        return 0;
 }
 
-/* Look for this name: can be of form module:name. */
-unsigned long module_kallsyms_lookup_name(const char *name)
+static unsigned long __module_kallsyms_lookup_name(const char *name)
 {
        struct module *mod;
        char *colon;
-       unsigned long ret = 0;
 
-       /* Don't lock: we're in enough trouble already. */
-       preempt_disable();
        colon = strnchr(name, MODULE_NAME_LEN, ':');
        if (colon) {
                mod = find_module_all(name, colon - name, false);
                if (mod)
-                       ret = find_kallsyms_symbol_value(mod, colon + 1);
-       } else {
-               list_for_each_entry_rcu(mod, &modules, list) {
-                       if (mod->state == MODULE_STATE_UNFORMED)
-                               continue;
-                       ret = find_kallsyms_symbol_value(mod, name);
-                       if (ret)
-                               break;
-               }
+                       return find_kallsyms_symbol_value(mod, colon + 1);
+               return 0;
+       }
+
+       list_for_each_entry_rcu(mod, &modules, list) {
+               unsigned long ret;
+
+               if (mod->state == MODULE_STATE_UNFORMED)
+                       continue;
+               ret = find_kallsyms_symbol_value(mod, name);
+               if (ret)
+                       return ret;
        }
+       return 0;
+}
+
+/* Look for this name: can be of form module:name. */
+unsigned long module_kallsyms_lookup_name(const char *name)
+{
+       unsigned long ret;
+
+       /* Don't lock: we're in enough trouble already. */
+       preempt_disable();
+       ret = __module_kallsyms_lookup_name(name);
        preempt_enable();
        return ret;
 }