aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@linux.intel.com>2013-06-24 14:01:09 -0400
committerH. Peter Anvin <hpa@linux.intel.com>2013-06-24 14:01:09 -0400
commit5236eb968ec21c693d463d0494e39b00c1bc174d (patch)
tree1bb6abc27df94dad156225b7d2ec31d04fd9cdd7
parent33e5ff634f07dec26b7ed1fd7f9e32978fe1f2b2 (diff)
parent2b4bc78956bdcc2bb4c49b3af955be776817e897 (diff)
Merge remote-tracking branch 'trace/tip/x86/trace' into x86/trace
Fix from Steven Rostedt.
-rw-r--r--arch/x86/include/asm/desc.h10
-rw-r--r--arch/x86/kernel/tracepoint.c4
2 files changed, 8 insertions, 6 deletions
diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h
index 1377ecb29d8d..b90e5dfeee46 100644
--- a/arch/x86/include/asm/desc.h
+++ b/arch/x86/include/asm/desc.h
@@ -497,21 +497,19 @@ static inline void load_trace_idt(void)
497#endif 497#endif
498 498
499/* 499/*
500 * the load_current_idt() is called with interrupt disabled by local_irq_save() 500 * The load_current_idt() must be called with interrupts disabled
501 * to avoid races. That way the IDT will always be set back to the expected 501 * to avoid races. That way the IDT will always be set back to the expected
502 * descriptor. 502 * descriptor. It's also called when a CPU is being initialized, and
503 * that doesn't need to disable interrupts, as nothing should be
504 * bothering the CPU then.
503 */ 505 */
504static inline void load_current_idt(void) 506static inline void load_current_idt(void)
505{ 507{
506 unsigned long flags;
507
508 local_irq_save(flags);
509 if (is_debug_idt_enabled()) 508 if (is_debug_idt_enabled())
510 load_debug_idt(); 509 load_debug_idt();
511 else if (is_trace_idt_enabled()) 510 else if (is_trace_idt_enabled())
512 load_trace_idt(); 511 load_trace_idt();
513 else 512 else
514 load_idt((const struct desc_ptr *)&idt_descr); 513 load_idt((const struct desc_ptr *)&idt_descr);
515 local_irq_restore(flags);
516} 514}
517#endif /* _ASM_X86_DESC_H */ 515#endif /* _ASM_X86_DESC_H */
diff --git a/arch/x86/kernel/tracepoint.c b/arch/x86/kernel/tracepoint.c
index 1423efe98fbc..4e584a8d6edd 100644
--- a/arch/x86/kernel/tracepoint.c
+++ b/arch/x86/kernel/tracepoint.c
@@ -29,7 +29,11 @@ static void set_trace_idt_ctr(int val)
29 29
30static void switch_idt(void *arg) 30static void switch_idt(void *arg)
31{ 31{
32 unsigned long flags;
33
34 local_irq_save(flags);
32 load_current_idt(); 35 load_current_idt();
36 local_irq_restore(flags);
33} 37}
34 38
35void trace_irq_vector_regfunc(void) 39void trace_irq_vector_regfunc(void)