From: Vitaly Kuznetsov <vkuznets@redhat.com> To: Wei Liu <wei.liu@kernel.org>, Linux on Hyper-V List <linux-hyperv@vger.kernel.org> Cc: virtualization@lists.linux-foundation.org, Linux Kernel List <linux-kernel@vger.kernel.org>, Michael Kelley <mikelley@microsoft.com>, Vineeth Pillai <viremana@linux.microsoft.com>, Sunil Muthuswamy <sunilmut@microsoft.com>, Nuno Das Neves <nudasnev@microsoft.com>, Wei Liu <wei.liu@kernel.org>, Lillian Grassin-Drake <ligrassi@microsoft.com>, "K. Y. Srinivasan" <kys@microsoft.com>, Haiyang Zhang <haiyangz@microsoft.com>, Stephen Hemminger <sthemmin@microsoft.com>, Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>, "maintainer\:X86 ARCHITECTURE \(32-BIT AND 64-BIT\)" <x86@kernel.org>, "H. Peter Anvin" <hpa@zytor.com> Subject: Re: [PATCH RFC v1 06/18] x86/hyperv: allocate output arg pages if required Date: Tue, 15 Sep 2020 12:16:58 +0200 [thread overview] Message-ID: <871rj3l4yt.fsf@vitty.brq.redhat.com> (raw) In-Reply-To: <20200914112802.80611-7-wei.liu@kernel.org> Wei Liu <wei.liu@kernel.org> writes: > When Linux runs as the root partition, it will need to make hypercalls > which return data from the hypervisor. > > Allocate pages for storing results when Linux runs as the root > partition. > > Signed-off-by: Lillian Grassin-Drake <ligrassi@microsoft.com> > Co-Developed-by: Lillian Grassin-Drake <ligrassi@microsoft.com> > Signed-off-by: Wei Liu <wei.liu@kernel.org> > --- > arch/x86/hyperv/hv_init.c | 45 +++++++++++++++++++++++++++++---- > arch/x86/include/asm/mshyperv.h | 1 + > 2 files changed, 41 insertions(+), 5 deletions(-) > > diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c > index cac8e4c56261..ebba4be4185d 100644 > --- a/arch/x86/hyperv/hv_init.c > +++ b/arch/x86/hyperv/hv_init.c > @@ -45,6 +45,9 @@ EXPORT_SYMBOL_GPL(hv_vp_assist_page); > void __percpu **hyperv_pcpu_input_arg; > EXPORT_SYMBOL_GPL(hyperv_pcpu_input_arg); > > +void __percpu **hyperv_pcpu_output_arg; > +EXPORT_SYMBOL_GPL(hyperv_pcpu_output_arg); > + > u32 hv_max_vp_index; > EXPORT_SYMBOL_GPL(hv_max_vp_index); > > @@ -75,14 +78,29 @@ static int hv_cpu_init(unsigned int cpu) > u64 msr_vp_index; > struct hv_vp_assist_page **hvp = &hv_vp_assist_page[smp_processor_id()]; > void **input_arg; > - struct page *pg; > + struct page *input_pg; > > input_arg = (void **)this_cpu_ptr(hyperv_pcpu_input_arg); > /* hv_cpu_init() can be called with IRQs disabled from hv_resume() */ > - pg = alloc_page(irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL); > - if (unlikely(!pg)) > + input_pg = alloc_page(irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL); > + if (unlikely(!input_pg)) > return -ENOMEM; > - *input_arg = page_address(pg); > + *input_arg = page_address(input_pg); > + > + if (hv_root_partition) { > + struct page *output_pg; > + void **output_arg; > + > + output_pg = alloc_page(irqs_disabled() ? GFP_ATOMIC : > GFP_KERNEL); To simplify the code, can we just rename 'input_arg' to 'hypercall_args' and do alloc_pages(rqs_disabled() ? GFP_ATOMIC : GFP_KERNEL, 1) to allocate two pages above? > + if (unlikely(!output_pg)) { > + free_page((unsigned long)*input_arg); > + *input_arg = NULL; > + return -ENOMEM; > + } > + > + output_arg = (void **)this_cpu_ptr(hyperv_pcpu_output_arg); > + *output_arg = page_address(output_pg); > + } > > hv_get_vp_index(msr_vp_index); > > @@ -209,14 +227,25 @@ static int hv_cpu_die(unsigned int cpu) > unsigned int new_cpu; > unsigned long flags; > void **input_arg; > - void *input_pg = NULL; > + void *input_pg = NULL, *output_pg = NULL; > > local_irq_save(flags); > input_arg = (void **)this_cpu_ptr(hyperv_pcpu_input_arg); > input_pg = *input_arg; > *input_arg = NULL; > + > + if (hv_root_partition) { > + void **output_arg; > + > + output_arg = (void **)this_cpu_ptr(hyperv_pcpu_output_arg); > + output_pg = *output_arg; > + *output_arg = NULL; > + } > + > local_irq_restore(flags); > + > free_page((unsigned long)input_pg); > + free_page((unsigned long)output_pg); > > if (hv_vp_assist_page && hv_vp_assist_page[cpu]) > wrmsrl(HV_X64_MSR_VP_ASSIST_PAGE, 0); > @@ -350,6 +379,12 @@ void __init hyperv_init(void) > > BUG_ON(hyperv_pcpu_input_arg == NULL); > > + /* Allocate the per-CPU state for output arg for root */ > + if (hv_root_partition) { > + hyperv_pcpu_output_arg = alloc_percpu(void *); redundant space ^^^^^ > + BUG_ON(hyperv_pcpu_output_arg == NULL); > + } > + > /* Allocate percpu VP index */ > hv_vp_index = kmalloc_array(num_possible_cpus(), sizeof(*hv_vp_index), > GFP_KERNEL); > diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h > index 2a2cc81beac6..f5c62140f28d 100644 > --- a/arch/x86/include/asm/mshyperv.h > +++ b/arch/x86/include/asm/mshyperv.h > @@ -63,6 +63,7 @@ static inline void hv_disable_stimer0_percpu_irq(int irq) {} > #if IS_ENABLED(CONFIG_HYPERV) > extern void *hv_hypercall_pg; > extern void __percpu **hyperv_pcpu_input_arg; > +extern void __percpu **hyperv_pcpu_output_arg; > > static inline u64 hv_do_hypercall(u64 control, void *input, void *output) > { -- Vitaly
WARNING: multiple messages have this Message-ID (diff)
From: Vitaly Kuznetsov <vkuznets@redhat.com> To: Wei Liu <wei.liu@kernel.org>, Linux on Hyper-V List <linux-hyperv@vger.kernel.org> Cc: Wei Liu <wei.liu@kernel.org>, Stephen Hemminger <sthemmin@microsoft.com>, Haiyang Zhang <haiyangz@microsoft.com>, "maintainer:X86 ARCHITECTURE \(32-BIT AND 64-BIT\)" <x86@kernel.org>, virtualization@lists.linux-foundation.org, Linux Kernel List <linux-kernel@vger.kernel.org>, Nuno Das Neves <nudasnev@microsoft.com>, Ingo Molnar <mingo@redhat.com>, Thomas Gleixner <tglx@linutronix.de>, "H. Peter Anvin" <hpa@zytor.com>, Borislav Petkov <bp@alien8.de>, Sunil Muthuswamy <sunilmut@microsoft.com>, Michael Kelley <mikelley@microsoft.com>, Vineeth Pillai <viremana@linux.microsoft.com>, Lillian Grassin-Drake <ligrassi@microsoft.com> Subject: Re: [PATCH RFC v1 06/18] x86/hyperv: allocate output arg pages if required Date: Tue, 15 Sep 2020 12:16:58 +0200 [thread overview] Message-ID: <871rj3l4yt.fsf@vitty.brq.redhat.com> (raw) In-Reply-To: <20200914112802.80611-7-wei.liu@kernel.org> Wei Liu <wei.liu@kernel.org> writes: > When Linux runs as the root partition, it will need to make hypercalls > which return data from the hypervisor. > > Allocate pages for storing results when Linux runs as the root > partition. > > Signed-off-by: Lillian Grassin-Drake <ligrassi@microsoft.com> > Co-Developed-by: Lillian Grassin-Drake <ligrassi@microsoft.com> > Signed-off-by: Wei Liu <wei.liu@kernel.org> > --- > arch/x86/hyperv/hv_init.c | 45 +++++++++++++++++++++++++++++---- > arch/x86/include/asm/mshyperv.h | 1 + > 2 files changed, 41 insertions(+), 5 deletions(-) > > diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c > index cac8e4c56261..ebba4be4185d 100644 > --- a/arch/x86/hyperv/hv_init.c > +++ b/arch/x86/hyperv/hv_init.c > @@ -45,6 +45,9 @@ EXPORT_SYMBOL_GPL(hv_vp_assist_page); > void __percpu **hyperv_pcpu_input_arg; > EXPORT_SYMBOL_GPL(hyperv_pcpu_input_arg); > > +void __percpu **hyperv_pcpu_output_arg; > +EXPORT_SYMBOL_GPL(hyperv_pcpu_output_arg); > + > u32 hv_max_vp_index; > EXPORT_SYMBOL_GPL(hv_max_vp_index); > > @@ -75,14 +78,29 @@ static int hv_cpu_init(unsigned int cpu) > u64 msr_vp_index; > struct hv_vp_assist_page **hvp = &hv_vp_assist_page[smp_processor_id()]; > void **input_arg; > - struct page *pg; > + struct page *input_pg; > > input_arg = (void **)this_cpu_ptr(hyperv_pcpu_input_arg); > /* hv_cpu_init() can be called with IRQs disabled from hv_resume() */ > - pg = alloc_page(irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL); > - if (unlikely(!pg)) > + input_pg = alloc_page(irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL); > + if (unlikely(!input_pg)) > return -ENOMEM; > - *input_arg = page_address(pg); > + *input_arg = page_address(input_pg); > + > + if (hv_root_partition) { > + struct page *output_pg; > + void **output_arg; > + > + output_pg = alloc_page(irqs_disabled() ? GFP_ATOMIC : > GFP_KERNEL); To simplify the code, can we just rename 'input_arg' to 'hypercall_args' and do alloc_pages(rqs_disabled() ? GFP_ATOMIC : GFP_KERNEL, 1) to allocate two pages above? > + if (unlikely(!output_pg)) { > + free_page((unsigned long)*input_arg); > + *input_arg = NULL; > + return -ENOMEM; > + } > + > + output_arg = (void **)this_cpu_ptr(hyperv_pcpu_output_arg); > + *output_arg = page_address(output_pg); > + } > > hv_get_vp_index(msr_vp_index); > > @@ -209,14 +227,25 @@ static int hv_cpu_die(unsigned int cpu) > unsigned int new_cpu; > unsigned long flags; > void **input_arg; > - void *input_pg = NULL; > + void *input_pg = NULL, *output_pg = NULL; > > local_irq_save(flags); > input_arg = (void **)this_cpu_ptr(hyperv_pcpu_input_arg); > input_pg = *input_arg; > *input_arg = NULL; > + > + if (hv_root_partition) { > + void **output_arg; > + > + output_arg = (void **)this_cpu_ptr(hyperv_pcpu_output_arg); > + output_pg = *output_arg; > + *output_arg = NULL; > + } > + > local_irq_restore(flags); > + > free_page((unsigned long)input_pg); > + free_page((unsigned long)output_pg); > > if (hv_vp_assist_page && hv_vp_assist_page[cpu]) > wrmsrl(HV_X64_MSR_VP_ASSIST_PAGE, 0); > @@ -350,6 +379,12 @@ void __init hyperv_init(void) > > BUG_ON(hyperv_pcpu_input_arg == NULL); > > + /* Allocate the per-CPU state for output arg for root */ > + if (hv_root_partition) { > + hyperv_pcpu_output_arg = alloc_percpu(void *); redundant space ^^^^^ > + BUG_ON(hyperv_pcpu_output_arg == NULL); > + } > + > /* Allocate percpu VP index */ > hv_vp_index = kmalloc_array(num_possible_cpus(), sizeof(*hv_vp_index), > GFP_KERNEL); > diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h > index 2a2cc81beac6..f5c62140f28d 100644 > --- a/arch/x86/include/asm/mshyperv.h > +++ b/arch/x86/include/asm/mshyperv.h > @@ -63,6 +63,7 @@ static inline void hv_disable_stimer0_percpu_irq(int irq) {} > #if IS_ENABLED(CONFIG_HYPERV) > extern void *hv_hypercall_pg; > extern void __percpu **hyperv_pcpu_input_arg; > +extern void __percpu **hyperv_pcpu_output_arg; > > static inline u64 hv_do_hypercall(u64 control, void *input, void *output) > { -- Vitaly _______________________________________________ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/virtualization
next prev parent reply other threads:[~2020-09-15 10:17 UTC|newest] Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-09-14 11:27 [PATCH RFC v1 00/18] Introducing Linux root partition support for Microsoft Hypervisor Wei Liu 2020-09-14 11:27 ` [PATCH RFC v1 01/18] asm-generic/hyperv: change HV_CPU_POWER_MANAGEMENT to HV_CPU_MANAGEMENT Wei Liu 2020-09-14 11:27 ` [PATCH RFC v1 02/18] x86/hyperv: detect if Linux is the root partition Wei Liu 2020-09-14 11:27 ` [PATCH RFC v1 03/18] Drivers: hv: vmbus: skip VMBus initialization if Linux is root Wei Liu 2020-09-14 11:27 ` [PATCH RFC v1 04/18] iommu/hyperv: don't setup IRQ remapping when running as root Wei Liu 2020-09-14 11:27 ` Wei Liu 2020-09-18 9:12 ` Joerg Roedel 2020-09-18 9:12 ` Joerg Roedel 2020-09-18 9:12 ` Joerg Roedel 2020-09-14 11:27 ` [PATCH RFC v1 05/18] clocksource/hyperv: use MSR-based access if " Wei Liu 2020-09-15 10:10 ` Vitaly Kuznetsov 2020-09-15 10:10 ` Vitaly Kuznetsov 2020-09-15 10:32 ` Wei Liu 2020-09-14 11:27 ` [PATCH RFC v1 06/18] x86/hyperv: allocate output arg pages if required Wei Liu 2020-09-15 10:16 ` Vitaly Kuznetsov [this message] 2020-09-15 10:16 ` Vitaly Kuznetsov 2020-09-15 12:43 ` Wei Liu 2020-09-16 15:42 ` Wei Liu 2020-09-16 16:10 ` Vitaly Kuznetsov 2020-09-16 16:10 ` Vitaly Kuznetsov 2020-09-14 11:27 ` [PATCH RFC v1 07/18] x86/hyperv: extract partition ID from Microsoft Hypervisor if necessary Wei Liu 2020-09-15 10:27 ` Vitaly Kuznetsov 2020-09-15 10:27 ` Vitaly Kuznetsov 2020-09-16 16:32 ` Wei Liu 2020-10-27 12:19 ` Wei Liu 2020-09-14 11:27 ` [PATCH RFC v1 08/18] x86/hyperv: handling hypercall page setup for root Wei Liu 2020-09-15 10:32 ` Vitaly Kuznetsov 2020-09-15 10:32 ` Vitaly Kuznetsov 2020-09-15 10:37 ` Wei Liu 2020-09-15 11:02 ` Vitaly Kuznetsov 2020-09-15 11:02 ` Vitaly Kuznetsov 2020-09-15 11:16 ` Wei Liu 2020-09-15 11:23 ` Vitaly Kuznetsov 2020-09-15 11:23 ` Vitaly Kuznetsov 2020-09-15 11:27 ` Wei Liu 2020-09-16 21:34 ` [EXTERNAL] " Sunil Muthuswamy 2020-09-16 21:34 ` Sunil Muthuswamy via Virtualization 2020-09-17 11:06 ` Vitaly Kuznetsov 2020-09-17 11:06 ` Vitaly Kuznetsov 2020-09-14 11:59 ` [PATCH RFC v1 09/18] x86/hyperv: provide a bunch of helper functions Wei Liu 2020-09-15 11:00 ` Vitaly Kuznetsov 2020-09-15 11:00 ` Vitaly Kuznetsov 2020-10-27 13:10 ` Wei Liu 2020-09-14 11:59 ` [PATCH RFC v1 10/18] x86/hyperv: implement and use hv_smp_prepare_cpus Wei Liu 2020-09-15 11:14 ` Vitaly Kuznetsov 2020-09-15 11:14 ` Vitaly Kuznetsov 2020-10-27 13:47 ` Wei Liu 2020-10-27 13:56 ` Wei Liu 2020-09-14 11:59 ` [PATCH RFC v1 11/18] asm-generic/hyperv: update hv_msi_entry Wei Liu 2020-09-14 11:59 ` [PATCH RFC v1 12/18] asm-generic/hyperv: update hv_interrupt_entry Wei Liu 2020-10-01 14:33 ` Rob Herring 2020-10-01 14:33 ` Rob Herring 2020-09-14 11:59 ` [PATCH RFC v1 13/18] asm-generic/hyperv: introduce hv_device_id and auxiliary structures Wei Liu 2020-09-15 11:16 ` Vitaly Kuznetsov 2020-09-15 11:16 ` Vitaly Kuznetsov 2020-09-15 11:59 ` Wei Liu 2020-09-14 11:59 ` [PATCH RFC v1 14/18] asm-generic/hyperv: import data structures for mapping device interrupts Wei Liu 2020-09-14 11:59 ` [PATCH RFC v1 15/18] x86/apic/msi: export pci_msi_get_hwirq Wei Liu 2020-09-14 11:59 ` [PATCH RFC v1 16/18] x86/hyperv: implement MSI domain for root partition Wei Liu 2020-09-14 11:59 ` [PATCH RFC v1 17/18] x86/ioapic: export a few functions and data structures via io_apic.h Wei Liu 2020-09-14 11:59 ` [PATCH RFC v1 18/18] x86/hyperv: handle IO-APIC when running as root Wei Liu
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=871rj3l4yt.fsf@vitty.brq.redhat.com \ --to=vkuznets@redhat.com \ --cc=bp@alien8.de \ --cc=haiyangz@microsoft.com \ --cc=hpa@zytor.com \ --cc=kys@microsoft.com \ --cc=ligrassi@microsoft.com \ --cc=linux-hyperv@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mikelley@microsoft.com \ --cc=mingo@redhat.com \ --cc=nudasnev@microsoft.com \ --cc=sthemmin@microsoft.com \ --cc=sunilmut@microsoft.com \ --cc=tglx@linutronix.de \ --cc=viremana@linux.microsoft.com \ --cc=virtualization@lists.linux-foundation.org \ --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: linkBe 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.