| From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| Date: Wed, 24 May 2017 10:15:30 +0200 |
| Subject: [PATCH 19/32] perf/x86/intel: Drop get_online_cpus() in |
| intel_snb_check_microcode() |
| |
| If intel_snb_check_microcode() is invoked via |
| microcode_init -> perf_check_microcode -> intel_snb_check_microcode |
| |
| then get_online_cpus() is invoked nested. This works with the current |
| implementation of get_online_cpus() but prevents converting it to a percpu |
| rwsem. |
| |
| intel_snb_check_microcode() is also invoked from intel_sandybridge_quirk() |
| unprotected. |
| |
| Drop get_online_cpus() from intel_snb_check_microcode() and add it to |
| intel_sandybridge_quirk() so both call sites are protected. |
| |
| Convert *_online_cpus() to the new interfaces while at it. |
| |
| Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Acked-by: Ingo Molnar <mingo@kernel.org> |
| Acked-by: Borislav Petkov <bp@suse.de> |
| Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Steven Rostedt <rostedt@goodmis.org> |
| Cc: Borislav Petkov <bp@alien8.de> |
| Link: http://lkml.kernel.org/r/20170524081548.594862191@linutronix.de |
| --- |
| arch/x86/events/intel/core.c | 11 +++++------ |
| 1 file changed, 5 insertions(+), 6 deletions(-) |
| |
| --- a/arch/x86/events/intel/core.c |
| +++ b/arch/x86/events/intel/core.c |
| @@ -3389,12 +3389,10 @@ static void intel_snb_check_microcode(vo |
| int pebs_broken = 0; |
| int cpu; |
| |
| - get_online_cpus(); |
| for_each_online_cpu(cpu) { |
| if ((pebs_broken = intel_snb_pebs_broken(cpu))) |
| break; |
| } |
| - put_online_cpus(); |
| |
| if (pebs_broken == x86_pmu.pebs_broken) |
| return; |
| @@ -3467,7 +3465,9 @@ static bool check_msr(unsigned long msr, |
| static __init void intel_sandybridge_quirk(void) |
| { |
| x86_pmu.check_microcode = intel_snb_check_microcode; |
| + cpus_read_lock(); |
| intel_snb_check_microcode(); |
| + cpus_read_unlock(); |
| } |
| |
| static const struct { int id; char *name; } intel_arch_events_map[] __initconst = { |
| @@ -4090,13 +4090,12 @@ static __init int fixup_ht_bug(void) |
| |
| lockup_detector_resume(); |
| |
| - get_online_cpus(); |
| + cpus_read_lock(); |
| |
| - for_each_online_cpu(c) { |
| + for_each_online_cpu(c) |
| free_excl_cntrs(c); |
| - } |
| |
| - put_online_cpus(); |
| + cpus_read_unlock(); |
| pr_info("PMU erratum BJ122, BV98, HSD29 workaround disabled, HT off\n"); |
| return 0; |
| } |