Преглед изворни кода

Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 fixes from Peter Anvin:
 "Two very small changes: one fix for the vSMP Foundation platform, and
  one to help LLVM not choke on options it doesn't understand (although
  it probably should)"

* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/vsmp: Fix irq routing
  x86: LLVMLinux: Wrap -mno-80387 with cc-option
Linus Torvalds пре 11 година
родитељ
комит
0845e11c2a
2 измењених фајлова са 13 додато и 2 уклоњено
  1. 3 1
      arch/x86/Makefile
  2. 10 1
      arch/x86/kernel/vsmp_64.c

+ 3 - 1
arch/x86/Makefile

@@ -83,7 +83,9 @@ else
         KBUILD_CFLAGS += -m64
         KBUILD_CFLAGS += -m64
 
 
         # Don't autogenerate traditional x87, MMX or SSE instructions
         # Don't autogenerate traditional x87, MMX or SSE instructions
-        KBUILD_CFLAGS += -mno-mmx -mno-sse -mno-80387 -mno-fp-ret-in-387
+        KBUILD_CFLAGS += -mno-mmx -mno-sse
+        KBUILD_CFLAGS += $(call cc-option,-mno-80387)
+        KBUILD_CFLAGS += $(call cc-option,-mno-fp-ret-in-387)
 
 
 	# Use -mpreferred-stack-boundary=3 if supported.
 	# Use -mpreferred-stack-boundary=3 if supported.
 	KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=3)
 	KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=3)

+ 10 - 1
arch/x86/kernel/vsmp_64.c

@@ -26,6 +26,9 @@
 
 
 #define TOPOLOGY_REGISTER_OFFSET 0x10
 #define TOPOLOGY_REGISTER_OFFSET 0x10
 
 
+/* Flag below is initialized once during vSMP PCI initialization. */
+static int irq_routing_comply = 1;
+
 #if defined CONFIG_PCI && defined CONFIG_PARAVIRT
 #if defined CONFIG_PCI && defined CONFIG_PARAVIRT
 /*
 /*
  * Interrupt control on vSMPowered systems:
  * Interrupt control on vSMPowered systems:
@@ -101,6 +104,10 @@ static void __init set_vsmp_pv_ops(void)
 #ifdef CONFIG_SMP
 #ifdef CONFIG_SMP
 	if (cap & ctl & BIT(8)) {
 	if (cap & ctl & BIT(8)) {
 		ctl &= ~BIT(8);
 		ctl &= ~BIT(8);
+
+		/* Interrupt routing set to ignore */
+		irq_routing_comply = 0;
+
 #ifdef CONFIG_PROC_FS
 #ifdef CONFIG_PROC_FS
 		/* Don't let users change irq affinity via procfs */
 		/* Don't let users change irq affinity via procfs */
 		no_irq_affinity = 1;
 		no_irq_affinity = 1;
@@ -218,7 +225,9 @@ static void vsmp_apic_post_init(void)
 {
 {
 	/* need to update phys_pkg_id */
 	/* need to update phys_pkg_id */
 	apic->phys_pkg_id = apicid_phys_pkg_id;
 	apic->phys_pkg_id = apicid_phys_pkg_id;
-	apic->vector_allocation_domain = fill_vector_allocation_domain;
+
+	if (!irq_routing_comply)
+		apic->vector_allocation_domain = fill_vector_allocation_domain;
 }
 }
 
 
 void __init vsmp_init(void)
 void __init vsmp_init(void)