speed up cpu_up()
Subsystems (2)
v4 cover speed up cpu_up()
v3, but re-based to tip
(a 1-line change to track new location of the mdelay(10))
thanks,
Len Brown, Intel Open Source Technology Center
PATCH v4 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"
Signed-off-by Len Brown <[email protected]>
--- Documentation/kernel-parameters.txt | 6 ++++++ arch/x86/kernel/smpboot.c | 23 ++++++++++++++++++++++- arch/x86/kernel/smpboot.c.rej | 11 +++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 arch/x86/kernel/smpboot.c.rej
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" );
arch/x86/kernel/smpboot.c.rej new file +11 -0
@@ -0,0 +1,11 @@ +--- arch/x86/kernel/smpboot.c ++++ arch/x86/kernel/smpboot.c +@@ -607,7 +628,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); ++ udelay(init_udelay); + + pr_debug("Deasserting INIT\n"); +
Signature · 1 line
2.4.0.rc1
PATCH v4 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.
Signed-off-by Len Brown <[email protected]>
--- 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