• Zhen Lei's avatar
    kallsyms: Improve the performance of kallsyms_lookup_name() · 60443c88
    Zhen Lei authored
    Currently, to search for a symbol, we need to expand the symbols in
    'kallsyms_names' one by one, and then use the expanded string for
    comparison. It's O(n).
    
    If we sort names in ascending order like addresses, we can also use
    binary search. It's O(log(n)).
    
    In order not to change the implementation of "/proc/kallsyms", the table
    kallsyms_names[] is still stored in a one-to-one correspondence with the
    address in ascending order.
    
    Add array kallsyms_seqs_of_names[], it's indexed by the sequence number
    of the sorted names, and the corresponding content is the sequence number
    of the sorted addresses. For example:
    Assume that the index of NameX in array kallsyms_seqs_of_names[] is 'i',
    the content of kallsyms_seqs_of_names[i] is 'k', then the corresponding
    address of NameX is kallsyms_addresses[k]. The offset in kallsyms_names[]
    is get_symbol_offset(k).
    
    Note that the memory usage will increase by (4 * kallsyms_num_syms)
    bytes, the next two patches will reduce (1 * kallsyms_num_syms) bytes
    and properly handle the case CONFIG_LTO_CLANG=y.
    
    Performance test results: (x86)
    Before:
    min=234, max=10364402, avg=5206926
    min=267, max=11168517, avg=5207587
    After:
    min=1016, max=90894, avg=7272
    min=1014, max=93470, avg=7293
    
    The average lookup performance of kallsyms_lookup_name() improved 715x.
    Signed-off-by: default avatarZhen Lei <thunder.leizhen@huawei.com>
    Signed-off-by: default avatarLuis Chamberlain <mcgrof@kernel.org>
    60443c88
kallsyms.c 20.4 KB