All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2 v5] speed up cpu_up()
@ 2015-05-11 21:27 Len Brown
  2015-05-11 21:27 ` [PATCH 1/2] x86: Add cmdline "cpu_init_udelay=N" to specify cpu_up() delay Len Brown
  0 siblings, 1 reply; 5+ messages in thread
From: Len Brown @ 2015-05-11 21:27 UTC (permalink / raw)
  To: x86, linux-pm, linux-kernel

Ingo,
v5 is a re-send of v4, but without the bogus .reg file -- sorry for sending noise.

Thanks, Alan, for pointing it out.

thanks,
-Len

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/2] x86: Add cmdline "cpu_init_udelay=N" to specify cpu_up() delay
  2015-05-11 21:27 [PATCH 0/2 v5] speed up cpu_up() Len Brown
@ 2015-05-11 21:27 ` Len Brown
  2015-05-11 21:27   ` [PATCH 2/2] x86: remove 10ms delay from cpu_up() on modern processors Len Brown
  2015-05-12  7:39   ` [tip:x86/apic] x86/smp/boot: Add cmdline "cpu_init_udelay=N" to specify cpu_up() delay tip-bot for Len Brown
  0 siblings, 2 replies; 5+ messages in thread
From: Len Brown @ 2015-05-11 21:27 UTC (permalink / raw)
  To: x86, linux-pm, linux-kernel; +Cc: Len Brown

From: Len Brown <len.brown@intel.com>

No change to default behavior.

Replace the hard-coded mdelay(10) in cpu_up() with a variable udelay,
that is set to a defined default -- rather than a magic number.

Add a boot-time override, "cpu_init_udelay=N"

Signed-off-by: Len Brown <len.brown@intel.com>
---
 Documentation/kernel-parameters.txt |  6 ++++++
 arch/x86/kernel/smpboot.c           | 23 ++++++++++++++++++++++-
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 61ab162..a320a41 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -746,6 +746,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
 	cpuidle.off=1	[CPU_IDLE]
 			disable the cpuidle sub-system
 
+	cpu_init_udelay=N
+			[X86] Delay for N microsec between assert and de-assert
+			of APIC INIT to start processors.  This delay occurs
+			on every CPU online, such as boot, and resume from suspend.
+			Default: 10000
+
 	cpcihp_generic=	[HW,PCI] Generic port I/O CompactPCI driver
 			Format:
 			<first_slot>,<last_slot>,<port>,<enum_bit>[,<debug>]
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 51203f6..0629a8e 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -514,6 +514,27 @@ void __inquire_remote_apic(int apicid)
 }
 
 /*
+ * The Multiprocessor Specification 1.4 (1997) example code suggests
+ * that there should be a 10ms delay between the BSP asserting INIT
+ * and de-asserting INIT, when starting a remote processor.
+ * But that slows boot and resume on modern processors, which include
+ * many cores and don't require that delay.
+ *
+ * Cmdline "init_cpu_udelay=" is available to over-ride this delay.
+ */
+#define UDELAY_10MS_DEFAULT 10000
+
+static unsigned int init_udelay = UDELAY_10MS_DEFAULT;
+
+static int __init cpu_init_udelay(char *str)
+{
+	get_option(&str, &init_udelay);
+
+	return 0;
+}
+early_param("cpu_init_udelay", cpu_init_udelay);
+
+/*
  * Poke the other CPU in the eye via NMI to wake it up. Remember that the normal
  * INIT, INIT, STARTUP sequence will reset the chip hard for us, and this
  * won't ... remember to clear down the APIC, etc later.
@@ -584,7 +605,7 @@ wakeup_secondary_cpu_via_init(int phys_apicid, unsigned long start_eip)
 		pr_debug("Waiting for send to finish...\n");
 		send_status = safe_apic_wait_icr_idle();
 
-		mdelay(10);
+		mdelay(init_udelay);
 
 		pr_debug("Deasserting INIT\n");
 
-- 
2.4.0.rc1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/2] x86: remove 10ms delay from cpu_up() on modern processors
  2015-05-11 21:27 ` [PATCH 1/2] x86: Add cmdline "cpu_init_udelay=N" to specify cpu_up() delay Len Brown
@ 2015-05-11 21:27   ` Len Brown
  2015-05-12  7:39     ` [tip:x86/apic] x86/smp/boot: Remove " tip-bot for Len Brown
  2015-05-12  7:39   ` [tip:x86/apic] x86/smp/boot: Add cmdline "cpu_init_udelay=N" to specify cpu_up() delay tip-bot for Len Brown
  1 sibling, 1 reply; 5+ messages in thread
From: Len Brown @ 2015-05-11 21:27 UTC (permalink / raw)
  To: x86, linux-pm, linux-kernel; +Cc: Len Brown

From: Len Brown <len.brown@intel.com>

Modern processor familes do not require the 10ms delay
in cpu_up() to de-assert INIT.  This speeds up boot
and resume by 10ms per (application) processor.

Signed-off-by: Len Brown <len.brown@intel.com>
---
 arch/x86/kernel/smpboot.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 0629a8e..85bd6aa 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -521,6 +521,7 @@ void __inquire_remote_apic(int apicid)
  * many cores and don't require that delay.
  *
  * Cmdline "init_cpu_udelay=" is available to over-ride this delay.
+ * Modern processor families are quirked to remove the delay entirely.
  */
 #define UDELAY_10MS_DEFAULT 10000
 
