speed up cpu_up()
Subsystems (2)
v5 cover speed up cpu_up()
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
PATCH v5 1/2 x86: Add cmdline "cpu_init_udelay=N" to specify cpu_up() delay
From: Len Brown <[email protected]>
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"
--- Documentation/kernel-parameters.txt | 6 ++++++ arch/x86/kernel/smpboot.c | 23 ++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-)
Documentation/kernel-parameters.txt +6 -0
@@ -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>]
arch/x86/kernel/smpboot.c +22 -1
@@ -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" );
Signature · 1 line
2.4.0.rc1
tip-bot for Len Brown
merge bot[tip:x86/apic] x86/smp/boot: Add cmdline "cpu_init_udelay=N" to specify cpu_up() delay
x86/smp/boot: Add cmdline "cpu_init_udelay=N" to specify cpu_up() delay
Commit-ID: d68921f9bd148359e6d01c84aaa2e32bfbd82970 Gitweb: http://git.kernel.org/tip/d68921f9bd148359e6d01c84aaa2e32bfbd82970 Author: Len Brown <[email protected]> AuthorDate: Mon, 11 May 2015 17:27:09 -0400 Committer: Ingo Molnar <[email protected]> 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"
--- Documentation/kernel-parameters.txt | 6 ++++++ arch/x86/kernel/smpboot.c | 23 ++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-)
Documentation/kernel-parameters.txt +6 -0
@@ -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>]
arch/x86/kernel/smpboot.c +22 -1
@@ -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" );
PATCH v5 2/2 x86: remove 10ms delay from cpu_up() on modern processors
In reply to Len BrownFrom: Len Brown <[email protected]>
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.
--- arch/x86/kernel/smpboot.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
arch/x86/kernel/smpboot.c +15 -0
@@ -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 )
Signature · 1 line
2.4.0.rc1
tip-bot for Len Brown
merge bot[tip:x86/apic] x86/smp/boot: Remove 10ms delay from cpu_up() on modern processors
x86/smp/boot: Remove 10ms delay from cpu_up() on modern processors
Commit-ID: 1a744cb356c57303fc97eb15a298032170f841fa Gitweb: http://git.kernel.org/tip/1a744cb356c57303fc97eb15a298032170f841fa Author: Len Brown <[email protected]> AuthorDate: Mon, 11 May 2015 17:27:10 -0400 Committer: Ingo Molnar <[email protected]> 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.
--- arch/x86/kernel/smpboot.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
arch/x86/kernel/smpboot.c +15 -0
@@ -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 )