mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
perf/x86/intel/uncore: Clean up hotplug conversion fallout
commit1aa6cfd33dupstream. The recent conversion to the hotplug state machine kept two mechanisms from the original code: 1) The first_init logic which adds the number of online CPUs in a package to the refcount. That's wrong because the callbacks are executed for all online CPUs. Remove it so the refcounting is correct. 2) The on_each_cpu() call to undo box->init() in the error handling path. That's bogus because when the prepare callback fails no box has been initialized yet. Remove it. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Sebastian Siewior <bigeasy@linutronix.de> Cc: Stephane Eranian <eranian@google.com> Cc: Vince Weaver <vincent.weaver@maine.edu> Cc: Yasuaki Ishimatsu <yasu.isimatu@gmail.com> Fixes:1a246b9f58("perf/x86/intel/uncore: Convert to hotplug state machine") Link: http://lkml.kernel.org/r/20170131230141.298032324@linutronix.de Signed-off-by: Ingo Molnar <mingo@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
e6bd712154
commit
bebb9d75e8
@@ -763,30 +763,6 @@ static void uncore_pmu_unregister(struct intel_uncore_pmu *pmu)
|
|||||||
pmu->registered = false;
|
pmu->registered = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __uncore_exit_boxes(struct intel_uncore_type *type, int cpu)
|
|
||||||
{
|
|
||||||
struct intel_uncore_pmu *pmu = type->pmus;
|
|
||||||
struct intel_uncore_box *box;
|
|
||||||
int i, pkg;
|
|
||||||
|
|
||||||
if (pmu) {
|
|
||||||
pkg = topology_physical_package_id(cpu);
|
|
||||||
for (i = 0; i < type->num_boxes; i++, pmu++) {
|
|
||||||
box = pmu->boxes[pkg];
|
|
||||||
if (box)
|
|
||||||
uncore_box_exit(box);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void uncore_exit_boxes(void *dummy)
|
|
||||||
{
|
|
||||||
struct intel_uncore_type **types;
|
|
||||||
|
|
||||||
for (types = uncore_msr_uncores; *types; types++)
|
|
||||||
__uncore_exit_boxes(*types++, smp_processor_id());
|
|
||||||
}
|
|
||||||
|
|
||||||
static void uncore_free_boxes(struct intel_uncore_pmu *pmu)
|
static void uncore_free_boxes(struct intel_uncore_pmu *pmu)
|
||||||
{
|
{
|
||||||
int pkg;
|
int pkg;
|
||||||
@@ -1077,22 +1053,12 @@ static int uncore_cpu_dying(unsigned int cpu)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int first_init;
|
|
||||||
|
|
||||||
static int uncore_cpu_starting(unsigned int cpu)
|
static int uncore_cpu_starting(unsigned int cpu)
|
||||||
{
|
{
|
||||||
struct intel_uncore_type *type, **types = uncore_msr_uncores;
|
struct intel_uncore_type *type, **types = uncore_msr_uncores;
|
||||||
struct intel_uncore_pmu *pmu;
|
struct intel_uncore_pmu *pmu;
|
||||||
struct intel_uncore_box *box;
|
struct intel_uncore_box *box;
|
||||||
int i, pkg, ncpus = 1;
|
int i, pkg;
|
||||||
|
|
||||||
if (first_init) {
|
|
||||||
/*
|
|
||||||
* On init we get the number of online cpus in the package
|
|
||||||
* and set refcount for all of them.
|
|
||||||
*/
|
|
||||||
ncpus = cpumask_weight(topology_core_cpumask(cpu));
|
|
||||||
}
|
|
||||||
|
|
||||||
pkg = topology_logical_package_id(cpu);
|
pkg = topology_logical_package_id(cpu);
|
||||||
for (; *types; types++) {
|
for (; *types; types++) {
|
||||||
@@ -1103,7 +1069,7 @@ static int uncore_cpu_starting(unsigned int cpu)
|
|||||||
if (!box)
|
if (!box)
|
||||||
continue;
|
continue;
|
||||||
/* The first cpu on a package activates the box */
|
/* The first cpu on a package activates the box */
|
||||||
if (atomic_add_return(ncpus, &box->refcnt) == ncpus)
|
if (atomic_inc_return(&box->refcnt) == 1)
|
||||||
uncore_box_init(box);
|
uncore_box_init(box);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1407,19 +1373,17 @@ static int __init intel_uncore_init(void)
|
|||||||
"PERF_X86_UNCORE_PREP",
|
"PERF_X86_UNCORE_PREP",
|
||||||
uncore_cpu_prepare, NULL);
|
uncore_cpu_prepare, NULL);
|
||||||
}
|
}
|
||||||
first_init = 1;
|
|
||||||
cpuhp_setup_state(CPUHP_AP_PERF_X86_UNCORE_STARTING,
|
cpuhp_setup_state(CPUHP_AP_PERF_X86_UNCORE_STARTING,
|
||||||
"AP_PERF_X86_UNCORE_STARTING",
|
"AP_PERF_X86_UNCORE_STARTING",
|
||||||
uncore_cpu_starting, uncore_cpu_dying);
|
uncore_cpu_starting, uncore_cpu_dying);
|
||||||
first_init = 0;
|
|
||||||
cpuhp_setup_state(CPUHP_AP_PERF_X86_UNCORE_ONLINE,
|
cpuhp_setup_state(CPUHP_AP_PERF_X86_UNCORE_ONLINE,
|
||||||
"AP_PERF_X86_UNCORE_ONLINE",
|
"AP_PERF_X86_UNCORE_ONLINE",
|
||||||
uncore_event_cpu_online, uncore_event_cpu_offline);
|
uncore_event_cpu_online, uncore_event_cpu_offline);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
/* Undo box->init_box() */
|
|
||||||
on_each_cpu_mask(&uncore_cpu_mask, uncore_exit_boxes, NULL, 1);
|
|
||||||
uncore_types_exit(uncore_msr_uncores);
|
uncore_types_exit(uncore_msr_uncores);
|
||||||
uncore_pci_exit();
|
uncore_pci_exit();
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
Reference in New Issue
Block a user