@@ -534,6 +535,18 @@ static int __init cpu_init_udelay(char *str)
 }
 early_param("cpu_init_udelay", cpu_init_udelay);
 
+static void __init smp_quirk_init_udelay(void)
+{
+	/* if cmdline changed it from default, leave it alone */
+	if (init_udelay != UDELAY_10MS_DEFAULT)
+		return;
+
+	/* if modern processor, use no delay */
+	if (((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) && (boot_cpu_data.x86 == 6)) ||
+	    ((boot_cpu_data.x86_vendor == X86_VENDOR_AMD) && (boot_cpu_data.x86 >= 0xF)))
+		init_udelay = 0;
+}
+
 /*
  * Poke the other CPU in the eye via NMI to wake it up. Remember that the normal
  * INIT, INIT, STARTUP sequence will reset the chip hard for us, and this
@@ -1210,6 +1223,8 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)
 		uv_system_init();
 
 	set_mtrr_aps_delayed_init();
+
+	smp_quirk_init_udelay();
 }
 
 void arch_enable_nonboot_cpus_begin(void)
-- 
2.4.0.rc1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [tip:x86/apic] x86/smp/boot: Add cmdline "cpu_init_udelay=N" to specify cpu_up() delay
  2015-05-11 21:27 ` [PATCH 1/2] x86: Add cmdline "cpu_init_udelay=N" to specify cpu_up() delay Len Brown
  2015-05-11 21:27   ` [PATCH 2/2] x86: remove 10ms delay from cpu_up() on modern processors Len Brown
@ 2015-05-12  7:39   ` tip-bot for Len Brown
  1 sibling, 0 replies; 5+ messages in thread
From: tip-bot for Len Brown @ 2015-05-12  7:39 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: alan, len.brown, torvalds, linux-kernel, tglx, bp, hpa, mingo,
	arjan, jschoenh

Commit-ID:  d68921f9bd148359e6d01c84aaa2e32bfbd82970
Gitweb:     http://git.kernel.org/tip/d68921f9bd148359e6d01c84aaa2e32bfbd82970
Author:     Len Brown <len.brown@intel.com>
AuthorDate: Mon, 11 May 2015 17:27:09 -0400
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Tue, 12 May 2015 08:54:32 +0200

x86/smp/boot: Add cmdline "cpu_init_udelay=N" to specify cpu_up() delay

No change to default behavior.

Replace the hard-coded mdelay(10) in cpu_up() with a variable
udelay, that is set to a defined default -- rather than a magic
number.

Add a boot-time override, "cpu_init_udelay=N"

Signed-off-by: Len Brown <len.brown@intel.com>
Cc: Alan Cox <alan@linux.intel.com>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Jan H. Schönherr <jschoenh@amazon.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/2fe8e6c798e8def271122f62df9bbf58dc283e2a.1431379433.git.len.brown@intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 Documentation/kernel-parameters.txt |  6 ++++++
 arch/x86/kernel/smpboot.c           | 23 ++++++++++++++++++++++-
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 61ab162..a320a41 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -746,6 +746,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
 	cpuidle.off=1	[CPU_IDLE]
 			disable the cpuidle sub-system
 
+	cpu_init_udelay=N
+			[X86] Delay for N microsec between assert and de-assert
+			of APIC INIT to start processors.  This delay occurs
+			on every CPU online, such as boot, and resume from suspend.
+			Default: 10000
+
 	cpcihp_generic=	[HW,PCI] Generic port I/O CompactPCI driver
 			Format:
 			<first_slot>,<last_slot>,<port>,<enum_bit>[,<debug>]
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 51203f6..0629a8e 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -514,6 +514,27 @@ void __inquire_remote_apic(int apicid)
 }
 
 /*
+ * The Multiprocessor Specification 1.4 (1997) example code suggests
+ * that there should be a 10ms delay between the BSP asserting INIT
+ * and de-asserting INIT, when starting a remote processor.
+ * But that slows boot and resume on modern processors, which include
+ * many cores and don't require that delay.
+ *
+ * Cmdline "init_cpu_udelay=" is available to over-ride this delay.
+ */
+#define UDELAY_10MS_DEFAULT 10000
+
+static unsigned int init_udelay = UDELAY_10MS_DEFAULT;
+
+static int __init cpu_init_udelay(char *str)
+{
+	get_option(&str, &init_udelay);
+
+	return 0;
+}
+early_param("cpu_init_udelay", cpu_init_udelay);
+
+/*
  * Poke the other CPU in the eye via NMI to wake it up. Remember that the normal
  * INIT, INIT, STARTUP sequence will reset the chip hard for us, and this
  * won't ... remember to clear down the APIC, etc later.
@@ -584,7 +605,7 @@ wakeup_secondary_cpu_via_init(int phys_apicid, unsigned long start_eip)
 		pr_debug("Waiting for send to finish...\n");
 		send_status = safe_apic_wait_icr_idle();
 
-		mdelay(10);
+		mdelay(init_udelay);
 
 		pr_debug("Deasserting INIT\n");
 

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [tip:x86/apic] x86/smp/boot: Remove 10ms delay from cpu_up() on modern processors
  2015-05-11 21:27   ` [PATCH 2/2] x86: remove 10ms delay from cpu_up() on modern processors Len Brown
@ 2015-05-12  7:39     ` tip-bot for Len Brown
  0 siblings, 0 replies; 5+ messages in thread
From: tip-bot for Len Brown @ 2015-05-12  7:39 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: hpa, mingo, linux-kernel, jschoenh, arjan, tglx, len.brown,
	torvalds, alan, bp

Commit-ID:  1a744cb356c57303fc97eb15a298032170f841fa
Gitweb:     http://git.kernel.org/tip/1a744cb356c57303fc97eb15a298032170f841fa
Author:     Len Brown <len.brown@intel.com>
AuthorDate: Mon, 11 May 2015 17:27:10 -0400
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Tue, 12 May 2015 08:54:33 +0200

x86/smp/boot: Remove 10ms delay from cpu_up() on modern processors

Modern processor familes do not require the 10ms delay
in cpu_up() to de-assert INIT.  This speeds up boot
and resume by 10ms per (application) processor.

Signed-off-by: Len Brown <len.brown@intel.com>
Cc: Alan Cox <alan@linux.intel.com>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Jan H. Schönherr <jschoenh@amazon.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/021ce30c88f216ad39686646421194dc25671e55.1431379433.git.len.brown@intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 arch/x86/kernel/smpboot.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 0629a8e..85bd6aa 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -521,6 +521,7 @@ void __inquire_remote_apic(int apicid)
  * many cores and don't require that delay.
  *
  * Cmdline "init_cpu_udelay=" is available to over-ride this delay.
+ * Modern processor families are quirked to remove the delay entirely.
  */
 #define UDELAY_10MS_DEFAULT 10000
 
