* [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: 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
* [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
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.