| From a743bbeef27b9176987ec0cb7f906ab0ab52d1da Mon Sep 17 00:00:00 2001 |
| From: Borislav Petkov <bp@suse.de> |
| Date: Tue, 7 Nov 2017 18:53:07 +0100 |
| Subject: x86/oprofile/ppro: Do not use __this_cpu*() in preemptible context |
| |
| From: Borislav Petkov <bp@suse.de> |
| |
| commit a743bbeef27b9176987ec0cb7f906ab0ab52d1da upstream. |
| |
| The warning below says it all: |
| |
| BUG: using __this_cpu_read() in preemptible [00000000] code: swapper/0/1 |
| caller is __this_cpu_preempt_check |
| CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.14.0-rc8 #4 |
| Call Trace: |
| dump_stack |
| check_preemption_disabled |
| ? do_early_param |
| __this_cpu_preempt_check |
| arch_perfmon_init |
| op_nmi_init |
| ? alloc_pci_root_info |
| oprofile_arch_init |
| oprofile_init |
| do_one_initcall |
| ... |
| |
| These accessors should not have been used in the first place: it is PPro so |
| no mixed silicon revisions and thus it can simply use boot_cpu_data. |
| |
| Reported-by: Fengguang Wu <fengguang.wu@intel.com> |
| Tested-by: Fengguang Wu <fengguang.wu@intel.com> |
| Fix-creation-mandated-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Borislav Petkov <bp@suse.de> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Robert Richter <rric@kernel.org> |
| Cc: x86@kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/oprofile/op_model_ppro.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/arch/x86/oprofile/op_model_ppro.c |
| +++ b/arch/x86/oprofile/op_model_ppro.c |
| @@ -212,8 +212,8 @@ static void arch_perfmon_setup_counters( |
| eax.full = cpuid_eax(0xa); |
| |
| /* Workaround for BIOS bugs in 6/15. Taken from perfmon2 */ |
| - if (eax.split.version_id == 0 && __this_cpu_read(cpu_info.x86) == 6 && |
| - __this_cpu_read(cpu_info.x86_model) == 15) { |
| + if (eax.split.version_id == 0 && boot_cpu_data.x86 == 6 && |
| + boot_cpu_data.x86_model == 15) { |
| eax.split.version_id = 2; |
| eax.split.num_counters = 2; |
| eax.split.bit_width = 40; |