From: Nuno Das Neves <nunodasneves@linux.microsoft.com>
To: Michael Kelley <mhklinux@outlook.com>,
"linux-hyperv@vger.kernel.org" <linux-hyperv@vger.kernel.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-arch@vger.kernel.org" <linux-arch@vger.kernel.org>
Cc: "kys@microsoft.com" <kys@microsoft.com>,
"haiyangz@microsoft.com" <haiyangz@microsoft.com>,
"wei.liu@kernel.org" <wei.liu@kernel.org>,
"decui@microsoft.com" <decui@microsoft.com>,
"catalin.marinas@arm.com" <catalin.marinas@arm.com>,
"will@kernel.org" <will@kernel.org>,
"tglx@linutronix.de" <tglx@linutronix.de>,
"mingo@redhat.com" <mingo@redhat.com>,
"bp@alien8.de" <bp@alien8.de>,
"dave.hansen@linux.intel.com" <dave.hansen@linux.intel.com>,
"x86@kernel.org" <x86@kernel.org>,
"hpa@zytor.com" <hpa@zytor.com>, "arnd@arndb.de" <arnd@arndb.de>,
"jinankjain@linux.microsoft.com" <jinankjain@linux.microsoft.com>,
"muminulrussell@gmail.com" <muminulrussell@gmail.com>,
"skinsburskii@linux.microsoft.com"
<skinsburskii@linux.microsoft.com>,
"mukeshrathor@microsoft.com" <mukeshrathor@microsoft.com>
Subject: Re: [PATCH 1/2] hyperv: Move hv_current_partition_id to arch-generic code
Date: Tue, 10 Dec 2024 08:40:49 -0800 [thread overview]
Message-ID: <fec1aeb7-ea07-4363-9e6a-50b0c778e855@linux.microsoft.com> (raw)
In-Reply-To: <SN6PR02MB4157E39FBEFB18EB9A695EECD4332@SN6PR02MB4157.namprd02.prod.outlook.com>
On 12/7/2024 7:01 PM, Michael Kelley wrote:
> From: Nuno Das Neves <nunodasneves@linux.microsoft.com> Sent: Friday, December 6, 2024 2:22 PM
>>
>> Make hv_current_partition_id available in both x86_64 and arm64.
>> This feature isn't specific to x86_64 and will be needed by common
>> code.
>>
>> While at it, replace the BUG()s with WARN()s. Failing to get the id
>> need not crash the machine (although it is a very bad sign).
>>
>> Signed-off-by: Nuno Das Neves <nudasnev@microsoft.com>
>> ---
>> arch/arm64/hyperv/mshyperv.c | 3 +++
>> arch/x86/hyperv/hv_init.c | 25 +------------------------
>> arch/x86/include/asm/mshyperv.h | 2 --
>> drivers/hv/hv_common.c | 23 +++++++++++++++++++++++
>> include/asm-generic/mshyperv.h | 2 ++
>> 5 files changed, 29 insertions(+), 26 deletions(-)
>>
>> diff --git a/arch/arm64/hyperv/mshyperv.c b/arch/arm64/hyperv/mshyperv.c
>> index b1a4de4eee29..5050e748d266 100644
>> --- a/arch/arm64/hyperv/mshyperv.c
>> +++ b/arch/arm64/hyperv/mshyperv.c
>> @@ -19,6 +19,9 @@
>>
>> static bool hyperv_initialized;
>>
>> +u64 hv_current_partition_id = HV_PARTITION_ID_SELF;
>> +EXPORT_SYMBOL_GPL(hv_current_partition_id);
>> +
>
> Instead of adding a definition of hv_current_partition_id on
> the arm64 side, couldn't the definition on the x86 side in
> hv_init.c be moved to hv_common.c (or maybe somewhere
> else that is specific to running in the root partition, per my
> comments in the cover letter), so there is only one definition
> shared by both architectures?
>
Yes, that's a better idea.
>> int hv_get_hypervisor_version(union hv_hypervisor_version_info *info)
>> {
>> hv_get_vpreg_128(HV_REGISTER_HYPERVISOR_VERSION,
>> diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
>> index 95eada2994e1..950f5ccdb9d9 100644
>> --- a/arch/x86/hyperv/hv_init.c
>> +++ b/arch/x86/hyperv/hv_init.c
>> @@ -35,7 +35,7 @@
>> #include <clocksource/hyperv_timer.h>
>> #include <linux/highmem.h>
>>
>> -u64 hv_current_partition_id = ~0ull;
>> +u64 hv_current_partition_id = HV_PARTITION_ID_SELF;
>> EXPORT_SYMBOL_GPL(hv_current_partition_id);
>>
>> void *hv_hypercall_pg;
>> @@ -394,24 +394,6 @@ static void __init hv_stimer_setup_percpu_clockev(void)
>> old_setup_percpu_clockev();
>> }
>>
>> -static void __init hv_get_partition_id(void)
>> -{
>> - struct hv_get_partition_id *output_page;
>> - u64 status;
>> - unsigned long flags;
>> -
>> - local_irq_save(flags);
>> - output_page = *this_cpu_ptr(hyperv_pcpu_output_arg);
>> - status = hv_do_hypercall(HVCALL_GET_PARTITION_ID, NULL, output_page);
>> - if (!hv_result_success(status)) {
>> - /* No point in proceeding if this failed */
>> - pr_err("Failed to get partition ID: %lld\n", status);
>> - BUG();
>> - }
>> - hv_current_partition_id = output_page->partition_id;
>> - local_irq_restore(flags);
>> -}
>> -
>> #if IS_ENABLED(CONFIG_HYPERV_VTL_MODE)
>> static u8 __init get_vtl(void)
>> {
>> @@ -606,11 +588,6 @@ void __init hyperv_init(void)
>>
>> register_syscore_ops(&hv_syscore_ops);
>>
>> - if (cpuid_ebx(HYPERV_CPUID_FEATURES) & HV_ACCESS_PARTITION_ID)
>> - hv_get_partition_id();
>> -
>> - BUG_ON(hv_root_partition && hv_current_partition_id == ~0ull);
>> -
>> #ifdef CONFIG_PCI_MSI
>> /*
>> * If we're running as root, we want to create our own PCI MSI domain.
>> diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h
>> index 5f0bc6a6d025..9eeca2a6d047 100644
>> --- a/arch/x86/include/asm/mshyperv.h
>> +++ b/arch/x86/include/asm/mshyperv.h
>> @@ -44,8 +44,6 @@ extern bool hyperv_paravisor_present;
>>
>> extern void *hv_hypercall_pg;
>>
>> -extern u64 hv_current_partition_id;
>> -
>> extern union hv_ghcb * __percpu *hv_ghcb_pg;
>>
>> bool hv_isolation_type_snp(void);
>> diff --git a/drivers/hv/hv_common.c b/drivers/hv/hv_common.c
>> index 7a35c82976e0..819bcfd2b149 100644
>> --- a/drivers/hv/hv_common.c
>> +++ b/drivers/hv/hv_common.c
>> @@ -278,11 +278,34 @@ static void hv_kmsg_dump_register(void)
>> }
>> }
>>
>> +static void __init hv_get_partition_id(void)
>> +{
>> + struct hv_get_partition_id *output_page;
>> + u64 status;
>> + unsigned long flags;
>> +
>> + local_irq_save(flags);
>> + output_page = *this_cpu_ptr(hyperv_pcpu_output_arg);
>> + status = hv_do_hypercall(HVCALL_GET_PARTITION_ID, NULL, output_page);
>> + if (!hv_result_success(status)) {
>> + local_irq_restore(flags);
>> + WARN(true, "Failed to get partition ID: %lld\n", status);
>> + return;
>> + }
>> + hv_current_partition_id = output_page->partition_id;
>> + local_irq_restore(flags);
>> +}
>> +
>> int __init hv_common_init(void)
>> {
>> int i;
>> union hv_hypervisor_version_info version;
>>
>> + if (ms_hyperv.priv_high & HV_ACCESS_PARTITION_ID)
>> + hv_get_partition_id();
>
> hv_get_partition_id() uses the hyperv_pcpu_output_arg, and at
> this point, hyperv_pcpu_output_arg isn't set. That setup
> is done later in hv_common_init().
>
>> +
>> + WARN_ON(hv_root_partition && hv_current_partition_id == HV_PARTITION_ID_SELF);
>> +
>
> Since the hypercall will fail cleanly if the calling VM doesn't
> have the HV_ACCESS_PARTITION_ID privilege, could the
> above be simplified to just this?
>
> if (hv_root_partition)
> hv_get_partition_id():
>
> A non-root partition VM doesn't need to get the partition ID, while a
> root partition should have the privilege. If the hypercall fails, there's
> already a WARN, so there's no value in doing another WARN. Also if
> the hypercall succeeds, it presumably returns a specific partitionID, not
> HV_PARTITION_ID_SELF, so we know we have what we want.
>
> There's already an "if (hv_root_partition)" statement for setting up
> the hyperv_pcpu_output_arg. The call to hv_get_partition_id() could
> go under that existing "if" *after* the hyperv_pcpu_output_arg is
> set. :-)
>
Thank you, that makes sense. I'll make the changes you suggested for v2.
Nuno
> Michael
>
>> /* Get information about the Hyper-V host version */
>> if (!hv_get_hypervisor_version(&version))
>> pr_info("Hyper-V: Host Build %d.%d.%d.%d-%d-%d\n",
>> diff --git a/include/asm-generic/mshyperv.h b/include/asm-generic/mshyperv.h
>> index 8fe7aaab2599..8c4ff6e9aae7 100644
>> --- a/include/asm-generic/mshyperv.h
>> +++ b/include/asm-generic/mshyperv.h
>> @@ -60,6 +60,8 @@ struct ms_hyperv_info {
>> extern struct ms_hyperv_info ms_hyperv;
>> extern bool hv_nested;
>>
>> +extern u64 hv_current_partition_id;
>> +
>> extern void * __percpu *hyperv_pcpu_input_arg;
>> extern void * __percpu *hyperv_pcpu_output_arg;
>>
>> --
>> 2.34.1
next prev parent reply other threads:[~2024-12-10 16:40 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-06 22:21 [PATCH 0/2] hyperv: Move some features to common code Nuno Das Neves
2024-12-06 22:21 ` [PATCH 1/2] hyperv: Move hv_current_partition_id to arch-generic code Nuno Das Neves
2024-12-07 7:36 ` Wei Liu
2025-01-22 22:40 ` Nuno Das Neves
2024-12-08 3:01 ` Michael Kelley
2024-12-10 16:40 ` Nuno Das Neves [this message]
2024-12-06 22:21 ` [PATCH 2/2] hyperv: Move create_vp and deposit_pages hvcalls to hv_common.c Nuno Das Neves
2024-12-07 7:36 ` Wei Liu
2024-12-08 2:59 ` [PATCH 0/2] hyperv: Move some features to common code Michael Kelley
2024-12-09 20:20 ` Nuno Das Neves
2024-12-17 17:48 ` Michael Kelley
2025-01-22 23:05 ` Nuno Das Neves
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=fec1aeb7-ea07-4363-9e6a-50b0c778e855@linux.microsoft.com \
--to=nunodasneves@linux.microsoft.com \
--cc=arnd@arndb.de \
--cc=bp@alien8.de \
--cc=catalin.marinas@arm.com \
--cc=dave.hansen@linux.intel.com \
--cc=decui@microsoft.com \
--cc=haiyangz@microsoft.com \
--cc=hpa@zytor.com \
--cc=jinankjain@linux.microsoft.com \
--cc=kys@microsoft.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-hyperv@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mhklinux@outlook.com \
--cc=mingo@redhat.com \
--cc=mukeshrathor@microsoft.com \
--cc=muminulrussell@gmail.com \
--cc=skinsburskii@linux.microsoft.com \
--cc=tglx@linutronix.de \
--cc=wei.liu@kernel.org \
--cc=will@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.