lkml.org 
[lkml]   [2020]   [May]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v2 1/6] x86/entry: Clarify irq_{enter,exit}_rcu()
    Because:

    irq_enter_rcu() includes lockdep_hardirq_enter()
    irq_exit_rcu() does *NOT* include lockdep_hardirq_exit()

    Which resulted in two 'stray' lockdep_hardirq_exit() calls in
    idtentry.h, and me spending a long time trying to find the matching
    enter calls.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    arch/x86/include/asm/idtentry.h | 2 --
    kernel/softirq.c | 19 +++++++++++++------
    2 files changed, 13 insertions(+), 8 deletions(-)

    --- a/arch/x86/include/asm/idtentry.h
    +++ b/arch/x86/include/asm/idtentry.h
    @@ -206,7 +206,6 @@ __visible noinstr void func(struct pt_re
    kvm_set_cpu_l1tf_flush_l1d(); \
    __##func (regs, (u8)error_code); \
    irq_exit_rcu(); \
    - lockdep_hardirq_exit(); \
    instrumentation_end(); \
    idtentry_exit_cond_rcu(regs, rcu_exit); \
    } \
    @@ -249,7 +248,6 @@ __visible noinstr void func(struct pt_re
    kvm_set_cpu_l1tf_flush_l1d(); \
    run_on_irqstack_cond(__##func, regs, regs); \
    irq_exit_rcu(); \
    - lockdep_hardirq_exit(); \
    instrumentation_end(); \
    idtentry_exit_cond_rcu(regs, rcu_exit); \
    } \
    --- a/kernel/softirq.c
    +++ b/kernel/softirq.c
    @@ -404,12 +404,7 @@ static inline void tick_irq_exit(void)
    #endif
    }

    -/**
    - * irq_exit_rcu() - Exit an interrupt context without updating RCU
    - *
    - * Also processes softirqs if needed and possible.
    - */
    -void irq_exit_rcu(void)
    +static inline void __irq_exit_rcu(void)
    {
    #ifndef __ARCH_IRQ_EXIT_IRQS_DISABLED
    local_irq_disable();
    @@ -425,6 +420,18 @@ void irq_exit_rcu(void)
    }

    /**
    + * irq_exit_rcu() - Exit an interrupt context without updating RCU
    + *
    + * Also processes softirqs if needed and possible.
    + */
    +void irq_exit_rcu(void)
    +{
    + __irq_exit_rcu();
    + /* must be last! */
    + lockdep_hardirq_exit();
    +}
    +
    +/**
    * irq_exit - Exit an interrupt context, update RCU and lockdep
    *
    * Also processes softirqs if needed and possible.

    \
     
     \ /
      Last update: 2020-05-28 16:18    [W:3.766 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site