Skip to content

Commit

Permalink
scripts/kallsyms: shrink table before sorting it
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
masahir0y committed Nov 25, 2019
1 parent 21915ec commit 5e5c4fa
Showing 1 changed file with 29 additions and 20 deletions.
49 changes: 29 additions & 20 deletions scripts/kallsyms.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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();
}

Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 5e5c4fa

Please sign in to comment.