kallsyms: Reduce the memory occupied by kallsyms_seqs_of_names[]
[linux-block.git] / kernel / kallsyms.c
index ba351dfa109b6acea5b8238d8538140027db41a8..48f36fd7e10b95e10cede557689f17d06acf4461 100644 (file)
@@ -201,6 +201,16 @@ static int compare_symbol_name(const char *name, char *namebuf)
        return ret;
 }
 
+static unsigned int get_symbol_seq(int index)
+{
+       unsigned int i, seq = 0;
+
+       for (i = 0; i < 3; i++)
+               seq = (seq << 8) | kallsyms_seqs_of_names[3 * index + i];
+
+       return seq;
+}
+
 static int kallsyms_lookup_names(const char *name,
                                 unsigned int *start,
                                 unsigned int *end)
@@ -215,7 +225,7 @@ static int kallsyms_lookup_names(const char *name,
 
        while (low <= high) {
                mid = low + (high - low) / 2;
-               seq = kallsyms_seqs_of_names[mid];
+               seq = get_symbol_seq(mid);
                off = get_symbol_offset(seq);
                kallsyms_expand_symbol(off, namebuf, ARRAY_SIZE(namebuf));
                ret = compare_symbol_name(name, namebuf);
@@ -232,7 +242,7 @@ static int kallsyms_lookup_names(const char *name,
 
        low = mid;
        while (low) {
-               seq = kallsyms_seqs_of_names[low - 1];
+               seq = get_symbol_seq(low - 1);
                off = get_symbol_offset(seq);
                kallsyms_expand_symbol(off, namebuf, ARRAY_SIZE(namebuf));
                if (compare_symbol_name(name, namebuf))
@@ -244,7 +254,7 @@ static int kallsyms_lookup_names(const char *name,
        if (end) {
                high = mid;
                while (high < kallsyms_num_syms - 1) {
-                       seq = kallsyms_seqs_of_names[high + 1];
+                       seq = get_symbol_seq(high + 1);
                        off = get_symbol_offset(seq);
                        kallsyms_expand_symbol(off, namebuf, ARRAY_SIZE(namebuf));
                        if (compare_symbol_name(name, namebuf))
@@ -269,7 +279,7 @@ unsigned long kallsyms_lookup_name(const char *name)
 
        ret = kallsyms_lookup_names(name, &i, NULL);
        if (!ret)
-               return kallsyms_sym_address(kallsyms_seqs_of_names[i]);
+               return kallsyms_sym_address(get_symbol_seq(i));
 
        return module_kallsyms_lookup_name(name);
 }