On Thu, 15 Oct 2020 22:21:39 -0400 Steven Rostedt <rost...@goodmis.org> wrote:
> On Thu, 15 Oct 2020 18:54:34 -0700 > Linus Torvalds <torva...@linux-foundation.org> wrote: > > > On Thu, Oct 15, 2020 at 10:53 AM Steven Rostedt <rost...@goodmis.org> wrote: > > > > > > Updates for tracing and bootconfig: > > > > Hmm. I haven't verified that this came from you, but it seems likely.. > > Once again my clang build shows something that I don't see in my > > allmodconfig gcc build: > > > > WARNING: modpost: vmlinux.o(.text+0x1e5b06): Section mismatch in > > reference from the function __trace_early_add_events() to the function > > .init.text:__trace_early_add_new_event() > > The function __trace_early_add_events() references > > the function __init __trace_early_add_new_event(). > > This is often because __trace_early_add_events lacks a __init > > annotation or the annotation of __trace_early_add_new_event is wrong. > > > > Hmm? > > > > Linus > > I see the issue, and I wonder if it has to do with optimization, for gcc > not to warn. I also couldn't reproduce it even with CONFIG_DEBUG_SECTION_MISMATCH=y. It seems that the __trace_early_add_new_event() is inlined in __trace_early_add_events(). $ eu-readelf -w kernel/trace/trace_events.o ... [ 1af20] subprogram abbrev: 53 name (strp) "__trace_early_add_new_event" decl_file (data1) trace_events.c (1) decl_line (data2) 2502 decl_column (data1) 1 prototyped (flag_present) yes type (ref4) [ cc] inline (data1) inlined (1) $ gcc -v ... gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) > > The issue is that we have: > > trace_array_create() that can be called at any time. And it has: > > if (trace_instance_dir) { > ret = trace_array_create_dir(tr); > if (ret) > goto out_free_tr; > } else > __trace_early_add_events(tr); > > > Where trace_instance_dir gets set at boot up, and thus the else statement > will never get called after that. > > The __trace_early_add_events() then calls __trace_early_add_new_events() > which is __init. > > I don't know how gcc didn't trigger this and clang does. > > I'll have to think about how to untangle this. Is there some kind of > annotation that makes it show that a path can only be called at boot up and > not later? What happen if we use Peter's static_call() and update it after boot up? Or, we might need to break apart the trace_array_create() and restruct it as __init trace_array_early_create() and trace_array_create(). Thank you, -- Masami Hiramatsu <mhira...@kernel.org>