Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp1800544pxu; Tue, 24 Nov 2020 09:12:03 -0800 (PST) X-Google-Smtp-Source: ABdhPJwJgs2MU7wiXcB8drxoGsxMwnPs3t63Iv1T26wpvoixFR4wd+nL+a8k2gC72Bit+nDUbIf7 X-Received: by 2002:a17:906:4009:: with SMTP id v9mr4880437ejj.97.1606237923434; Tue, 24 Nov 2020 09:12:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1606237923; cv=none; d=google.com; s=arc-20160816; b=JLVdl691nEua1I/NcUrSd9RWcosDGx6hheQ9JATuLNVgzBHaSoVEaOvffy7wbXyVRX Sd47xNPq/Ho/OsoJ3meo2BlK2aXuwipjtEHAXYrkvYkF3JdNaVPT4JbfCOUXbQAVBQ7Z YhvCWP3bbWd8S/U1aEuuMuigIQkTp2sq99IIypqtOWj259ombTWPDMbXJLkSYREJ/nhG /pIkpUV2RiP/Jl7w30tzRrAqaJQHTbRXbaRLMeXa53ENY3i1AqlfirnupTX25MRgJ1I5 t+WSpMjXx54Ot+ytPC2XdLh1Ob67pL7N68x2QFW+kWvXAl1wAhrlCrhhiVKDFLVEJUC4 ZsHg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=1AnwUhpK3uc/E6NKbzj7KMKk+WsZG+5G79p8q0Z4Cfs=; b=FAkQ5oVw5dSo0ndACdKBhBhNTf/5tZXfmxHi4qHQG+eYTCX+TCEYBVjae9pCOU0MH6 WWeeebU6RBL5GDuuvQcFlqM5cSD6LFynz9COW7V5SVq7QFSemUNhDdXFj+z86XppWs54 lNtsfDK/1zSu/1A+H9ymFTH6KCvy7nc4Q7fLJRVCujRRIjieH+gjoB8sT1J9yZdTBLbb g4acq3q7TB3uO0cAUkl2Lo0g+f30HKMpUwtV/bQO46QBEZjnAe7tbfGethlSeid75NgS mNwCS8tc3pGPU7XcRKk7jFdkoy2heoYicwQMtBFXuIeM/PCmSpYFFW+VLZe+ez7HLpzT ctBA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w6si9077618edj.604.2020.11.24.09.11.39; Tue, 24 Nov 2020 09:12:03 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390690AbgKXRH5 (ORCPT + 99 others); Tue, 24 Nov 2020 12:07:57 -0500 Received: from mail-wm1-f68.google.com ([209.85.128.68]:40945 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390461AbgKXRH4 (ORCPT ); Tue, 24 Nov 2020 12:07:56 -0500 Received: by mail-wm1-f68.google.com with SMTP id a3so3623159wmb.5; Tue, 24 Nov 2020 09:07:54 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=1AnwUhpK3uc/E6NKbzj7KMKk+WsZG+5G79p8q0Z4Cfs=; b=IcRcPywkd72q3i4abo8KwqWwkALd9SncgIYIIFeWGgUI7kAdUArsvoahtXCu1+8NQd JAAcgVaq+YMDhM/aPM6YmlklwbiM4VcW1WfP0ZcLUMfZpLZjXbwpwiSPqUBAEF2Hjwr5 c3NLQ0aIVanstdxOpwLtwWFXjBXjfvSG6um9fwTfjJetgD9AqiDlQ1A7LDPb1kj7n3Kp REQV8qzDJXsC1l3V5HXExmTNFL1TZhhY17uyJXGo/JNccuR1xQhqefULChwSZ13D8mwV jsKqABKIo6I4JBh5Fw4UxgNguf0OsTcgm/OXk+Vr7a3EfLZsvdsflgSHNjfDpAKhm36X 4hOQ== X-Gm-Message-State: AOAM530+38DiDzV80KxPWd3EO+IL3lzwNCGV3xiBssz+XPrYXI2FCCWI L/U+GcuEGxRUjugqnkAkiaNB2wFKa8g= X-Received: by 2002:a1c:7d10:: with SMTP id y16mr5601435wmc.142.1606237673890; Tue, 24 Nov 2020 09:07:53 -0800 (PST) Received: from liuwe-devbox-debian-v2.j3c5onc20sse1dnehy4noqpfcg.zx.internal.cloudapp.net ([51.145.34.42]) by smtp.gmail.com with ESMTPSA id v20sm6419874wmh.44.2020.11.24.09.07.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Nov 2020 09:07:53 -0800 (PST) From: Wei Liu To: Linux on Hyper-V List Cc: virtualization@lists.linux-foundation.org, Linux Kernel List , Michael Kelley , Vineeth Pillai , Sunil Muthuswamy , Nuno Das Neves , Wei Liu , Lillian Grassin-Drake , "K. Y. Srinivasan" , Haiyang Zhang , Stephen Hemminger , Thomas Gleixner , Ingo Molnar , Borislav Petkov , x86@kernel.org (maintainer:X86 ARCHITECTURE (32-BIT AND 64-BIT)), "H. Peter Anvin" Subject: [PATCH v3 06/17] x86/hyperv: allocate output arg pages if required Date: Tue, 24 Nov 2020 17:07:33 +0000 Message-Id: <20201124170744.112180-7-wei.liu@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20201124170744.112180-1-wei.liu@kernel.org> References: <20201124170744.112180-1-wei.liu@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 Co-Developed-by: Lillian Grassin-Drake Signed-off-by: Wei Liu --- v3: Fix hv_cpu_die to use free_pages. v2: Address Vitaly's comments --- arch/x86/hyperv/hv_init.c | 35 ++++++++++++++++++++++++++++----- arch/x86/include/asm/mshyperv.h | 1 + 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c index e04d90af4c27..6f4cb40e53fe 100644 --- a/arch/x86/hyperv/hv_init.c +++ b/arch/x86/hyperv/hv_init.c @@ -41,6 +41,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); @@ -73,12 +76,19 @@ static int hv_cpu_init(unsigned int cpu) void **input_arg; struct page *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); + pg = alloc_pages(irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL, hv_root_partition ? 1 : 0); if (unlikely(!pg)) return -ENOMEM; + + input_arg = (void **)this_cpu_ptr(hyperv_pcpu_input_arg); *input_arg = page_address(pg); + if (hv_root_partition) { + void **output_arg; + + output_arg = (void **)this_cpu_ptr(hyperv_pcpu_output_arg); + *output_arg = page_address(pg + 1); + } hv_get_vp_index(msr_vp_index); @@ -205,14 +215,23 @@ static int hv_cpu_die(unsigned int cpu) unsigned int new_cpu; unsigned long flags; void **input_arg; - void *input_pg = NULL; + void *pg; local_irq_save(flags); input_arg = (void **)this_cpu_ptr(hyperv_pcpu_input_arg); - input_pg = *input_arg; + pg = *input_arg; *input_arg = NULL; + + if (hv_root_partition) { + void **output_arg; + + output_arg = (void **)this_cpu_ptr(hyperv_pcpu_output_arg); + *output_arg = NULL; + } + local_irq_restore(flags); - free_page((unsigned long)input_pg); + + free_pages((unsigned long)pg, hv_root_partition ? 1 : 0); if (hv_vp_assist_page && hv_vp_assist_page[cpu]) wrmsrl(HV_X64_MSR_VP_ASSIST_PAGE, 0); @@ -346,6 +365,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 *); + 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 ac2b0d110f03..62d9390f1ddf 100644 --- a/arch/x86/include/asm/mshyperv.h +++ b/arch/x86/include/asm/mshyperv.h @@ -76,6 +76,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) { -- 2.20.1