[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <B53E6C7F-7FC4-4B4B-9F06-8D7F37B8E0EB@fb.com>
Date: Tue, 6 Aug 2024 19:35:07 +0000
From: Song Liu <songliubraving@...a.com>
To: Steven Rostedt <rostedt@...dmis.org>
CC: Song Liu <song@...nel.org>,
"live-patching@...r.kernel.org"
<live-patching@...r.kernel.org>,
LKML <linux-kernel@...r.kernel.org>,
"linux-trace-kernel@...r.kernel.org" <linux-trace-kernel@...r.kernel.org>,
Josh Poimboeuf <jpoimboe@...nel.org>, Jiri Kosina <jikos@...nel.org>,
Miroslav Benes <mbenes@...e.cz>, Petr Mladek <pmladek@...e.com>,
Joe Lawrence
<joe.lawrence@...hat.com>,
Nathan Chancellor <nathan@...nel.org>,
"morbo@...gle.com" <morbo@...gle.com>,
Justin Stitt <justinstitt@...gle.com>,
Luis Chamberlain <mcgrof@...nel.org>,
Leizhen <thunder.leizhen@...wei.com>,
"kees@...nel.org" <kees@...nel.org>,
Kernel Team <kernel-team@...a.com>,
Matthew Maurer <mmaurer@...gle.com>,
Sami Tolvanen <samitolvanen@...gle.com>,
Masami Hiramatsu <mhiramat@...nel.org>
Subject: Re: [PATCH v2 3/3] tracing/kprobes: Use APIs that matches symbols
without .XXX suffix
Hi Steven,
> On Aug 6, 2024, at 11:44 AM, Steven Rostedt <rostedt@...dmis.org> wrote:
>
> On Fri, 2 Aug 2024 14:08:35 -0700
> Song Liu <song@...nel.org> wrote:
>
>> Use the new kallsyms APIs that matches symbols name with .XXX
>> suffix. This allows userspace tools to get kprobes on the expected
>> function name, while the actual symbol has a .llvm.<hash> suffix.
>>
>> This only effects kernel compile with CONFIG_LTO_CLANG.
>>
>> Signed-off-by: Song Liu <song@...nel.org>
>> ---
>> kernel/kprobes.c | 6 +++++-
>> kernel/trace/trace_kprobe.c | 11 ++++++++++-
>> 2 files changed, 15 insertions(+), 2 deletions(-)
>>
>> diff --git a/kernel/kprobes.c b/kernel/kprobes.c
>> index e85de37d9e1e..99102283b076 100644
>> --- a/kernel/kprobes.c
>> +++ b/kernel/kprobes.c
>> @@ -70,7 +70,11 @@ static DEFINE_PER_CPU(struct kprobe *, kprobe_instance);
>> kprobe_opcode_t * __weak kprobe_lookup_name(const char *name,
>> unsigned int __unused)
>> {
>> - return ((kprobe_opcode_t *)(kallsyms_lookup_name(name)));
>> + unsigned long addr = kallsyms_lookup_name(name);
>> +
>> + if (IS_ENABLED(CONFIG_LTO_CLANG) && !addr)
>> + addr = kallsyms_lookup_name_without_suffix(name);
>> + return ((kprobe_opcode_t *)(addr));
>> }
>>
>> /*
>> diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
>> index 61a6da808203..d2ad0c561c83 100644
>> --- a/kernel/trace/trace_kprobe.c
>> +++ b/kernel/trace/trace_kprobe.c
>> @@ -203,6 +203,10 @@ unsigned long trace_kprobe_address(struct trace_kprobe *tk)
>> if (tk->symbol) {
>> addr = (unsigned long)
>> kallsyms_lookup_name(trace_kprobe_symbol(tk));
>> +
>> + if (IS_ENABLED(CONFIG_LTO_CLANG) && !addr)
>> + addr = kallsyms_lookup_name_without_suffix(trace_kprobe_symbol(tk));
>> +
>
> So you do the lookup twice if this is enabled?
>
> Why not just use "kallsyms_lookup_name_without_suffix()" the entire time,
> and it should work just the same as "kallsyms_lookup_name()" if it's not
> needed?
We still want to give priority to full match. For example, we have:
[root@~]# grep c_next /proc/kallsyms
ffffffff81419dc0 t c_next.llvm.7567888411731313343
ffffffff81680600 t c_next
ffffffff81854380 t c_next.llvm.14337844803752139461
If the goal is to explicitly trace c_next.llvm.7567888411731313343, the
user can provide the full name. If we always match _without_suffix, all
of the 3 will match to the first one.
Does this make sense?
Thanks,
Song
Powered by blists - more mailing lists