mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 03:11:11 -04:00
Merge tag 'ftrace-v7.1' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace
Pull ftrace update from Steven Rostedt: - Speed up ftrace_lookup_symbols() for single lookups The kallsyms lookup in ftrace_lookup_symbols() does a linear search over each symbol. This is fine when it must match multiple strings, but when there's only a single string being searched for, using a binary search is much more efficient. When a single string is passed in to search, use the binary search method. * tag 'ftrace-v7.1' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace: ftrace: Use kallsyms binary search for single-symbol lookup
This commit is contained in:
@@ -9267,6 +9267,15 @@ static int kallsyms_callback(void *data, const char *name, unsigned long addr)
|
||||
* @addrs array, which needs to be big enough to store at least @cnt
|
||||
* addresses.
|
||||
*
|
||||
* For a single symbol (cnt == 1), uses kallsyms_lookup_name() which
|
||||
* performs an O(log N) binary search via the sorted kallsyms index.
|
||||
* This avoids the full O(N) linear scan over all kernel symbols that
|
||||
* the multi-symbol path requires.
|
||||
*
|
||||
* For multiple symbols, uses a single-pass linear scan via
|
||||
* kallsyms_on_each_symbol() with binary search into the sorted input
|
||||
* array.
|
||||
*
|
||||
* Returns: 0 if all provided symbols are found, -ESRCH otherwise.
|
||||
*/
|
||||
int ftrace_lookup_symbols(const char **sorted_syms, size_t cnt, unsigned long *addrs)
|
||||
@@ -9274,6 +9283,19 @@ int ftrace_lookup_symbols(const char **sorted_syms, size_t cnt, unsigned long *a
|
||||
struct kallsyms_data args;
|
||||
int found_all;
|
||||
|
||||
/* Fast path: single symbol uses O(log N) binary search */
|
||||
if (cnt == 1) {
|
||||
addrs[0] = kallsyms_lookup_name(sorted_syms[0]);
|
||||
if (addrs[0] && ftrace_location(addrs[0]))
|
||||
return 0;
|
||||
/*
|
||||
* Binary lookup can fail for duplicate symbol names
|
||||
* where the first match is not ftrace-instrumented.
|
||||
* Retry with linear scan.
|
||||
*/
|
||||
}
|
||||
|
||||
/* Batch path: single-pass O(N) linear scan */
|
||||
memset(addrs, 0, sizeof(*addrs) * cnt);
|
||||
args.addrs = addrs;
|
||||
args.syms = sorted_syms;
|
||||
|
||||
Reference in New Issue
Block a user