| From 9f8accc54c0cfb823b7edbb72647905b431e79fe Mon Sep 17 00:00:00 2001 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Tue, 31 Jan 2017 23:58:39 +0100 |
| Subject: [PATCH] perf/x86/intel/uncore: Clean up hotplug conversion fallout |
| |
| commit 1aa6cfd33df492939b0be15ebdbcff1f8ae5ddb6 upstream. |
| |
| 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: 1a246b9f58c6 ("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> |
| |
| diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c |
| index 463dc7a5a6c3..e8a9ab7d209c 100644 |
| --- a/arch/x86/events/intel/uncore.c |
| +++ b/arch/x86/events/intel/uncore.c |
| @@ -760,30 +760,6 @@ static void uncore_pmu_unregister(struct intel_uncore_pmu *pmu) |
| 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) |
| { |
| int pkg; |
| @@ -1074,22 +1050,12 @@ static int uncore_cpu_dying(unsigned int cpu) |
| return 0; |
| } |
| |
| -static int first_init; |
| - |
| static int uncore_cpu_starting(unsigned int cpu) |
| { |
| struct intel_uncore_type *type, **types = uncore_msr_uncores; |
| struct intel_uncore_pmu *pmu; |
| struct intel_uncore_box *box; |
| - int i, pkg, ncpus = 1; |
| - |
| - 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)); |
| - } |
| + int i, pkg; |
| |
| pkg = topology_logical_package_id(cpu); |
| for (; *types; types++) { |
| @@ -1100,7 +1066,7 @@ static int uncore_cpu_starting(unsigned int cpu) |
| if (!box) |
| continue; |
| /* 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); |
| } |
| } |
| @@ -1397,19 +1363,17 @@ static int __init intel_uncore_init(void) |
| "PERF_X86_UNCORE_PREP", |
| uncore_cpu_prepare, NULL); |
| } |
| - first_init = 1; |
| + |
| cpuhp_setup_state(CPUHP_AP_PERF_X86_UNCORE_STARTING, |
| "AP_PERF_X86_UNCORE_STARTING", |
| uncore_cpu_starting, uncore_cpu_dying); |
| - first_init = 0; |
| + |
| cpuhp_setup_state(CPUHP_AP_PERF_X86_UNCORE_ONLINE, |
| "AP_PERF_X86_UNCORE_ONLINE", |
| uncore_event_cpu_online, uncore_event_cpu_offline); |
| return 0; |
| |
| err: |
| - /* Undo box->init_box() */ |
| - on_each_cpu_mask(&uncore_cpu_mask, uncore_exit_boxes, NULL, 1); |
| uncore_types_exit(uncore_msr_uncores); |
| uncore_pci_exit(); |
| return ret; |
| -- |
| 2.12.0 |
| |