Messages in this thread Patch in this message | | | Subject | Re: [PATCH -tip] x86,trace: Add rcu_irq_enter/exit() in smp_trace_reschedule_interrupt() | From | Steven Rostedt <> | Date | Fri, 28 Jun 2013 11:36:54 -0400 |
| |
On Fri, 2013-06-28 at 15:13 +0000, Seiji Aguchi wrote:
> 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) > +{
Sure, but we should probably add a comment here to why smp_trace_reschedule_interrupt() is different than smp_reschedule_interrupt().
/* * Need to call irq_enter() before calling the trace point. * __smp_reschedule_interrupt() calls irq_enter/exit() too (in * scheduler_ipi(). This is OK, since those functions are allowed * to nest. */
-- Steve
> + 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);
| |