lkml.org 
[lkml]   [2021]   [Jan]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 10/16] x86/hyperv: implement and use hv_smp_prepare_cpus
    Date
    Microsoft Hypervisor requires the root partition to make a few
    hypercalls to setup application processors before they can be used.

    Signed-off-by: Lillian Grassin-Drake <ligrassi@microsoft.com>
    Signed-off-by: Sunil Muthuswamy <sunilmut@microsoft.com>
    Co-Developed-by: Lillian Grassin-Drake <ligrassi@microsoft.com>
    Co-Developed-by: Sunil Muthuswamy <sunilmut@microsoft.com>
    Signed-off-by: Wei Liu <wei.liu@kernel.org>
    ---
    CPU hotplug and unplug is not yet supported in this setup, so those
    paths remain untouched.

    v3: Always call native SMP preparation function.
    ---
    arch/x86/kernel/cpu/mshyperv.c | 29 +++++++++++++++++++++++++++++
    1 file changed, 29 insertions(+)

    diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
    index c376d191a260..13d3b6dd21a3 100644
    --- a/arch/x86/kernel/cpu/mshyperv.c
    +++ b/arch/x86/kernel/cpu/mshyperv.c
    @@ -31,6 +31,7 @@
    #include <asm/reboot.h>
    #include <asm/nmi.h>
    #include <clocksource/hyperv_timer.h>
    +#include <asm/numa.h>

    /* Is Linux running as the root partition? */
    bool hv_root_partition;
    @@ -212,6 +213,32 @@ static void __init hv_smp_prepare_boot_cpu(void)
    hv_init_spinlocks();
    #endif
    }
    +
    +static void __init hv_smp_prepare_cpus(unsigned int max_cpus)
    +{
    +#ifdef CONFIG_X86_64
    + int i;
    + int ret;
    +#endif
    +
    + native_smp_prepare_cpus(max_cpus);
    +
    +#ifdef CONFIG_X86_64
    + for_each_present_cpu(i) {
    + if (i == 0)
    + continue;
    + ret = hv_call_add_logical_proc(numa_cpu_node(i), i, cpu_physical_id(i));
    + BUG_ON(ret);
    + }
    +
    + for_each_present_cpu(i) {
    + if (i == 0)
    + continue;
    + ret = hv_call_create_vp(numa_cpu_node(i), hv_current_partition_id, i, i);
    + BUG_ON(ret);
    + }
    +#endif
    +}
    #endif

    static void __init ms_hyperv_init_platform(void)
    @@ -368,6 +395,8 @@ static void __init ms_hyperv_init_platform(void)

    # ifdef CONFIG_SMP
    smp_ops.smp_prepare_boot_cpu = hv_smp_prepare_boot_cpu;
    + if (hv_root_partition)
    + smp_ops.smp_prepare_cpus = hv_smp_prepare_cpus;
    # endif

    /*
    --
    2.20.1
    \
     
     \ /
      Last update: 2021-01-20 15:00    [W:7.141 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site