View Issue Details

IDProjectCategoryView StatusLast Update
0017925CentOS-7kernelpublic2020-12-15 23:04
ReporterJerome Borsboom Assigned To 
PrioritynormalSeveritymajorReproducibilityalways
Status assignedResolutionopen 
Product Version7.9.2009 
Summary0017925: 32-bit i686 kernel fails to boot properly or even crashes on multi-cpu systems with 'pcid' cpu feature
DescriptionWhen booting a recent 32-bit i686 kernel on a multi-cpu system with 'pcid' cpu feature, only the boot cpu is correctly initialized. The other cpu's fail to initialize, resulting in a badly running or crashing kernel.

The reason is two missing patches present in vanilla upstream kernels:
x86/mm: Disable PCID on 32-bit kernels
x86/mm/32: Move setup_clear_cpu_cap(X86_FEATURE_PCID) earlier

diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 775f10100d7fe..c9176bae7fd8c 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -904,6 +904,14 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c)
 
     setup_force_cpu_cap(X86_FEATURE_ALWAYS);
     fpu__init_system(c);
+
+#ifdef CONFIG_X86_32
+ /*
+ * Regardless of whether PCID is enumerated, the SDM says
+ * that it can't be enabled in 32-bit mode.
+ */
+ setup_clear_cpu_cap(X86_FEATURE_PCID);
+#endif
 }
 
 void __init early_cpu_init(void)

Without this patch, the kernel will try to set the PCIDE bit in the CR4 register in start_secondary which is not allowed in 32-bit mode.
Tagskernel
abrt_hash
URL

Activities

toracat

toracat

2020-12-09 18:43

manager   ~0038055

We will look into this.
toracat

toracat

2020-12-10 06:29

manager   ~0038060

Patch to be added.
centos-3.10-i686-fix-pcid-bug17925.patch (1,037 bytes)   
centos-3.10-i686-fix-pcid-bug17925.patch 

https://bugs.centos.org/view.php?id=17925

When booting a recent 32-bit i686 kernel on a multi-cpu system with 'pcid' cpu feature, only the boot cpu is correctly initialized. The other cpu's fail to initialize, resulting in a badly running or crashing kernel.

The reason is two missing patches present in vanilla upstream kernels:
x86/mm: Disable PCID on 32-bit kernels
x86/mm/32: Move setup_clear_cpu_cap(X86_FEATURE_PCID) earlier

Submitted-by: Jerome Borsboom
Applied-by: Akemi Yagi <toracat@centos.org>

--- a/arch/x86/kernel/cpu/common.c	2020-10-21 10:17:08.000000000 -0700
+++ b/arch/x86/kernel/cpu/common.c	2020-12-09 22:10:47.945329193 -0800
@@ -1131,6 +1131,14 @@ static void __init early_identify_cpu(st
 		this_cpu->c_bsp_init(c);
 
 	cpu_set_bug_bits(c);
+
+#ifdef CONFIG_X86_32
+	/*
+	* Regardless of whether PCID is enumerated, the SDM says
+	* that it can't be enabled in 32-bit mode.
+	*/
+	setup_clear_cpu_cap(X86_FEATURE_PCID);
+#endif
 }
 
 void __init early_cpu_init(void)
toracat

toracat

2020-12-15 23:04

manager   ~0038087

The patch will be applied to kernel-3.10.0-1160.11.1.el7.centos.plus.

Issue History

Date Modified Username Field Change
2020-12-09 12:03 Jerome Borsboom New Issue
2020-12-09 12:03 Jerome Borsboom Tag Attached: kernel
2020-12-09 18:43 toracat Status new => assigned
2020-12-09 18:43 toracat Note Added: 0038055
2020-12-10 06:29 toracat File Added: centos-3.10-i686-fix-pcid-bug17925.patch
2020-12-10 06:29 toracat Note Added: 0038060
2020-12-15 23:04 toracat Note Added: 0038087