kallsyms: Reduce the memory occupied by kallsyms_seqs_of_names[]
authorZhen Lei <thunder.leizhen@huawei.com>
Wed, 2 Nov 2022 08:49:16 +0000 (16:49 +0800)
committerLuis Chamberlain <mcgrof@kernel.org>
Sun, 13 Nov 2022 02:47:36 +0000 (18:47 -0800)
kallsyms_seqs_of_names[] records the symbol index sorted by address, the
maximum value in kallsyms_seqs_of_names[] is the number of symbols. And
2^24 = 16777216, which means that three bytes are enough to store the
index. This can help us save (1 * kallsyms_num_syms) bytes of memory.

Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
kernel/kallsyms.c
kernel/kallsyms_internal.h
scripts/kallsyms.c

index ba351df..48f36fd 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);
 }
index a04b7a5..27fabdc 100644 (file)
@@ -26,6 +26,6 @@ extern const char kallsyms_token_table[] __weak;
 extern const u16 kallsyms_token_index[] __weak;
 
 extern const unsigned int kallsyms_markers[] __weak;
-extern const unsigned int kallsyms_seqs_of_names[] __weak;
+extern const u8 kallsyms_seqs_of_names[] __weak;
 
 #endif // LINUX_KALLSYMS_INTERNAL_H_
index 07ecf7e..04e04fb 100644 (file)
@@ -600,7 +600,10 @@ static void write_src(void)
        sort_symbols_by_name();
        output_label("kallsyms_seqs_of_names");
        for (i = 0; i < table_cnt; i++)
-               printf("\t.long\t%u\n", table[i]->seq);
+               printf("\t.byte 0x%02x, 0x%02x, 0x%02x\n",
+                       (unsigned char)(table[i]->seq >> 16),
+                       (unsigned char)(table[i]->seq >> 8),
+                       (unsigned char)(table[i]->seq >> 0));
        printf("\n");
 
        output_label("kallsyms_token_table");