scripts/kallsyms: shrink table before sorting it
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Sat, 23 Nov 2019 16:04:31 +0000 (01:04 +0900)
committerMasahiro Yamada <yamada.masahiro@socionext.com>
Mon, 25 Nov 2019 12:01:14 +0000 (21:01 +0900)
Currently, build_initial_tok_table() trims unused symbols, but it is
called after sort_symbols().

It is not efficient to sort the huge table that contains unused entries.
Shrink the table before sorting it.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
scripts/kallsyms.c

index 7964187..de986ed 100644 (file)
@@ -268,6 +268,30 @@ static int symbol_valid(struct sym_entry *s)
        return 1;
 }
 
+/* remove all the invalid symbols from the table */
+static void shrink_table(void)
+{
+       unsigned int i, pos;
+
+       pos = 0;
+       for (i = 0; i < table_cnt; i++) {
+               if (symbol_valid(&table[i])) {
+                       if (pos != i)
+                               table[pos] = table[i];
+                       pos++;
+               } else {
+                       free(table[i].sym);
+               }
+       }
+       table_cnt = pos;
+
+       /* When valid symbol is not registered, exit to error */
+       if (!table_cnt) {
+               fprintf(stderr, "No valid symbol.\n");
+               exit(1);
+       }
+}
+
 static void read_map(FILE *in)
 {
        while (!feof(in)) {
@@ -475,23 +499,13 @@ static void forget_symbol(unsigned char *symbol, int len)
                token_profit[ symbol[i] + (symbol[i + 1] << 8) ]--;
 }
 
-/* remove all the invalid symbols from the table and do the initial token count */
+/* do the initial token count */
 static void build_initial_tok_table(void)
 {
-       unsigned int i, pos;
+       unsigned int i;
 
-       pos = 0;
-       for (i = 0; i < table_cnt; i++) {
-               if ( symbol_valid(&table[i]) ) {
-                       if (pos != i)
-                               table[pos] = table[i];
-                       learn_symbol(table[pos].sym, table[pos].len);
-                       pos++;
-               } else {
-                       free(table[i].sym);
-               }
-       }
-       table_cnt = pos;
+       for (i = 0; i < table_cnt; i++)
+               learn_symbol(table[i].sym, table[i].len);
 }
 
 static void *find_token(unsigned char *str, int len, unsigned char *token)
@@ -614,12 +628,6 @@ static void optimize_token_table(void)
 
        insert_real_symbols_in_table();
 
-       /* When valid symbol is not registered, exit to error */
-       if (!table_cnt) {
-               fprintf(stderr, "No valid symbol.\n");
-               exit(1);
-       }
-
        optimize_result();
 }
 
@@ -756,6 +764,7 @@ int main(int argc, char **argv)
                usage();
 
        read_map(stdin);
+       shrink_table();
        if (absolute_percpu)
                make_percpus_absolute();
        if (base_relative)