perf_counter: fix print debug irq disable
authorPeter Zijlstra <a.p.zijlstra@chello.nl>
Wed, 13 May 2009 06:12:51 +0000 (08:12 +0200)
committerIngo Molnar <mingo@elte.hu>
Wed, 13 May 2009 06:17:37 +0000 (08:17 +0200)
inconsistent {IN-HARDIRQ-W} -> {HARDIRQ-ON-W} usage.
bash/15802 [HC0[0]:SC0[0]:HE1:SE1] takes:
 (sysrq_key_table_lock){?.....},

Don't unconditionally enable interrupts in the perf_counter_print_debug()
path.

[ Impact: fix potential deadlock pointed out by lockdep ]

LKML-Reference: <new-submission>
Reported-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
arch/x86/kernel/cpu/perf_counter.c

index da27419..f7772ff 100644 (file)
@@ -621,12 +621,13 @@ void perf_counter_print_debug(void)
 {
        u64 ctrl, status, overflow, pmc_ctrl, pmc_count, prev_left, fixed;
        struct cpu_hw_counters *cpuc;
+       unsigned long flags;
        int cpu, idx;
 
        if (!x86_pmu.num_counters)
                return;
 
-       local_irq_disable();
+       local_irq_save(flags);
 
        cpu = smp_processor_id();
        cpuc = &per_cpu(cpu_hw_counters, cpu);
@@ -664,7 +665,7 @@ void perf_counter_print_debug(void)
                pr_info("CPU#%d: fixed-PMC%d count: %016llx\n",
                        cpu, idx, pmc_count);
        }
-       local_irq_enable();
+       local_irq_restore(flags);
 }
 
 static void x86_pmu_disable(struct perf_counter *counter)