lkml.org 
[lkml]   [2023]   [Jan]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v3 35/51] trace,hardirq: No moar _rcuidle() tracing
    Robot reported that trace_hardirqs_{on,off}() tickle the forbidden
    _rcuidle() tracepoint through local_irq_{en,dis}able().

    For 'sane' configs, these calls will only happen with RCU enabled and
    as such can use the regular tracepoint. This also means it's possible
    to trace them from NMI context again.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    kernel/trace/trace_preemptirq.c | 21 +++++++++++++--------
    1 file changed, 13 insertions(+), 8 deletions(-)

    --- a/kernel/trace/trace_preemptirq.c
    +++ b/kernel/trace/trace_preemptirq.c
    @@ -20,6 +20,15 @@
    static DEFINE_PER_CPU(int, tracing_irq_cpu);

    /*
    + * ...
    + */
    +#ifdef CONFIG_ARCH_WANTS_NO_INSTR
    +#define trace(point) trace_##point
    +#else
    +#define trace(point) if (!in_nmi()) trace_##point##_rcuidle
    +#endif
    +
    +/*
    * Like trace_hardirqs_on() but without the lockdep invocation. This is
    * used in the low level entry code where the ordering vs. RCU is important
    * and lockdep uses a staged approach which splits the lockdep hardirq
    @@ -28,8 +37,7 @@ static DEFINE_PER_CPU(int, tracing_irq_c
    void trace_hardirqs_on_prepare(void)
    {
    if (this_cpu_read(tracing_irq_cpu)) {
    - if (!in_nmi())
    - trace_irq_enable(CALLER_ADDR0, CALLER_ADDR1);
    + trace(irq_enable)(CALLER_ADDR0, CALLER_ADDR1);
    tracer_hardirqs_on(CALLER_ADDR0, CALLER_ADDR1);
    this_cpu_write(tracing_irq_cpu, 0);
    }
    @@ -40,8 +48,7 @@ NOKPROBE_SYMBOL(trace_hardirqs_on_prepar
    void trace_hardirqs_on(void)
    {
    if (this_cpu_read(tracing_irq_cpu)) {
    - if (!in_nmi())
    - trace_irq_enable_rcuidle(CALLER_ADDR0, CALLER_ADDR1);
    + trace(irq_enable)(CALLER_ADDR0, CALLER_ADDR1);
    tracer_hardirqs_on(CALLER_ADDR0, CALLER_ADDR1);
    this_cpu_write(tracing_irq_cpu, 0);
    }
    @@ -63,8 +70,7 @@ void trace_hardirqs_off_finish(void)
    if (!this_cpu_read(tracing_irq_cpu)) {
    this_cpu_write(tracing_irq_cpu, 1);
    tracer_hardirqs_off(CALLER_ADDR0, CALLER_ADDR1);
    - if (!in_nmi())
    - trace_irq_disable(CALLER_ADDR0, CALLER_ADDR1);
    + trace(irq_disable)(CALLER_ADDR0, CALLER_ADDR1);
    }

    }
    @@ -78,8 +84,7 @@ void trace_hardirqs_off(void)
    if (!this_cpu_read(tracing_irq_cpu)) {
    this_cpu_write(tracing_irq_cpu, 1);
    tracer_hardirqs_off(CALLER_ADDR0, CALLER_ADDR1);
    - if (!in_nmi())
    - trace_irq_disable_rcuidle(CALLER_ADDR0, CALLER_ADDR1);
    + trace(irq_disable)(CALLER_ADDR0, CALLER_ADDR1);
    }
    }
    EXPORT_SYMBOL(trace_hardirqs_off);

    \
     
     \ /
      Last update: 2023-03-26 23:38    [W:2.533 / U:0.172 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site