Re: [PATCH] x86/oprofile/ppro: Do not use __this_cpu* accessors in preemptible context

Borislav Petkov <[email protected]>
Newsgroups gmane.linux.oprofile,gmane.linux.kernel
Message-ID <[email protected]>
On Wed, Nov 08, 2017 at 11:48:28AM +0100, Thomas Gleixner wrote:
> AFAICT, ppro_setup_ctrs() has the same issue

Here's an updated patch:

---
From: Borislav Petkov <[email protected]>
Date: Tue, 7 Nov 2017 18:20:50 +0100
Subject: [PATCH] x86/oprofile/ppro: Do not use __this_cpu* accessors in preemptible context

The warning below says it all. And we should not have used those
accessors in the first place: it is PPro so no mixed silicon revisions
and thus can simply use boot_cpu_data.

  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
   ...


Fix the other callsite in ppro_setup_ctrs() too, while at it.

Reported-and-tested-by: Fengguang Wu <[email protected]>
Signed-off-by: Borislav Petkov <[email protected]>
Fix-creation-mandated-by: Linus Torvalds <[email protected]>
Cc: Robert Richter <[email protected]>
Cc: [email protected]
---
 arch/x86/oprofile/op_model_ppro.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/arch/x86/oprofile/op_model_ppro.c b/arch/x86/oprofile/op_model_ppro.c
index 350f7096baac..488b2efb24b9 100644
--- a/arch/x86/oprofile/op_model_ppro.c
+++ b/arch/x86/oprofile/op_model_ppro.c
@@ -84,8 +84,8 @@ static void ppro_setup_ctrs(struct op_x86_model_spec const *model,
 		 * counter width:
 		 */
 		if (!(eax.split.version_id == 0 &&
-			__this_cpu_read(cpu_info.x86) == 6 &&
-				__this_cpu_read(cpu_info.x86_model) == 15)) {
+		      boot_cpu_data.x86 == 6 &&
+		      boot_cpu_data.x86_model == 15)) {
 
 			if (counter_width < eax.split.bit_width)
 				counter_width = eax.split.bit_width;
@@ -212,8 +212,9 @@ static void arch_perfmon_setup_counters(void)
 	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;
-- 
2.13.0

SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nürnberg)
-- 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
oprofile-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/oprofile-list
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.