lkml.org 
[lkml]   [2020]   [Nov]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 03/11 v3] ftrace: Optimize testing what context current is in
    From: "Steven Rostedt (VMware)" <rostedt@goodmis.org>

    The preempt_count() is not a simple location in memory, it could be part of
    per_cpu code or more. Each access to preempt_count(), or one of its accessor
    functions (like in_interrupt()) takes several cycles. By reading
    preempt_count() once, and then doing tests to find the context against the
    value return is slightly faster than using in_nmi() and in_interrupt().

    Link: https://lkml.kernel.org/r/20201028115612.780796355@goodmis.org

    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    ---
    include/linux/trace_recursion.h | 33 ++++++++++++++++++++-------------
    1 file changed, 20 insertions(+), 13 deletions(-)

    diff --git a/include/linux/trace_recursion.h b/include/linux/trace_recursion.h
    index f2a949dbfec7..ac3d73484cb2 100644
    --- a/include/linux/trace_recursion.h
    +++ b/include/linux/trace_recursion.h
    @@ -117,22 +117,29 @@ enum {

    #define TRACE_CONTEXT_MASK TRACE_LIST_MAX

    +/*
    + * Used for setting context
    + * NMI = 0
    + * IRQ = 1
    + * SOFTIRQ = 2
    + * NORMAL = 3
    + */
    +enum {
    + TRACE_CTX_NMI,
    + TRACE_CTX_IRQ,
    + TRACE_CTX_SOFTIRQ,
    + TRACE_CTX_NORMAL,
    +};
    +
    static __always_inline int trace_get_context_bit(void)
    {
    - int bit;
    -
    - if (in_interrupt()) {
    - if (in_nmi())
    - bit = 0;
    -
    - else if (in_irq())
    - bit = 1;
    - else
    - bit = 2;
    - } else
    - bit = 3;
    + unsigned long pc = preempt_count();

    - return bit;
    + if (!(pc & (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET)))
    + return TRACE_CTX_NORMAL;
    + else
    + return pc & NMI_MASK ? TRACE_CTX_NMI :
    + pc & HARDIRQ_MASK ? TRACE_CTX_IRQ : TRACE_CTX_SOFTIRQ;
    }

    static __always_inline int trace_test_and_set_recursion(int start, int max)
    --
    2.28.0

    \
     
     \ /
      Last update: 2020-11-06 03:36    [W:2.829 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site