@@ -534,6 +535,18 @@ static int __init cpu_init_udelay(char *str)
 }
 early_param("cpu_init_udelay", cpu_init_udelay);
 
+static void __init smp_quirk_init_udelay(void)
+{
+	/* if cmdline changed it from default, leave it alone */
+	if (init_udelay != UDELAY_10MS_DEFAULT)
+		return;
+
+	/* if modern processor, use no delay */
+	if (((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) && (boot_cpu_data.x86 == 6)) ||
+	    ((boot_cpu_data.x86_vendor == X86_VENDOR_AMD) && (boot_cpu_data.x86 >= 0xF)))
+		init_udelay = 0;
+}
+
 /*
  * Poke the other CPU in the eye via NMI to wake it up. Remember that the normal
  * INIT, INIT, STARTUP sequence will reset the chip hard for us, and this
@@ -1210,6 +1223,8 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)
 		uv_system_init();
 
 	set_mtrr_aps_delayed_init();
+
+	smp_quirk_init_udelay();
 }
 
 void arch_enable_nonboot_cpus_begin(void)

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2015-05-12  7:41 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-05-11 21:27 [PATCH 0/2 v5] speed up cpu_up() Len Brown
2015-05-11 21:27 ` [PATCH 1/2] x86: Add cmdline "cpu_init_udelay=N" to specify cpu_up() delay Len Brown
2015-05-11 21:27   ` [PATCH 2/2] x86: remove 10ms delay from cpu_up() on modern processors Len Brown
2015-05-12  7:39     ` [tip:x86/apic] x86/smp/boot: Remove " tip-bot for Len Brown
2015-05-12  7:39   ` [tip:x86/apic] x86/smp/boot: Add cmdline "cpu_init_udelay=N" to specify cpu_up() delay tip-bot for Len Brown

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.