Messages in this thread Patch in this message | | | From | Seiji Aguchi <> | Subject | RE: [PATCH -tip] x86,trace: Add rcu_irq_enter/exit() in smp_trace_reschedule_interrupt() | Date | Fri, 28 Jun 2013 15:13:14 +0000 |
| |
> > diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c > > index f4fe0b8..b959056 100644 > > --- a/arch/x86/kernel/smp.c > > +++ b/arch/x86/kernel/smp.c > > @@ -268,9 +268,11 @@ void smp_reschedule_interrupt(struct pt_regs *regs) > > void smp_trace_reschedule_interrupt(struct pt_regs *regs) > > { > > ack_APIC_irq(); > > + rcu_irq_enter(); > > trace_reschedule_entry(RESCHEDULE_VECTOR); > > __smp_reschedule_interrupt(); > > trace_reschedule_exit(RESCHEDULE_VECTOR); > > + rcu_irq_exit(); > > The question is, should we add normal irq_enter/exit here? As that > should be OK to nest. There's a comment in scheduler_ipi():
> Either way, the tracepoint requires rcu but for accuracy it also > requires irq_enter() (tracepoints record the irq context), thus, the > tracepoint interrupt handler should be calling irq_enter() and not > rcu_irq_enter() (irq_enter() calls rcu_irq_enter())
OK. So, ack_APIC_irq() and irq_enter() are needed. It can be shared with smp_call_function() and smp_call_function_single() like this. I will update the patch.
arch/x86/kernel/smp.c | 23 ++++++++++++----------- 1 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c index f4fe0b8..732b618 100644 --- a/arch/x86/kernel/smp.c +++ b/arch/x86/kernel/smp.c @@ -265,23 +265,24 @@ void smp_reschedule_interrupt(struct pt_regs *regs) */ } -void smp_trace_reschedule_interrupt(struct pt_regs *regs) +static inline void smp_entering_irq(void) { ack_APIC_irq(); + irq_enter(); +} + +void smp_trace_reschedule_interrupt(struct pt_regs *regs) +{ + smp_entering_irq(); trace_reschedule_entry(RESCHEDULE_VECTOR); __smp_reschedule_interrupt(); trace_reschedule_exit(RESCHEDULE_VECTOR); + exiting_irq(); /* * KVM uses this interrupt to force a cpu out of guest mode */ } -static inline void call_function_entering_irq(void) -{ - ack_APIC_irq(); - irq_enter(); -} - static inline void __smp_call_function_interrupt(void) { generic_smp_call_function_interrupt(); @@ -290,14 +291,14 @@ static inline void __smp_call_function_interrupt(void) void smp_call_function_interrupt(struct pt_regs *regs) { - call_function_entering_irq(); + smp_entering_irq(); __smp_call_function_interrupt(); exiting_irq(); } void smp_trace_call_function_interrupt(struct pt_regs *regs) { - call_function_entering_irq(); + smp_entering_irq(); trace_call_function_entry(CALL_FUNCTION_VECTOR); __smp_call_function_interrupt(); trace_call_function_exit(CALL_FUNCTION_VECTOR); @@ -312,14 +313,14 @@ static inline void __smp_call_function_single_interrupt(void) void smp_call_function_single_interrupt(struct pt_regs *regs) { - call_function_entering_irq(); + smp_entering_irq(); __smp_call_function_single_interrupt(); exiting_irq(); } void smp_trace_call_function_single_interrupt(struct pt_regs *regs) { - call_function_entering_irq(); + smp_entering_irq(); trace_call_function_single_entry(CALL_FUNCTION_SINGLE_VECTOR); __smp_call_function_single_interrupt(); trace_call_function_single_exit(CALL_FUNCTION_SINGLE_VECTOR); -- 1.7.1
| |