diff options
Diffstat (limited to 'arch/x86/kernel/tracepoint.c')
-rw-r--r-- | arch/x86/kernel/tracepoint.c | 43 |
1 files changed, 0 insertions, 43 deletions
diff --git a/arch/x86/kernel/tracepoint.c b/arch/x86/kernel/tracepoint.c index dd4aa04bb95c..4cae92f15495 100644 --- a/arch/x86/kernel/tracepoint.c +++ b/arch/x86/kernel/tracepoint.c @@ -10,58 +10,15 @@ #include <asm/hw_irq.h> #include <asm/desc.h> -atomic_t trace_idt_ctr = ATOMIC_INIT(0); -struct desc_ptr trace_idt_descr = { NR_VECTORS * 16 - 1, - (unsigned long) trace_idt_table }; - -/* No need to be aligned, but done to keep all IDTs defined the same way. */ -gate_desc trace_idt_table[NR_VECTORS] __page_aligned_bss; - DEFINE_STATIC_KEY_FALSE(trace_irqvectors_key); -static int trace_irq_vector_refcount; -static DEFINE_MUTEX(irq_vector_mutex); - -static void set_trace_idt_ctr(int val) -{ - atomic_set(&trace_idt_ctr, val); - /* Ensure the trace_idt_ctr is set before sending IPI */ - wmb(); -} - -static void switch_idt(void *arg) -{ - unsigned long flags; - - local_irq_save(flags); - load_current_idt(); - local_irq_restore(flags); -} int trace_irq_vector_regfunc(void) { static_branch_inc(&trace_irqvectors_key); - - mutex_lock(&irq_vector_mutex); - if (!trace_irq_vector_refcount) { - set_trace_idt_ctr(1); - smp_call_function(switch_idt, NULL, 0); - switch_idt(NULL); - } - trace_irq_vector_refcount++; - mutex_unlock(&irq_vector_mutex); return 0; } void trace_irq_vector_unregfunc(void) { static_branch_dec(&trace_irqvectors_key); - - mutex_lock(&irq_vector_mutex); - trace_irq_vector_refcount--; - if (!trace_irq_vector_refcount) { - set_trace_idt_ctr(0); - smp_call_function(switch_idt, NULL, 0); - switch_idt(NULL); - } - mutex_unlock(&irq_vector_mutex); } |