Commit-ID:  4f971248bc6ad2bb2a89a25a072ebfec5757d298
Gitweb:     http://git.kernel.org/tip/4f971248bc6ad2bb2a89a25a072ebfec5757d298
Author:     Andi Kleen <[email protected]>
AuthorDate: Mon, 22 Sep 2014 15:27:06 -0700
Committer:  Ingo Molnar <[email protected]>
CommitDate: Fri, 3 Oct 2014 06:02:49 +0200

perf/x86/intel/uncore: Fix minor race in box set up

I was looking for the trinity oops cause in the uncore driver.
(so far didn't found it)

However I found this tiny race: when a box is set up two threads on the
same CPU, they may be setting up the box in parallel (e.g. with kernel
preemption). This could lead to the reference count being increasing
too much. Always recheck there is no existing cpu reference inside the lock.

Signed-off-by: Andi Kleen <[email protected]>
Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
Cc: [email protected]
Cc: Arnaldo Carvalho de Melo <[email protected]>
Link: 
http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
---
 arch/x86/kernel/cpu/perf_event_intel_uncore.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.c 
b/arch/x86/kernel/cpu/perf_event_intel_uncore.c
index 42d00e5..9762dbd 100644
--- a/arch/x86/kernel/cpu/perf_event_intel_uncore.c
+++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.c
@@ -42,6 +42,9 @@ struct intel_uncore_box *uncore_pmu_to_box(struct 
intel_uncore_pmu *pmu, int cpu
                return box;
 
        raw_spin_lock(&uncore_box_lock);
+       /* Recheck in lock to handle races. */
+       if (*per_cpu_ptr(pmu->box, cpu))
+               goto out;
        list_for_each_entry(box, &pmu->box_list, list) {
                if (box->phys_id == topology_physical_package_id(cpu)) {
                        atomic_inc(&box->refcnt);
@@ -49,6 +52,7 @@ struct intel_uncore_box *uncore_pmu_to_box(struct 
intel_uncore_pmu *pmu, int cpu
                        break;
                }
        }
+out:
        raw_spin_unlock(&uncore_box_lock);
 
        return *per_cpu_ptr(pmu->box, cpu);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to