Re: [PATCH RFC v1 06/18] x86/hyperv: allocate output arg pages if required
From: Vitaly Kuznetsov <vkuznets@redhat.com>
Date: 2020-09-16 16:25:46
Also in:
lkml, virtualization
Wei Liu [off-list ref] writes:
On Tue, Sep 15, 2020 at 12:43:18PM +0000, Wei Liu wrote:quoted
On Tue, Sep 15, 2020 at 12:16:58PM +0200, Vitaly Kuznetsov wrote:quoted
Wei Liu [off-list ref] writes:quoted
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 <redacted> Co-Developed-by: Lillian Grassin-Drake <redacted> 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?It should be doable, but I need to code it up and test it to be 100% sure.I switch to alloc_pages to allocate an order of 2 page if necessary, but I keep input_arg and output_arg separate because I want to avoid code churn in other places.
My idea was that we're free to choose how to use these pages, e.g. with two pages allocated we can now do a hypercall which takes two pages of input and produces no output other than the return value. This doesn't contradict your suggestion to keep input_arg/output_arg as these are just pointers to the continuous space, we can still do the trick. I don't feel strong about this and you probably have more patches in your stash, no need for massive re-work I believe. -- Vitaly