From: Michael Wu <michael@allwinnertech.com>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org
Subject: Re: [PATCH v5] tracing: Fix race between update_event_fields and, event_define_fields
Date: Tue, 11 Aug 2026 14:00:05 +0800 [thread overview]
Message-ID: <3f27bacf-5f01-8cb5-a04c-824ca7b2c13f@allwinnertech.com> (raw)
In-Reply-To: <20260810104525.6a3a2e6c@gandalf.local.home>
> What does the above mean? Are you loading two modules at the same time?
Two modules (A and B) are loaded simultaneously on different CPUs. On the arm64,
when CPU0's trace_module_notify [pri=1] and CPU1's trace_module_notify [pri=0]
simultaneously perform operations on call_A, because they are in different cache lines,
CPU1 may observe WRITE_ONCE(head->next, &f->link) in step (4) before f->link.next=next in step (2).
At this time, CPU1 reads an uninitialized f->link.next and performs an operation that causes to crash.
> What does "pri=X notifier" mean? What function calls are these coming from?
`pri=X notifier` represents `trace_events.c:trace_module_notify [pri=1]` and `trace.c:trace_module_notify [pri=0]`, respectively.
CPU0 (loads module A) CPU1 (loads module B)
=============================== ===============================
load_module(A) load_module(B)
blocking_notifier_call_chain_robust blocking_notifier_call_chain_robust
notifier_call_chain notifier_call_chain
nb = trace_events.c: nb = trace.c:
trace_module_notify [pri=1] trace_module_notify [pri=0]
mutex_lock(&event_mutex) trace_event_update_all()
trace_module_add_events(A) down_write(&trace_event_sem)
__register_event(call_A)
__add_event_to_tracers(call_A)
event_define_fields(call_A)
for each f:
f = kmem_cache_alloc()
list_add(&f->link,
&class->fields)
f->link.next=next; (2)
WRITE_ONCE(head->next,
&f->link); (4) update_event_fields(call_A)
mutex_unlock(&event_mutex) list_for_each_entry(field,
&class->fields, link)
field = class->fields->next
= &f->link
= f (offset 0)
up_write(&trace_event_sem)
On 8/10/2026 10:45 PM, Steven Rostedt wrote:
> On Mon, 10 Aug 2026 14:32:30 +0800
> Michael Wu <michael@allwinnertech.com> wrote:
>
>> The following sequence may leads race between event_define_fields()
>> and update_event_fields():
>
>> CPU0 (module A, pri=1 notifier) CPU1 (module B, pri=0 notifier)
>
> What does the above mean? Are you loading two modules at the same time?
> What does "pri=X notifier" mean? What function calls are these coming from?
>
> -- Steve
>
>> =============================== ===============================
>> event_define_fields(call_A) trace_event_update_all()
>> for each f: list_for_each_entry(...,
>> list_add(&f->link, &ftrace_events)
>> &class->fields) -> finds call_A
>> f->link.next = next; (2)
>> update_event_fields(call_A)
>> WRITE_ONCE(class->fields->next,
>> &f->link); (4)
>> list_for_each_entry(field,
>> &class->fields, link)
>> -> field = class->fields->next
>> = &f->link
>> = f (offset 0)
>> -> arm64 weak ordering:
>> (4) visible before (2)
>> field->link.next == 0
>> -> next iteration:
>> field = (void *)0 = NULL
>> -> crash at NULL->type (0x18)
>>
>> This produces the following panic:
>> Unable to handle kernel access ... at virtual address 0000000000000018
>> pc : update_event_fields+0xf8/0x368
>> Call trace:
>> update_event_fields+0xf8/0x368
>> trace_event_update_all+0x7c/0x2b4
>> trace_module_notify+0x4c/0x1dc
>> notifier_call_chain+0x84/0x168
>> blocking_notifier_call_chain_robust+0x64/0xd4
>> load_module+0x10c8/0x123c
>> __arm64_sys_finit_module+0x230/0x31c
>>
>> Fix by taking event_mutex in trace_event_update_all() before
>> trace_event_sem.
>>
>> Fixes: b3bc8547d3be ("tracing: Have TRACE_DEFINE_ENUM affect trace event types as well")
>> Cc: stable@vger.kernel.org
>> Signed-off-by: Michael Wu <michael@allwinnertech.com>
--
Regards,
Michael Wu
next prev parent reply other threads:[~2026-08-11 6:00 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-10 6:32 [PATCH v5] tracing: Fix race between update_event_fields and, event_define_fields Michael Wu
2026-08-10 14:45 ` Steven Rostedt
2026-08-11 6:00 ` Michael Wu [this message]
2026-08-11 13:00 ` Steven Rostedt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3f27bacf-5f01-8cb5-a04c-824ca7b2c13f@allwinnertech.com \
--to=michael@allwinnertech.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox