Restructure code to better integrate future improvements.

This work was supported by a hardware donation from the CE Linux Forum.

Signed-off-by: Alessio Igor Bogani <abog...@kernel.org>
Signed-off-by: Anders Kaseorg <ande...@ksplice.com>
---
 kernel/module.c |   75 ++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 55 insertions(+), 20 deletions(-)

diff --git a/kernel/module.c b/kernel/module.c
index d5938a5..b438b25 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -235,28 +235,28 @@ extern const unsigned long __start___kcrctab_unused_gpl[];
 #define symversion(base, idx) ((base != NULL) ? ((base) + (idx)) : NULL)
 #endif
 
-static bool each_symbol_in_section(const struct symsearch *arr,
-                                  unsigned int arrsize,
-                                  struct module *owner,
-                                  bool (*fn)(const struct symsearch *syms,
-                                             struct module *owner,
-                                             unsigned int symnum, void *data),
-                                  void *data)
+static bool each_symsearch_in_section(const struct symsearch *arr,
+                                     unsigned int arrsize,
+                                     struct module *owner,
+                                     bool (*fn)(const struct symsearch *syms,
+                                                struct module *owner,
+                                                void *data),
+                                     void *data)
 {
-       unsigned int i, j;
+       unsigned int j;
 
        for (j = 0; j < arrsize; j++) {
-               for (i = 0; i < arr[j].stop - arr[j].start; i++)
-                       if (fn(&arr[j], owner, i, data))
-                               return true;
+               if (fn(&arr[j], owner, data))
+                       return true;
        }
 
        return false;
 }
 
 /* Returns true as soon as fn returns true, otherwise false. */
-bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner,
-                           unsigned int symnum, void *data), void *data)
+static bool each_symsearch(bool (*fn)(const struct symsearch *syms,
+                                     struct module *owner, void *data),
+                          void *data)
 {
        struct module *mod;
        static const struct symsearch arr[] = {
@@ -278,7 +278,7 @@ bool each_symbol(bool (*fn)(const struct symsearch *arr, 
struct module *owner,
 #endif
        };
 
-       if (each_symbol_in_section(arr, ARRAY_SIZE(arr), NULL, fn, data))
+       if (each_symsearch_in_section(arr, ARRAY_SIZE(arr), NULL, fn, data))
                return true;
 
        list_for_each_entry_rcu(mod, &modules, list) {
@@ -304,11 +304,39 @@ bool each_symbol(bool (*fn)(const struct symsearch *arr, 
struct module *owner,
 #endif
                };
 
-               if (each_symbol_in_section(arr, ARRAY_SIZE(arr), mod, fn, data))
+               if (each_symsearch_in_section(arr, ARRAY_SIZE(arr), mod, fn,
+                                             data))
                        return true;
        }
        return false;
 }
+
+struct each_symbol_arg {
+       bool (*fn)(const struct symsearch *arr, struct module *owner,
+                  unsigned int symnum, void *data);
+       void *data;
+};
+
+static bool each_symbol_in_symsearch(const struct symsearch *syms,
+                                    struct module *owner, void *data)
+{
+       struct each_symbol_arg *esa = data;
+       unsigned int i;
+
+       for (i = 0; i < syms->stop - syms->start; i++) {
+               if (esa->fn(syms, owner, i, esa->data))
+                       return true;
+       }
+       return false;
+}
+
+/* Returns true as soon as fn returns true, otherwise false. */
+bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner,
+                           unsigned int symnum, void *data), void *data)
+{
+       struct each_symbol_arg esa = {fn, data};
+       return each_symsearch(each_symbol_in_symsearch, &esa);
+}
 EXPORT_SYMBOL_GPL(each_symbol);
 
 struct find_symbol_arg {
@@ -323,13 +351,20 @@ struct find_symbol_arg {
        const struct kernel_symbol *sym;
 };
 
-static bool find_symbol_in_section(const struct symsearch *syms,
-                                  struct module *owner,
-                                  unsigned int symnum, void *data)
+static bool find_symbol_in_symsearch(const struct symsearch *syms,
+                                    struct module *owner,
+                                    void *data)
 {
        struct find_symbol_arg *fsa = data;
+       unsigned int symnum;
+       int result;
 
-       if (strcmp(syms->start[symnum].name, fsa->name) != 0)
+       for (symnum = 0; symnum < syms->stop - syms->start; symnum++) {
+               result = strcmp(fsa->name, syms->start[symnum].name);
+               if (result == 0)
+                       break;
+       }
+       if (symnum >= syms->stop - syms->start)
                return false;
 
        if (!fsa->gplok) {
@@ -379,7 +414,7 @@ const struct kernel_symbol *find_symbol(const char *name,
        fsa.gplok = gplok;
        fsa.warn = warn;
 
-       if (each_symbol(find_symbol_in_section, &fsa)) {
+       if (each_symsearch(find_symbol_in_symsearch, &fsa)) {
                if (owner)
                        *owner = fsa.owner;
                if (crc)
-- 
1.7.4.1

--
To unsubscribe from this list: send the line "unsubscribe linux-embedded" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to