lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <ZeVpG07p9ayjk7yb@liuwe-devbox-debian-v2>
Date: Mon, 4 Mar 2024 06:24:27 +0000
From: Wei Liu <wei.liu@...nel.org>
To: Saurabh Sengar <ssengar@...ux.microsoft.com>
Cc: kys@...rosoft.com, haiyangz@...rosoft.com, wei.liu@...nel.org,
	decui@...rosoft.com, tglx@...utronix.de, mingo@...hat.com,
	bp@...en8.de, dave.hansen@...ux.intel.com, x86@...nel.org,
	hpa@...or.com, dwmw@...zon.co.uk, peterz@...radead.org,
	linux-hyperv@...r.kernel.org, linux-kernel@...r.kernel.org,
	ssengar@...rosoft.com, mhklinux@...look.com
Subject: Re: [PATCH v3] x86/hyperv: Use per cpu initial stack for vtl context

On Sun, Mar 03, 2024 at 12:01:36AM -0800, Saurabh Sengar wrote:
> Currently, the secondary CPUs in Hyper-V VTL context lack support for
> parallel startup. Therefore, relying on the single initial_stack fetched
> from the current task structure suffices for all vCPUs.
> 
> However, common initial_stack risks stack corruption when parallel startup
> is enabled. In order to facilitate parallel startup, use the initial_stack
> from the per CPU idle thread instead of the current task.
> 
> Fixes: 18415f33e2ac ("cpu/hotplug: Allow "parallel" bringup up to CPUHP_BP_KICK_AP_STATE")

I don't think this patch is buggy. Instead, it exposes an assumption in
the VTL code. So this either should be dropped or point to the patch
which introduces the assumption.

Let me know what you would prefer.

Thanks,
Wei.

> Signed-off-by: Saurabh Sengar <ssengar@...ux.microsoft.com>
> Reviewed-by: Michael Kelley <mhklinux@...look.com>
> ---
> [V3]
>  - Added the VTL code dependency on SMP to fix kernel build error
>    when SMP is disabled.
> 
>  arch/x86/hyperv/hv_vtl.c | 19 +++++++++++++++----
>  drivers/hv/Kconfig       |  1 +
>  2 files changed, 16 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/x86/hyperv/hv_vtl.c b/arch/x86/hyperv/hv_vtl.c
> index 804b629ea49d..b4e233954d0f 100644
> --- a/arch/x86/hyperv/hv_vtl.c
> +++ b/arch/x86/hyperv/hv_vtl.c
> @@ -12,6 +12,7 @@
>  #include <asm/i8259.h>
>  #include <asm/mshyperv.h>
>  #include <asm/realmode.h>
> +#include <../kernel/smpboot.h>
>  
>  extern struct boot_params boot_params;
>  static struct real_mode_header hv_vtl_real_mode_header;
> @@ -58,7 +59,7 @@ static void hv_vtl_ap_entry(void)
>  	((secondary_startup_64_fn)secondary_startup_64)(&boot_params, &boot_params);
>  }
>  
> -static int hv_vtl_bringup_vcpu(u32 target_vp_index, u64 eip_ignored)
> +static int hv_vtl_bringup_vcpu(u32 target_vp_index, int cpu, u64 eip_ignored)
>  {
>  	u64 status;
>  	int ret = 0;
> @@ -72,7 +73,9 @@ static int hv_vtl_bringup_vcpu(u32 target_vp_index, u64 eip_ignored)
>  	struct ldttss_desc *ldt;
>  	struct desc_struct *gdt;
>  
> -	u64 rsp = current->thread.sp;
> +	struct task_struct *idle = idle_thread_get(cpu);
> +	u64 rsp = (unsigned long)idle->thread.sp;
> +
>  	u64 rip = (u64)&hv_vtl_ap_entry;
>  
>  	native_store_gdt(&gdt_ptr);
> @@ -199,7 +202,15 @@ static int hv_vtl_apicid_to_vp_id(u32 apic_id)
>  
>  static int hv_vtl_wakeup_secondary_cpu(u32 apicid, unsigned long start_eip)
>  {
> -	int vp_id;
> +	int vp_id, cpu;
> +
> +	/* Find the logical CPU for the APIC ID */
> +	for_each_present_cpu(cpu) {
> +		if (arch_match_cpu_phys_id(cpu, apicid))
> +			break;
> +	}
> +	if (cpu >= nr_cpu_ids)
> +		return -EINVAL;
>  
>  	pr_debug("Bringing up CPU with APIC ID %d in VTL2...\n", apicid);
>  	vp_id = hv_vtl_apicid_to_vp_id(apicid);
> @@ -213,7 +224,7 @@ static int hv_vtl_wakeup_secondary_cpu(u32 apicid, unsigned long start_eip)
>  		return -EINVAL;
>  	}
>  
> -	return hv_vtl_bringup_vcpu(vp_id, start_eip);
> +	return hv_vtl_bringup_vcpu(vp_id, cpu, start_eip);
>  }
>  
>  int __init hv_vtl_early_init(void)
> diff --git a/drivers/hv/Kconfig b/drivers/hv/Kconfig
> index 00242107d62e..862c47b191af 100644
> --- a/drivers/hv/Kconfig
> +++ b/drivers/hv/Kconfig
> @@ -16,6 +16,7 @@ config HYPERV
>  config HYPERV_VTL_MODE
>  	bool "Enable Linux to boot in VTL context"
>  	depends on X86_64 && HYPERV
> +	depends on SMP
>  	default n
>  	help
>  	  Virtual Secure Mode (VSM) is a set of hypervisor capabilities and
> -- 
> 2.34.1
> 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