From: Wei Liu <wei.liu@kernel.org>
To: Roman Kisel <romank@linux.microsoft.com>
Cc: hpa@zytor.com, kys@microsoft.com, bp@alien8.de,
dave.hansen@linux.intel.com, decui@microsoft.com,
eahariha@linux.microsoft.com, haiyangz@microsoft.com,
mingo@redhat.com, mhklinux@outlook.com,
nunodasneves@linux.microsoft.com, tglx@linutronix.de,
tiala@microsoft.com, wei.liu@kernel.org,
linux-hyperv@vger.kernel.org, linux-kernel@vger.kernel.org,
x86@kernel.org, apais@microsoft.com, benhill@microsoft.com,
ssengar@microsoft.com, sunilmut@microsoft.com, vdso@hexbites.dev
Subject: Re: [PATCH 2/2] hyperv: Do not overlap the input and output hypercall areas in get_vtl(void)
Date: Thu, 19 Dec 2024 02:42:37 +0000 [thread overview]
Message-ID: <Z2OIHRF-cJ92IBv2@liuwe-devbox-debian-v2> (raw)
In-Reply-To: <20241218205421.319969-3-romank@linux.microsoft.com>
On Wed, Dec 18, 2024 at 12:54:21PM -0800, Roman Kisel wrote:
> The Top-Level Functional Specification for Hyper-V, Section 3.6 [1, 2], disallows
> overlapping of the input and output hypercall areas, and get_vtl(void) does
> overlap them.
>
> To fix this, enable allocation of the output hypercall pages when running in
> the VTL mode and use the output hypercall page of the current vCPU for the
> hypercall.
>
> [1] https://learn.microsoft.com/en-us/virtualization/hyper-v-on-windows/tlfs/hypercall-interface
> [2] https://github.com/MicrosoftDocs/Virtualization-Documentation/tree/main/tlfs
>
> Fixes: 8387ce06d70b ("x86/hyperv: Set Virtual Trust Level in VMBus init message")
> Signed-off-by: Roman Kisel <romank@linux.microsoft.com>
> ---
> arch/x86/hyperv/hv_init.c | 2 +-
> drivers/hv/hv_common.c | 6 +++---
> 2 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
> index c7185c6a290b..90c9ea00273e 100644
> --- a/arch/x86/hyperv/hv_init.c
> +++ b/arch/x86/hyperv/hv_init.c
> @@ -422,7 +422,7 @@ static u8 __init get_vtl(void)
>
> local_irq_save(flags);
> input = *this_cpu_ptr(hyperv_pcpu_input_arg);
> - output = (struct hv_get_vp_registers_output *)input;
> + output = *this_cpu_ptr(hyperv_pcpu_output_arg);
You can do
output = (char *)input + HV_HYP_PAGE_SIZE / 2;
to avoid the extra allocation.
The input and output structures surely won't take up half of the page.
Thanks,
Wei.
>
> memset(input, 0, struct_size(input, names, 1));
> input->partition_id = HV_PARTITION_ID_SELF;
> diff --git a/drivers/hv/hv_common.c b/drivers/hv/hv_common.c
> index c4fd07d9bf1a..5178beed6ca8 100644
> --- a/drivers/hv/hv_common.c
> +++ b/drivers/hv/hv_common.c
> @@ -340,7 +340,7 @@ int __init hv_common_init(void)
> BUG_ON(!hyperv_pcpu_input_arg);
>
> /* Allocate the per-CPU state for output arg for root */
> - if (hv_root_partition) {
> + if (hv_root_partition || IS_ENABLED(CONFIG_HYPERV_VTL_MODE)) {
> hyperv_pcpu_output_arg = alloc_percpu(void *);
> BUG_ON(!hyperv_pcpu_output_arg);
> }
> @@ -435,7 +435,7 @@ int hv_common_cpu_init(unsigned int cpu)
> void **inputarg, **outputarg;
> u64 msr_vp_index;
> gfp_t flags;
> - int pgcount = hv_root_partition ? 2 : 1;
> + const int pgcount = (hv_root_partition || IS_ENABLED(CONFIG_HYPERV_VTL_MODE)) ? 2 : 1;
> void *mem;
> int ret;
>
> @@ -453,7 +453,7 @@ int hv_common_cpu_init(unsigned int cpu)
> if (!mem)
> return -ENOMEM;
>
> - if (hv_root_partition) {
> + if (hv_root_partition || IS_ENABLED(CONFIG_HYPERV_VTL_MODE)) {
> outputarg = (void **)this_cpu_ptr(hyperv_pcpu_output_arg);
> *outputarg = (char *)mem + HV_HYP_PAGE_SIZE;
> }
> --
> 2.34.1
>
next prev parent reply other threads:[~2024-12-19 2:42 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-18 20:54 [PATCH 0/2] hyperv: Fixes for get_vtl(void) Roman Kisel
2024-12-18 20:54 ` [PATCH 1/2] hyperv: Fix pointer type for the output of the hypercall in get_vtl(void) Roman Kisel
2024-12-19 2:45 ` Wei Liu
2024-12-19 17:26 ` Roman Kisel
2024-12-19 18:40 ` Nuno Das Neves
2024-12-19 19:11 ` Roman Kisel
2024-12-19 19:13 ` Easwar Hariharan
2024-12-19 19:23 ` Nuno Das Neves
2024-12-19 19:32 ` Easwar Hariharan
2024-12-19 20:03 ` Roman Kisel
2024-12-19 20:00 ` Roman Kisel
2024-12-19 20:04 ` Easwar Hariharan
2024-12-19 20:18 ` Roman Kisel
2024-12-18 20:54 ` [PATCH 2/2] hyperv: Do not overlap the input and output hypercall areas " Roman Kisel
2024-12-19 2:42 ` Wei Liu [this message]
2024-12-19 18:19 ` Roman Kisel
2024-12-19 21:35 ` Wei Liu
2024-12-19 21:37 ` Michael Kelley
2024-12-19 23:39 ` Roman Kisel
2024-12-20 2:01 ` Michael Kelley
2024-12-20 19:13 ` Roman Kisel
2024-12-20 22:42 ` Michael Kelley
2024-12-23 20:30 ` Roman Kisel
2024-12-24 16:45 ` Michael Kelley
2024-12-26 16:45 ` Roman Kisel
2024-12-26 20:04 ` Michael Kelley
2024-12-26 20:42 ` Roman Kisel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Z2OIHRF-cJ92IBv2@liuwe-devbox-debian-v2 \
--to=wei.liu@kernel.org \
--cc=apais@microsoft.com \
--cc=benhill@microsoft.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=decui@microsoft.com \
--cc=eahariha@linux.microsoft.com \
--cc=haiyangz@microsoft.com \
--cc=hpa@zytor.com \
--cc=kys@microsoft.com \
--cc=linux-hyperv@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mhklinux@outlook.com \
--cc=mingo@redhat.com \
--cc=nunodasneves@linux.microsoft.com \
--cc=romank@linux.microsoft.com \
--cc=ssengar@microsoft.com \
--cc=sunilmut@microsoft.com \
--cc=tglx@linutronix.de \
--cc=tiala@microsoft.com \
--cc=vdso@hexbites.dev \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.