提交 4f971248 编写于 作者: A Andi Kleen 提交者: Ingo Molnar

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: NAndi Kleen <ak@linux.intel.com>
Signed-off-by: NPeter Zijlstra (Intel) <peterz@infradead.org>
Cc: eranian@google.com
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Link: http://lkml.kernel.org/r/1411424826-15629-1-git-send-email-andi@firstfloor.orgSigned-off-by: NIngo Molnar <mingo@kernel.org>
上级 69e8f5b1
...@@ -42,6 +42,9 @@ struct intel_uncore_box *uncore_pmu_to_box(struct intel_uncore_pmu *pmu, int cpu ...@@ -42,6 +42,9 @@ struct intel_uncore_box *uncore_pmu_to_box(struct intel_uncore_pmu *pmu, int cpu
return box; return box;
raw_spin_lock(&uncore_box_lock); 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) { list_for_each_entry(box, &pmu->box_list, list) {
if (box->phys_id == topology_physical_package_id(cpu)) { if (box->phys_id == topology_physical_package_id(cpu)) {
atomic_inc(&box->refcnt); atomic_inc(&box->refcnt);
...@@ -49,6 +52,7 @@ struct intel_uncore_box *uncore_pmu_to_box(struct intel_uncore_pmu *pmu, int cpu ...@@ -49,6 +52,7 @@ struct intel_uncore_box *uncore_pmu_to_box(struct intel_uncore_pmu *pmu, int cpu
break; break;
} }
} }
out:
raw_spin_unlock(&uncore_box_lock); raw_spin_unlock(&uncore_box_lock);
return *per_cpu_ptr(pmu->box, cpu); return *per_cpu_ptr(pmu->box, cpu);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册