From: Jisheng Zhang <jszhang@kernel.org>
To: Roman Storozhenko <romeusmeister@gmail.com>
Cc: "Paul Walmsley" <pjw@kernel.org>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Alexandre Ghiti" <alex@ghiti.fr>,
"Steven Rostedt" <rostedt@goodmis.org>,
"Masami Hiramatsu" <mhiramat@kernel.org>,
"Mathieu Desnoyers" <mathieu.desnoyers@efficios.com>,
linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,
linux-trace-kernel@vger.kernel.org,
"Radim Krčmář" <rkrcmar@ventanamicro.com>
Subject: Re: [PATCH v2] riscv: mm: Trace TLB flush path selection
Date: Thu, 15 Oct 2026 07:33:13 +0800 [thread overview]
Message-ID: <atAROTefufggiFPO@xhacker> (raw)
In-Reply-To: <CALsPMBOdy4ZDWfnkYokUFuB3UYPV27wTUpBCZaxLWEV10ZuS=A@mail.gmail.com>
On Wed, Oct 14, 2026 at 05:58:42PM +0200, Roman Storozhenko wrote:
> Hi Jisheng,
>
> Thanks for the clarification.
>
> Since Radim's tracepoint code-generation results are now part of this
> discussion, I've added him to Cc in case I misinterpret any aspect of
> that issue.
>
> I agree with you on one point regarding the compiler overhead. Since
> the kernel supports older GCC versions, we have to take the code
> generated by those supported compilers into account today. So
> describing the issue simply as temporary was too strong.
>
> However, I think there are two separate questions here: whether the
> event exposes useful information, and whether the disabled-path cost
> of its current implementation is acceptable.
>
> Regarding kprobes, most of the raw fields in this event are indeed
> already arguments of `__flush_tlb_range()`. My point is not that these
> values are impossible to obtain dynamically.
>
> Kprobes can be used to observe a very large part of the kernel. If the
> ability to reconstruct an event with kprobes were by itself sufficient
> reason not to add a tracepoint, the same reasoning would apply to many
> existing tracepoints.
>
> The distinction I see here is between observing implementation details
> and exposing the semantic event directly.
>
> For this case, the interesting information is not only `start`,
> `size`, `stride`, `cmask`, etc., but their correlation with the path
> Linux selected for that particular request:
>
> local
> SBI RFENCE
> cross-CPU call
>
> Calculating the local case from `cmask` may be simple with the current
> implementation, but the tracing program still has to reproduce
> knowledge of the selection logic. Likewise, observing downstream
> functions ties the tracing program to the current call graph.
>
> I also don't think `/proc/interrupts` provides equivalent information here.
>
> The RISC-V IPI statistics are aggregate counters. In particular, Linux
> accounts `IPI_CALL_FUNC` as "Function call interrupts", while SBI
> RFENCE is handled below Linux by firmware; for example, OpenSBI
> implements the remote TLB operation using its own `IPI_TLB` event.
I think you misunderstood something. A riscv platform uses either
SBI RFENCE or IPI for tlb shootdown, and won't change. So you can
know whether the system is SBI RFENCE powered or IPI powered by
cat /proc/interrupts. It's much simpler.
>
> So checking `/proc/interrupts` can certainly be useful as a sanity
> check in a controlled workload: an increase in function-call IPIs can
> indicate use of the Linux cross-CPU path.
>
> But it cannot associate that IPI activity with a particular TLB
> invalidation request, and it cannot correlate it with the range, ASID,
> stride and target cpumask. Other users of the call-function IPI also
> contribute to the same counters. In a concurrent workload this becomes
> an inference rather than an observation of the TLB path decision.
>
> That per-request correlation is what I am trying to expose with the tracepoint.
>
> Regarding the performance argument, I agree that the disabled path
> must be cheap and that the current RISC-V tracepoint code-generation
> issue is relevant when evaluating the patch.
>
> I would not claim that all tracepoints have exactly the same overhead.
> My narrower point is that the issue referenced in Radim's thread is a
> general interaction between RISC-V tracepoints and compiler code
> generation rather than something specific to the semantics of this
> event.
>
> If the generated disabled path is considered too expensive, that is a
> valid implementation concern and may require improvement or
> mitigation. But I don't think it shows that the TLB path-selection
> event itself is redundant because the information can be reconstructed
> with kprobes.
>
> There is also no contradiction, in my view, between using the event
> for performance analysis and the event having overhead when enabled.
> Tracing normally perturbs the workload when it is enabled. The
> intended use here is primarily to understand things such as the
> distribution of local/SBI/IPI decisions and the request context
> associated with those decisions, rather than to use the tracepoint
> itself for cycle-accurate measurement of the cost of a TLB flush.
>
> The important requirement is therefore that the disabled path be
> sufficiently cheap.
>
> I think the PowerPC TLB tracepoints also remain a useful precedent
> here: they show that permanent architecture-specific TLB observability
> can be worthwhile when the architecture-specific information is
> useful.
>
> So I agree that convenience, maintenance cost and disabled-path
> overhead all need to be considered. I just don't think that kprobes or
> `/proc/interrupts` provide the same abstraction as recording the
> path-selection decision directly.
>
> Thanks,
> Roman
>
> On Wed, Oct 14, 2026 at 7:25 AM Jisheng Zhang <jszhang@kernel.org> wrote:
> >
> > On Sun, Oct 11, 2026 at 02:43:05PM +0200, Roman Storozhenko wrote:
> > > On Sat, Oct 10, 2026 at 6:44 AM Jisheng Zhang <jszhang@kernel.org> wrote:
> > > >
> > > > On Sat, Oct 03, 2026 at 10:54:44AM +0200, Roman Storozhenko wrote:
> > > > > On Fri, Oct 2, 2026 at 6:04 PM Jisheng Zhang <jszhang@kernel.org> wrote:
> > > > > >
> > > > > > On Sun, Aug 30, 2026 at 04:36:37PM +0200, Roman 'Hedin' Storozhenko wrote:
> > > > > > > Make RISC-V TLB flush path selection observable. Record whether Linux
> > > > > > > handles an invalidation locally, delegates it to SBI RFENCE, or executes
> > > > > > > it through a cross-CPU call, so MM activity can be correlated with the
> > > > > > > RISC-V, firmware, or Linux cross-CPU path carrying the request.
> > > > > >
> > > > > > I didn't see too much usefullness of the trace here. why not use kprobe
> > > > > > instead? can you plz show a real usage example of the trace? Which
> > > > > > bug/performance problem can be solved conveniently with this trace only?
> > > > > >
> > > > > > From another side, except x86, other architectures don't have the trace
> > > > > > in the TLB path.
> > > > > >
> > > > >
> > > > > Hi Jisheng,
> > > > >
> > > > > Thanks for the review. I agree that the current commit message describes
> > > > > the intended use rather abstractly.
> > > > >
> > > > > A kprobe can certainly be used to investigate this. My motivation
> > > > > for a tracepoint is not that dynamic tracing cannot obtain the
> > > > > information, but that doing so requires knowledge of the current
> > > > > implementation and reconstruction of a semantic decision made inside
> > > > > __flush_tlb_range() / flush_tlb_all().
> > > >
> > > > I prefer aligning with other architectures(except x86), I.E not
> > > > add this kind of trace. However, I would leave the decision to riscv
> > > > maintainers.
> > > >
> > > > FYI, you may notice that the riscv trace overhead is not trivial per
> > > > https://lore.kernel.org/linux-riscv/20250619190315.2603194-4-rkrcmar@ventanamicro.com/
> > >
> > > Hi Jisheng,
> > >
> > > Thanks for the feedback.
> > >
> > > Regarding the comparison with other architectures, thanks to Michael
> > > Ellerman for pointing me to the PowerPC TLB tracing when we happened
> > > to discuss this at LPC 2026.
> > >
> > > PowerPC defines the powerpc:tlbie and powerpc:tlbia trace events in
> > > arch/powerpc/include/asm/trace.h, and the corresponding trace calls
> > > are used in the PowerPC TLB invalidation paths.
> > >
> > > These events are not identical to the proposed RISC-V event: the
> > > PowerPC events primarily describe architecture invalidation
> > > operations, whereas this patch records the path selected by Linux
> > > before dispatch. However, I think they provide useful precedent for
> > > architecture-specific TLB observability beyond x86.
> > >
> > > Regarding kprobes, I agree that dynamic tracing can be used to investigate this.
> > >
> > > My concern is that obtaining the same information requires knowledge
> > > of the current implementation and reconstruction of the decision made
> > > inside __flush_tlb_range() / flush_tlb_all().
> > >
> > > For example, probing __flush_tlb_range() gives us the incoming
> > > request, but does not directly tell us whether Linux selected the
> > > local flush, SBI RFENCE, or cross-CPU-call path. A tracing tool has to
> > > probe and correlate implementation-specific downstream functions, or
> > > reproduce the selection logic itself.
> >
> > Hmm, let's look at where the tracepoints added:
> > void __flush_tlb_range(struct mm_struct *mm,
> > const struct cpumask *cmask,
> > unsigned long start, unsigned long size,
> > unsigned long stride)
> > void flush_tlb_all(void)
> >
> > most of the information you exported with the tracepoints are just
> > parameters of flush_tlb_range.
> > So kprobe or function trace can also get most of them, while whether
> > local or not needs to calcuate the cmask, but getting this info is
> > also easy via. adding one LoC to the kprobe routine.
> >
> > The tlb invalidation is frequently executed, so we need to carefully
> > evaluate the convience VS maitanince offort and performance overhead when
> > adding permanent tracepoints, given current riscv tracepoint overhead
> > isn't trivial.
> >
> > BTW: whether SBI RFENCE or cross-cpu-call is much easier. Just search
> > IPI in /proc/interrupts. No need to kprobe/function trace/tracepoint
> >
> > >
> > > The proposed event records this semantic decision directly at the
> > > point where Linux makes it. Users therefore do not need to depend on
> > > the current helper names, call graph, or exact implementation of the
> > > selection logic.
> > >
> > > Regarding the tracepoint overhead issue, I agree that disabled-path
> > > overhead is important, especially in the TLB flush path.
> > >
> > > However, I see the referenced SBI tracepoint case primarily as a
> > > RISC-V compiler/code-generation issue rather than as an argument
> > > against providing this kind of observability.
> > >
> > > The referenced discussion itself shows that the generated code depends
> > > significantly on compiler behavior, and that this is an area being
> > > improved. The undesirable overhead is not an inherent semantic
> > > requirement of the tracepoint.
> > >
> > > Even if the same code-generation problem currently affects this
> > > tracepoint, I don't think a temporary compiler limitation should by
> > > itself determine whether the tracepoint is useful or whether this
> > > observability belongs in the kernel.
> > >
> > > If the compiler currently generates unacceptable disabled-path
> > > overhead, that is certainly something that should be improved or
> > > mitigated in the implementation. But I would separate that issue from
> > > the question of whether exposing the RISC-V TLB path-selection
> > > decision is useful.
> > >
> >
> > But we need to live with it. Per the Radim email, gcc14 can still
> > see the issue, given the minimum gcc version of kernel building
> > requirement is gcc8 now, gcc14 has a long time to bailout.
> >
> > And another tricky point here is
> > one of your motivations of adding the tracepoint is to profile then
> > improve the tlb related code path performance, but adding the
> > tracepoint brings non-trivial overhead to tlb code path.
>
>
>
> --
> Kind regards,
> Roman 'Hedin' Storozhenko
next prev parent reply other threads:[~2026-10-14 23:53 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-30 14:36 [PATCH v2] riscv: mm: Trace TLB flush path selection Roman 'Hedin' Storozhenko
2026-09-13 10:14 ` Roman Storozhenko
2026-10-02 15:44 ` Jisheng Zhang
2026-10-03 8:54 ` Roman Storozhenko
2026-10-10 4:24 ` Jisheng Zhang
2026-10-11 12:43 ` Roman Storozhenko
2026-10-14 5:05 ` Jisheng Zhang
2026-10-14 15:58 ` Roman Storozhenko
2026-10-14 23:33 ` Jisheng Zhang [this message]
2026-10-15 4:27 ` Jisheng Zhang
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=atAROTefufggiFPO@xhacker \
--to=jszhang@kernel.org \
--cc=alex@ghiti.fr \
--cc=aou@eecs.berkeley.edu \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=palmer@dabbelt.com \
--cc=pjw@kernel.org \
--cc=rkrcmar@ventanamicro.com \
--cc=romeusmeister@gmail.com \
--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