mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
Merge tag 'modules-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux
Pull modules updates from Luis Chamberlain: "Tux gets for xmas an improvement to the average lookup performance of kallsyms_lookup_name() by 715x thanks to the work by Zhen Lei, which upgraded our old implementation from being O(n) to O(log(n)), while also retaining the old implementation support on /proc/kallsyms. The only penalty was increasing the memory footprint by 3 * kallsyms_num_syms. Folks who want to improve this further now also have a dedicated selftest facility through KALLSYMS_SELFTEST. Stephen Boyd added zstd in-kernel decompression support, but the only users of this would be folks using the load-pin LSM because otherwise we do module decompression in userspace. The only other thing with mentioning is a minor boot time optimization by Rasmus Villemoes which deferes param_sysfs_init() to late init. The rest is cleanups and minor fixes" * tag 'modules-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux: livepatch: Call klp_match_callback() in klp_find_callback() to avoid code duplication module/decompress: Support zstd in-kernel decompression kallsyms: Remove unneeded semicolon kallsyms: Add self-test facility livepatch: Use kallsyms_on_each_match_symbol() to improve performance kallsyms: Add helper kallsyms_on_each_match_symbol() kallsyms: Reduce the memory occupied by kallsyms_seqs_of_names[] kallsyms: Correctly sequence symbols when CONFIG_LTO_CLANG=y kallsyms: Improve the performance of kallsyms_lookup_name() scripts/kallsyms: rename build_initial_tok_table() module: Fix NULL vs IS_ERR checking for module_get_next_page kernel/params.c: defer most of param_sysfs_init() to late_initcall time module: Remove unused macros module_addr_min/max module: remove redundant module_sysfs_initialized variable
This commit is contained in:
@@ -49,6 +49,7 @@ _Static_assert(
|
||||
struct sym_entry {
|
||||
unsigned long long addr;
|
||||
unsigned int len;
|
||||
unsigned int seq;
|
||||
unsigned int start_pos;
|
||||
unsigned int percpu_absolute;
|
||||
unsigned char sym[];
|
||||
@@ -77,6 +78,7 @@ static unsigned int table_size, table_cnt;
|
||||
static int all_symbols;
|
||||
static int absolute_percpu;
|
||||
static int base_relative;
|
||||
static int lto_clang;
|
||||
|
||||
static int token_profit[0x10000];
|
||||
|
||||
@@ -88,7 +90,7 @@ static unsigned char best_table_len[256];
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "Usage: kallsyms [--all-symbols] [--absolute-percpu] "
|
||||
"[--base-relative] in.map > out.S\n");
|
||||
"[--base-relative] [--lto-clang] in.map > out.S\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -410,6 +412,65 @@ static int symbol_absolute(const struct sym_entry *s)
|
||||
return s->percpu_absolute;
|
||||
}
|
||||
|
||||
static char * s_name(char *buf)
|
||||
{
|
||||
/* Skip the symbol type */
|
||||
return buf + 1;
|
||||
}
|
||||
|
||||
static void cleanup_symbol_name(char *s)
|
||||
{
|
||||
char *p;
|
||||
|
||||
if (!lto_clang)
|
||||
return;
|
||||
|
||||
/*
|
||||
* ASCII[.] = 2e
|
||||
* ASCII[0-9] = 30,39
|
||||
* ASCII[A-Z] = 41,5a
|
||||
* ASCII[_] = 5f
|
||||
* ASCII[a-z] = 61,7a
|
||||
*
|
||||
* As above, replacing '.' with '\0' does not affect the main sorting,
|
||||
* but it helps us with subsorting.
|
||||
*/
|
||||
p = strchr(s, '.');
|
||||
if (p)
|
||||
*p = '\0';
|
||||
}
|
||||
|
||||
static int compare_names(const void *a, const void *b)
|
||||
{
|
||||
int ret;
|
||||
char sa_namebuf[KSYM_NAME_LEN];
|
||||
char sb_namebuf[KSYM_NAME_LEN];
|
||||
const struct sym_entry *sa = *(const struct sym_entry **)a;
|
||||
const struct sym_entry *sb = *(const struct sym_entry **)b;
|
||||
|
||||
expand_symbol(sa->sym, sa->len, sa_namebuf);
|
||||
expand_symbol(sb->sym, sb->len, sb_namebuf);
|
||||
cleanup_symbol_name(s_name(sa_namebuf));
|
||||
cleanup_symbol_name(s_name(sb_namebuf));
|
||||
ret = strcmp(s_name(sa_namebuf), s_name(sb_namebuf));
|
||||
if (!ret) {
|
||||
if (sa->addr > sb->addr)
|
||||
return 1;
|
||||
else if (sa->addr < sb->addr)
|
||||
return -1;
|
||||
|
||||
/* keep old order */
|
||||
return (int)(sa->seq - sb->seq);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void sort_symbols_by_name(void)
|
||||
{
|
||||
qsort(table, table_cnt, sizeof(table[0]), compare_names);
|
||||
}
|
||||
|
||||
static void write_src(void)
|
||||
{
|
||||
unsigned int i, k, off;
|
||||
@@ -495,6 +556,7 @@ static void write_src(void)
|
||||
for (i = 0; i < table_cnt; i++) {
|
||||
if ((i & 0xFF) == 0)
|
||||
markers[i >> 8] = off;
|
||||
table[i]->seq = i;
|
||||
|
||||
/* There cannot be any symbol of length zero. */
|
||||
if (table[i]->len == 0) {
|
||||
@@ -535,6 +597,15 @@ static void write_src(void)
|
||||
|
||||
free(markers);
|
||||
|
||||
sort_symbols_by_name();
|
||||
output_label("kallsyms_seqs_of_names");
|
||||
for (i = 0; i < table_cnt; i++)
|
||||
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");
|
||||
off = 0;
|
||||
for (i = 0; i < 256; i++) {
|
||||
@@ -573,7 +644,7 @@ static void forget_symbol(const unsigned char *symbol, int len)
|
||||
}
|
||||
|
||||
/* do the initial token count */
|
||||
static void build_initial_tok_table(void)
|
||||
static void build_initial_token_table(void)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
@@ -698,7 +769,7 @@ static void insert_real_symbols_in_table(void)
|
||||
|
||||
static void optimize_token_table(void)
|
||||
{
|
||||
build_initial_tok_table();
|
||||
build_initial_token_table();
|
||||
|
||||
insert_real_symbols_in_table();
|
||||
|
||||
@@ -818,6 +889,7 @@ int main(int argc, char **argv)
|
||||
{"all-symbols", no_argument, &all_symbols, 1},
|
||||
{"absolute-percpu", no_argument, &absolute_percpu, 1},
|
||||
{"base-relative", no_argument, &base_relative, 1},
|
||||
{"lto-clang", no_argument, <o_clang, 1},
|
||||
{},
|
||||
};
|
||||
|
||||
|
||||
@@ -156,6 +156,10 @@ kallsyms()
|
||||
kallsymopt="${kallsymopt} --base-relative"
|
||||
fi
|
||||
|
||||
if is_enabled CONFIG_LTO_CLANG; then
|
||||
kallsymopt="${kallsymopt} --lto-clang"
|
||||
fi
|
||||
|
||||
info KSYMS ${2}
|
||||
scripts/kallsyms ${kallsymopt} ${1} > ${2}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user