Re: [PATCH] x86: add a new SMP bring up way for tboot case

From: Borislav Petkov
Date: Tue May 14 2013 - 09:38:43 EST


On Wed, May 15, 2013 at 05:21:25AM +0800, Qiaowei Ren wrote:
> tboot provides a better AP wakeup mechanism based on cpu MWAIT
> feature for OS/VMM. With this mechanism, system will boot faster
> and will NOT require VT to be enabled. But it requires that
> OS/VMM must have support it, otherwise system can never boot up.
>
> Once this mechanism is enabled, tboot will put APs waiting in
> MWAIT loops before launching kernel. kernel can check the new
> flag field in v6 tboot shared page for the hint. If the bit
> TB_FLAG_AP_WAKE_SUPPORT in flag field is set, kernel BSP has
> to write the monitored memory (tboot->ap_wake_trigger) to bring

Now this is a cool way to wake up an AP. It can't get any simpler. :-)

> APs out of MWAIT loops. The sipi vector should be written in
> tboot->ap_wake_addr before waking up APs.
>
> Signed-off-by: Qiaowei Ren <qiaowei.ren@xxxxxxxxx>
> Signed-off-by: Xiaoyan Zhang <xiaoyan.zhang@xxxxxxxxx>
> Signed-off-by: Gang Wei <gang.wei@xxxxxxxxx>
> ---
> arch/x86/kernel/smpboot.c | 21 ++++++++++-----------
> arch/x86/kernel/tboot.c | 36 ++++++++++++++++++++++++++++++++++++
> include/linux/tboot.h | 17 +++++++++++++++++
> 3 files changed, 63 insertions(+), 11 deletions(-)
>
> diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
> index 9f190a2..07f979e 100644
> --- a/arch/x86/kernel/smpboot.c
> +++ b/arch/x86/kernel/smpboot.c
> @@ -787,17 +787,16 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu, struct task_struct *idle)
> }
> }
>
> - /*
> - * Wake up a CPU in difference cases:
> - * - Use the method in the APIC driver if it's defined
> - * Otherwise,
> - * - Use an INIT boot APIC message for APs or NMI for BSP.
> - */
> - if (apic->wakeup_secondary_cpu)
> - boot_error = apic->wakeup_secondary_cpu(apicid, start_ip);
> - else
> - boot_error = wakeup_cpu_via_init_nmi(cpu, start_ip, apicid,
> - &cpu0_nmi_registered);
> + if (!tboot_wake_up(apicid, start_ip)) {
> + /*
> + * Kick the secondary CPU. Use the method in the APIC driver
> + * if it's defined - or use an INIT boot APIC message otherwise:
> + */
> + if (apic->wakeup_secondary_cpu)
> + boot_error = apic->wakeup_secondary_cpu(apicid, start_ip);
> + else
> + boot_error = wakeup_secondary_cpu_via_init(apicid, start_ip);
> + }
>
> if (!boot_error) {
> /*
> diff --git a/arch/x86/kernel/tboot.c b/arch/x86/kernel/tboot.c
> index f84fe00..0ec1947 100644
> --- a/arch/x86/kernel/tboot.c
> +++ b/arch/x86/kernel/tboot.c
> @@ -101,6 +101,8 @@ void __init tboot_probe(void)
> pr_debug("shutdown_entry: 0x%x\n", tboot->shutdown_entry);
> pr_debug("tboot_base: 0x%08x\n", tboot->tboot_base);
> pr_debug("tboot_size: 0x%x\n", tboot->tboot_size);
> + if (tboot->version >= 6)
> + pr_info("flags: 0x%08x\n", tboot->flags);

This should be pr_debug like the rest, no?

--
Regards/Gruss,
Boris.

Sent from a fat crate under my desk. Formatting is fine.
--
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/