From: Nuno Das Neves <nunodasneves@linux.microsoft.com>
To: mhklinux@outlook.com, kys@microsoft.com, haiyangz@microsoft.com,
wei.liu@kernel.org, decui@microsoft.com, tglx@linutronix.de,
mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com,
hpa@zytor.com, lpieralisi@kernel.org, kw@linux.com,
manivannan.sadhasivam@linaro.org, robh@kernel.org,
bhelgaas@google.com, arnd@arndb.de
Cc: x86@kernel.org, linux-hyperv@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org,
linux-arch@vger.kernel.org
Subject: Re: [PATCH 3/7] x86/hyperv: Use hv_hvcall_*() to set up hypercall arguments -- part 1
Date: Thu, 27 Feb 2025 13:07:54 -0800 [thread overview]
Message-ID: <f9b3d2b7-59d6-42b7-b0eb-d26be3405b22@linux.microsoft.com> (raw)
In-Reply-To: <20250226200612.2062-4-mhklinux@outlook.com>
On 2/26/2025 12:06 PM, mhkelley58@gmail.com wrote:
> From: Michael Kelley <mhklinux@outlook.com>
>
> Update hypercall call sites to use the new hv_hvcall_*() functions
> to set up hypercall arguments. Since these functions zero the
> fixed portion of input memory, remove now redundant calls to memset()
> and explicit zero'ing of input fields.
>
> Signed-off-by: Michael Kelley <mhklinux@outlook.com>
> ---
> arch/x86/hyperv/hv_apic.c | 6 ++----
> arch/x86/hyperv/hv_init.c | 5 +----
> arch/x86/hyperv/hv_vtl.c | 8 ++------
> arch/x86/hyperv/irqdomain.c | 10 ++++------
> 4 files changed, 9 insertions(+), 20 deletions(-)
>
> diff --git a/arch/x86/hyperv/hv_apic.c b/arch/x86/hyperv/hv_apic.c
> index f022d5f64fb6..c16f81dd36fc 100644
> --- a/arch/x86/hyperv/hv_apic.c
> +++ b/arch/x86/hyperv/hv_apic.c
> @@ -115,14 +115,12 @@ static bool __send_ipi_mask_ex(const struct cpumask *mask, int vector,
> return false;
>
> local_irq_save(flags);
> - ipi_arg = *this_cpu_ptr(hyperv_pcpu_input_arg);
> -
> + hv_hvcall_in_array(&ipi_arg, sizeof(*ipi_arg),
> + sizeof(ipi_arg->vp_set.bank_contents[0]));
I think the returned "batch size" should be checked to ensure it is not too small to hold the
variable-sized part of the header.
> if (unlikely(!ipi_arg))
> goto ipi_mask_ex_done;
>
While here, is this check really needed? If so, maybe a check for the percpu page(s) could be
baked into hv_hvcall_inout_array()?
> ipi_arg->vector = vector;
> - ipi_arg->reserved = 0;
> - ipi_arg->vp_set.valid_bank_mask = 0;
>
> /*
> * Use HV_GENERIC_SET_ALL and avoid converting cpumask to VP_SET
> diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
> index ddeb40930bc8..c5c9511cb7ed 100644
> --- a/arch/x86/hyperv/hv_init.c
> +++ b/arch/x86/hyperv/hv_init.c
> @@ -400,13 +400,10 @@ static u8 __init get_vtl(void)
> u64 ret;
>
> local_irq_save(flags);
> - input = *this_cpu_ptr(hyperv_pcpu_input_arg);
> - output = *this_cpu_ptr(hyperv_pcpu_output_arg);
>
> - memset(input, 0, struct_size(input, names, 1));
> + hv_hvcall_inout(&input, sizeof(*input), &output, sizeof(*output));
This doesn't look right, this is a rep hypercall taking an array of register names
and outputting an array of register values.
hv_hvcall_inout_array() should be fully utilized (input and output arrays) here.
The current code may actually work, but it will overlap the input and output!
> input->partition_id = HV_PARTITION_ID_SELF;
> input->vp_index = HV_VP_INDEX_SELF;
> - input->input_vtl.as_uint8 = 0;
> input->names[0] = HV_REGISTER_VSM_VP_STATUS;
>
> ret = hv_do_hypercall(control, input, output);
> diff --git a/arch/x86/hyperv/hv_vtl.c b/arch/x86/hyperv/hv_vtl.c
> index 3f4e20d7b724..3dd27d548db6 100644
> --- a/arch/x86/hyperv/hv_vtl.c
> +++ b/arch/x86/hyperv/hv_vtl.c
<snip>
> @@ -185,13 +184,10 @@ static int hv_vtl_apicid_to_vp_id(u32 apic_id)
>
> local_irq_save(irq_flags);
>
> - input = *this_cpu_ptr(hyperv_pcpu_input_arg);
> - memset(input, 0, sizeof(*input));
> + hv_hvcall_inout(&input, sizeof(*input), &output, sizeof(*output));
This has the same issue as above - it is a rep hypercall so needs hv_hvcall_inout_array()
> input->partition_id = HV_PARTITION_ID_SELF;
> input->apic_ids[0] = apic_id;
>
> - output = *this_cpu_ptr(hyperv_pcpu_output_arg);
> -
> control = HV_HYPERCALL_REP_COMP_1 | HVCALL_GET_VP_ID_FROM_APIC_ID;
> status = hv_do_hypercall(control, input, output);
> ret = output[0];
> diff --git a/arch/x86/hyperv/irqdomain.c b/arch/x86/hyperv/irqdomain.c
> index 64b921360b0f..803b1a945c5c 100644
> --- a/arch/x86/hyperv/irqdomain.c
> +++ b/arch/x86/hyperv/irqdomain.c
> @@ -24,11 +24,11 @@ static int hv_map_interrupt(union hv_device_id device_id, bool level,
>
> local_irq_save(flags);
>
> - input = *this_cpu_ptr(hyperv_pcpu_input_arg);
> - output = *this_cpu_ptr(hyperv_pcpu_output_arg);
> + hv_hvcall_inout_array(&input, sizeof(*input),
> + sizeof(input->interrupt_descriptor.target.vp_set.bank_contents[0]),
> + &output, sizeof(*output), 0);
As noted before I think the batch size should be checked to ensure it is large enough.
Side note - it seems in this hypercall, nr_banks + 1 is used as the varhead size, which
counts the vp valid mask, but this is not the case in __send_ipi_mask_ex(). Do you happen
to know why that might be?
Thanks,
Nuno
>
> intr_desc = &input->interrupt_descriptor;
> - memset(input, 0, sizeof(*input));
> input->partition_id = hv_current_partition_id;
> input->device_id = device_id.as_uint64;
> intr_desc->interrupt_type = HV_X64_INTERRUPT_TYPE_FIXED;
<snip>
next prev parent reply other threads:[~2025-02-27 21:07 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-26 20:06 [PATCH 0/7] hyperv: Introduce new way to manage hypercall args mhkelley58
2025-02-26 20:06 ` [PATCH 1/7] x86/hyperv: Fix output argument to hypercall that changes page visibility mhkelley58
2025-02-26 22:59 ` Nuno Das Neves
2025-03-10 0:22 ` Wei Liu
2025-02-26 20:06 ` [PATCH 2/7] Drivers: hv: Introduce hv_hvcall_*() functions for hypercall arguments mhkelley58
2025-02-27 0:14 ` Nuno Das Neves
2025-02-27 1:50 ` Michael Kelley
2025-02-27 20:09 ` Nuno Das Neves
2025-02-26 20:06 ` [PATCH 3/7] x86/hyperv: Use hv_hvcall_*() to set up hypercall arguments -- part 1 mhkelley58
2025-02-27 21:07 ` Nuno Das Neves [this message]
2025-02-28 0:50 ` Michael Kelley
2025-02-26 20:06 ` [PATCH 4/7] x86/hyperv: Use hv_hvcall_*() to set up hypercall arguments -- part 2 mhkelley58
2025-02-26 20:06 ` [PATCH 5/7] Drivers: hv: Use hv_hvcall_*() to set up hypercall arguments mhkelley58
2025-02-26 20:06 ` [PATCH 6/7] PCI: " mhkelley58
2025-02-27 20:29 ` Bjorn Helgaas
2025-03-05 17:24 ` Wei Liu
2025-02-26 20:06 ` [PATCH 7/7] Drivers: hv: Replace hyperv_pcpu_input/output_arg with hyperv_pcpu_arg mhkelley58
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=f9b3d2b7-59d6-42b7-b0eb-d26be3405b22@linux.microsoft.com \
--to=nunodasneves@linux.microsoft.com \
--cc=arnd@arndb.de \
--cc=bhelgaas@google.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=decui@microsoft.com \
--cc=haiyangz@microsoft.com \
--cc=hpa@zytor.com \
--cc=kw@linux.com \
--cc=kys@microsoft.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-hyperv@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lpieralisi@kernel.org \
--cc=manivannan.sadhasivam@linaro.org \
--cc=mhklinux@outlook.com \
--cc=mingo@redhat.com \
--cc=robh@kernel.org \
--cc=tglx@linutronix.de \
--cc=wei.liu@kernel.org \
--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.