Received: by 2002:a05:6358:111d:b0:dc:6189:e246 with SMTP id f29csp4212086rwi; Wed, 2 Nov 2022 08:06:09 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5aN9rpo4kytMNCXxRCQ17b7lVqMgmXd6Jwq00AZ5xQLRM4Kayin9qpyaIOXTCRtfMzzU9P X-Received: by 2002:a63:db14:0:b0:44d:e4f3:b45c with SMTP id e20-20020a63db14000000b0044de4f3b45cmr21483347pgg.267.1667401568748; Wed, 02 Nov 2022 08:06:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1667401568; cv=none; d=google.com; s=arc-20160816; b=SxMxA1uDvxY1uYbhDLnvuFNpveAuHUJdibL/+s8vummJ3U8xvvxio9bxgl398vyByw fpR/z6jFAbFIyx97f4+fXCn2RU1Gt92vDuS/Yu7phHf5l3EW86exDYVTpNYQvBqQubor /14L5bt+YfeSWeLZq27veZs+VRTJPEJWBjvw/q93veb4KEEb51mzQ+w+LYnlzE66lvXo te+m1COZGJRdT8QgNeb5PXn/Vhy+H1i+iw9dy4nFlEYy5CWqnG1kVxpZ0mdLKOFIpjyx 4RC0z8gV6aimETIfh+p9CeUNh9rMCc70oehbhARk17QffGD3+FL076HNpafA3NYtYT6U E6bA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:message-id:date:references :in-reply-to:subject:cc:to:from:dkim-signature; bh=aIUui6XemfDmNnKveTsJ7okhqXcH8eMwCddrAWsAvh8=; b=Tt8Qv8+HoE7OYoVpBuMq0XK56jwbkrnzoGINmQgJj4SDrok6i+5gqZ/KNEseVc6jQS F+tJOCMSk3YNc4VmEj3cgcN3OJFwJSoUQhoLiUWlTMihU+Pc1iLUEA8RKOBemsvfrWzC DZFpCpet57nJ2J4FEWbZ8toz9FKNi++xJY/8V9YEr127PAPmBEY9m0Jw3B+A7ykuWsdo f3RiWFe28nlNhZTMuwjYkMkpGN7goER7UowPKjvY5gF9QxyRcbflKB7fnFY4MiLyfJrS oEDyJmhl0gR18i0a+6zgjQDnz92/VW78uEubxY1SF3Vb3V35eu09n7bXznYGDlJPbBGM fUng== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=ULhpDMko; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id g6-20020a655806000000b0046ebb8fc292si16501278pgr.7.2022.11.02.08.05.52; Wed, 02 Nov 2022 08:06:08 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=ULhpDMko; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230075AbiKBPAH (ORCPT + 98 others); Wed, 2 Nov 2022 11:00:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43720 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230046AbiKBPAF (ORCPT ); Wed, 2 Nov 2022 11:00:05 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8A24E2B621 for ; Wed, 2 Nov 2022 07:58:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1667401132; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=aIUui6XemfDmNnKveTsJ7okhqXcH8eMwCddrAWsAvh8=; b=ULhpDMkovA5QMBRTybJ5vdXEGGadofOClT37OX1k4q921b7d2XWD8iWrOO/wWjAbGZpVQW XgesZl7iGTBzs3JSVLbu43awbyErpzfgCm2qOSSMq363UbF/gDGEs1rrLS01C4LxnOlSir scEmml6LC7bYnySNBQweGt7SfTeyCLE= Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-595-w1WI3L_lMc6IvMOvPWnYMA-1; Wed, 02 Nov 2022 10:58:51 -0400 X-MC-Unique: w1WI3L_lMc6IvMOvPWnYMA-1 Received: by mail-wr1-f72.google.com with SMTP id o13-20020adfa10d000000b00232c00377a0so4975319wro.13 for ; Wed, 02 Nov 2022 07:58:51 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:message-id:date:references:in-reply-to:subject:cc:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=aIUui6XemfDmNnKveTsJ7okhqXcH8eMwCddrAWsAvh8=; b=i1xBcnV2hF23bekMDjVC0E9PLKuVsPeHcgY5iDLyMgGewXkAXTsbbmGePEb/piEkql anR0X5Np42RI2knqf84LgSLLYlW9TsWSRgT4JEenmk59Mg5688XpbucL7V5hph6LYE1H nhJGhmdQ5jWGVYiG/572MgiGrItlIHHayfnethFB284if6pB8F1aMQYyzU2m07U6jlJS cl1E3HzAWCg9pFXQfWKeghWDOuQknhr6dMadRLE1rgMW83+iGbBb0mlBO4q2BMT2W/LI 9TxC25JqA0l0/jW7mAITX6WFKVoc+yKYmay5WtA2NcSHtzA8KevGqSsjhZ49zckgQra6 qbrQ== X-Gm-Message-State: ACrzQf0fmTtPzc3ocE1p2vFqeWvLiyjgbcqJhjGTBAnFDMD+tEaAAueE 9m++5KknBd3XZu2lFz8mPQNmiI7m02HOqevzK2c0Tp7A4zhVpsZDNoehsNbd/USktRPff1yFIip QdAtDQKxnnUjGsmnCzpxO+ejE X-Received: by 2002:adf:f98a:0:b0:236:677c:2407 with SMTP id f10-20020adff98a000000b00236677c2407mr15876803wrr.578.1667401130341; Wed, 02 Nov 2022 07:58:50 -0700 (PDT) X-Received: by 2002:adf:f98a:0:b0:236:677c:2407 with SMTP id f10-20020adff98a000000b00236677c2407mr15876772wrr.578.1667401130077; Wed, 02 Nov 2022 07:58:50 -0700 (PDT) Received: from fedora (nat-2.ign.cz. [91.219.240.2]) by smtp.gmail.com with ESMTPSA id m39-20020a05600c3b2700b003bfaba19a8fsm2424488wms.35.2022.11.02.07.58.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 02 Nov 2022 07:58:49 -0700 (PDT) From: Vitaly Kuznetsov To: Jinank Jain Cc: kys@microsoft.com, haiyangz@microsoft.com, sthemmin@microsoft.com, wei.liu@kernel.org, decui@microsoft.com, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, arnd@arndb.de, peterz@infradead.org, jpoimboe@kernel.org, jinankjain@linux.microsoft.com, seanjc@google.com, kirill.shutemov@linux.intel.com, ak@linux.intel.com, sathyanarayanan.kuppuswamy@linux.intel.com, linux-hyperv@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org Subject: Re: [PATCH 2/6] hv: Setup synic registers in case of nested root partition In-Reply-To: <78973f0cfed8a19fced95875c0142a08386e66ed.1667394408.git.jinankjain@microsoft.com> References: <78973f0cfed8a19fced95875c0142a08386e66ed.1667394408.git.jinankjain@microsoft.com> Date: Wed, 02 Nov 2022 15:58:48 +0100 Message-ID: <871qqls8rb.fsf@redhat.com> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Status: No, score=-3.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Jinank Jain writes: > Child partitions are free to allocate SynIC message and event page but in > case of root partition it must use the pages allocated by Microsoft > Hypervisor (MSHV). Base address for these pages can be found using > synthetic MSRs exposed by MSHV. There is a slight difference in those MSRs > for nested vs non-nested root partition. > > Signed-off-by: Jinank Jain > --- > arch/x86/include/asm/hyperv-tlfs.h | 11 ++++++ > drivers/hv/hv.c | 55 ++++++++++++++++++------------ > 2 files changed, 45 insertions(+), 21 deletions(-) > > diff --git a/arch/x86/include/asm/hyperv-tlfs.h b/arch/x86/include/asm/hyperv-tlfs.h > index d9a611565859..0319091e2019 100644 > --- a/arch/x86/include/asm/hyperv-tlfs.h > +++ b/arch/x86/include/asm/hyperv-tlfs.h > @@ -225,6 +225,17 @@ enum hv_isolation_type { > #define HV_REGISTER_SINT14 0x4000009E > #define HV_REGISTER_SINT15 0x4000009F > > +/* > + * Define synthetic interrupt controller model specific registers for > + * nested hypervisor. > + */ > +#define HV_REGISTER_NESTED_SCONTROL 0x40001080 > +#define HV_REGISTER_NESTED_SVERSION 0x40001081 > +#define HV_REGISTER_NESTED_SIEFP 0x40001082 > +#define HV_REGISTER_NESTED_SIMP 0x40001083 > +#define HV_REGISTER_NESTED_EOM 0x40001084 > +#define HV_REGISTER_NESTED_SINT0 0x40001090 > + > /* > * Synthetic Timer MSRs. Four timers per vcpu. > */ > diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c > index 4d6480d57546..92ee910561c4 100644 > --- a/drivers/hv/hv.c > +++ b/drivers/hv/hv.c > @@ -25,6 +25,11 @@ > /* The one and only */ > struct hv_context hv_context; > > +#define REG_SIMP (hv_nested ? HV_REGISTER_NESTED_SIMP : HV_REGISTER_SIMP) > +#define REG_SIEFP (hv_nested ? HV_REGISTER_NESTED_SIEFP : HV_REGISTER_SIEFP) > +#define REG_SCTRL (hv_nested ? HV_REGISTER_NESTED_SCONTROL : HV_REGISTER_SCONTROL) > +#define REG_SINT0 (hv_nested ? HV_REGISTER_NESTED_SINT0 : HV_REGISTER_SINT0) > + > /* > * hv_init - Main initialization routine. > * > @@ -147,7 +152,7 @@ int hv_synic_alloc(void) > * Synic message and event pages are allocated by paravisor. > * Skip these pages allocation here. > */ > - if (!hv_isolation_type_snp()) { > + if (!hv_isolation_type_snp() && !hv_root_partition) { > hv_cpu->synic_message_page = > (void *)get_zeroed_page(GFP_ATOMIC); > if (hv_cpu->synic_message_page == NULL) { > @@ -188,8 +193,16 @@ void hv_synic_free(void) > struct hv_per_cpu_context *hv_cpu > = per_cpu_ptr(hv_context.cpu_context, cpu); > > - free_page((unsigned long)hv_cpu->synic_event_page); > - free_page((unsigned long)hv_cpu->synic_message_page); > + if (hv_root_partition) { > + if (hv_cpu->synic_event_page != NULL) > + memunmap(hv_cpu->synic_event_page); > + > + if (hv_cpu->synic_message_page != NULL) > + memunmap(hv_cpu->synic_message_page); > + } else { > + free_page((unsigned long)hv_cpu->synic_event_page); > + free_page((unsigned long)hv_cpu->synic_message_page); > + } > free_page((unsigned long)hv_cpu->post_msg_page); > } > > @@ -213,10 +226,10 @@ void hv_synic_enable_regs(unsigned int cpu) > union hv_synic_scontrol sctrl; > > /* Setup the Synic's message page */ > - simp.as_uint64 = hv_get_register(HV_REGISTER_SIMP); > + simp.as_uint64 = hv_get_register(REG_SIMP); To avoid all this code churn (here and in the next patch dealing with EOM), would it make sense to move the logic picking nested/non-nested register into hv_{get,set}_register() instead? E.g. something like (untested, incomplete): static inline u32 hv_get_nested_reg(u32 reg) { switch (reg) { HV_REGISTER_SIMP: return HV_REGISTER_NESTED_SIMP; HV_REGISTER_NESTED_SVERSION: return HV_REGISTER_NESTED_SVERSION; ... default: return reg; } } static inline u64 hv_get_register(unsigned int reg) { u64 value; if (hv_nested) reg = hv_get_nested_reg(reg); if (hv_is_synic_reg(reg) && hv_isolation_type_snp()) hv_ghcb_msr_read(reg, &value); else rdmsrl(reg, value); return value; } static inline void hv_set_register(unsigned int reg, u64 value) { if (hv_nested) reg = hv_get_nested_reg(reg); if (hv_is_synic_reg(reg) && hv_isolation_type_snp()) { hv_ghcb_msr_write(reg, value); /* Write proxy bit via wrmsl instruction */ if (reg >= HV_REGISTER_SINT0 && reg <= HV_REGISTER_SINT15) wrmsrl(reg, value | 1 << 20); } else { wrmsrl(reg, value); } } > simp.simp_enabled = 1; > > - if (hv_isolation_type_snp()) { > + if (hv_isolation_type_snp() || hv_root_partition) { > hv_cpu->synic_message_page > = memremap(simp.base_simp_gpa << HV_HYP_PAGE_SHIFT, > HV_HYP_PAGE_SIZE, MEMREMAP_WB); > @@ -227,13 +240,13 @@ void hv_synic_enable_regs(unsigned int cpu) > >> HV_HYP_PAGE_SHIFT; > } > > - hv_set_register(HV_REGISTER_SIMP, simp.as_uint64); > + hv_set_register(REG_SIMP, simp.as_uint64); > > /* Setup the Synic's event page */ > - siefp.as_uint64 = hv_get_register(HV_REGISTER_SIEFP); > + siefp.as_uint64 = hv_get_register(REG_SIEFP); > siefp.siefp_enabled = 1; > > - if (hv_isolation_type_snp()) { > + if (hv_isolation_type_snp() || hv_root_partition) { > hv_cpu->synic_event_page = > memremap(siefp.base_siefp_gpa << HV_HYP_PAGE_SHIFT, > HV_HYP_PAGE_SIZE, MEMREMAP_WB); > @@ -245,12 +258,12 @@ void hv_synic_enable_regs(unsigned int cpu) > >> HV_HYP_PAGE_SHIFT; > } > > - hv_set_register(HV_REGISTER_SIEFP, siefp.as_uint64); > + hv_set_register(REG_SIEFP, siefp.as_uint64); > > /* Setup the shared SINT. */ > if (vmbus_irq != -1) > enable_percpu_irq(vmbus_irq, 0); > - shared_sint.as_uint64 = hv_get_register(HV_REGISTER_SINT0 + > + shared_sint.as_uint64 = hv_get_register(REG_SINT0 + > VMBUS_MESSAGE_SINT); > > shared_sint.vector = vmbus_interrupt; > @@ -266,14 +279,14 @@ void hv_synic_enable_regs(unsigned int cpu) > #else > shared_sint.auto_eoi = 0; > #endif > - hv_set_register(HV_REGISTER_SINT0 + VMBUS_MESSAGE_SINT, > + hv_set_register(REG_SINT0 + VMBUS_MESSAGE_SINT, > shared_sint.as_uint64); > > /* Enable the global synic bit */ > - sctrl.as_uint64 = hv_get_register(HV_REGISTER_SCONTROL); > + sctrl.as_uint64 = hv_get_register(REG_SCTRL); > sctrl.enable = 1; > > - hv_set_register(HV_REGISTER_SCONTROL, sctrl.as_uint64); > + hv_set_register(REG_SCTRL, sctrl.as_uint64); > } > > int hv_synic_init(unsigned int cpu) > @@ -297,17 +310,17 @@ void hv_synic_disable_regs(unsigned int cpu) > union hv_synic_siefp siefp; > union hv_synic_scontrol sctrl; > > - shared_sint.as_uint64 = hv_get_register(HV_REGISTER_SINT0 + > + shared_sint.as_uint64 = hv_get_register(REG_SINT0 + > VMBUS_MESSAGE_SINT); > > shared_sint.masked = 1; > > /* Need to correctly cleanup in the case of SMP!!! */ > /* Disable the interrupt */ > - hv_set_register(HV_REGISTER_SINT0 + VMBUS_MESSAGE_SINT, > + hv_set_register(REG_SINT0 + VMBUS_MESSAGE_SINT, > shared_sint.as_uint64); > > - simp.as_uint64 = hv_get_register(HV_REGISTER_SIMP); > + simp.as_uint64 = hv_get_register(REG_SIMP); > /* > * In Isolation VM, sim and sief pages are allocated by > * paravisor. These pages also will be used by kdump > @@ -320,9 +333,9 @@ void hv_synic_disable_regs(unsigned int cpu) > else > simp.base_simp_gpa = 0; > > - hv_set_register(HV_REGISTER_SIMP, simp.as_uint64); > + hv_set_register(REG_SIMP, simp.as_uint64); > > - siefp.as_uint64 = hv_get_register(HV_REGISTER_SIEFP); > + siefp.as_uint64 = hv_get_register(REG_SIEFP); > siefp.siefp_enabled = 0; > > if (hv_isolation_type_snp()) > @@ -330,12 +343,12 @@ void hv_synic_disable_regs(unsigned int cpu) > else > siefp.base_siefp_gpa = 0; > > - hv_set_register(HV_REGISTER_SIEFP, siefp.as_uint64); > + hv_set_register(REG_SIEFP, siefp.as_uint64); > > /* Disable the global synic bit */ > - sctrl.as_uint64 = hv_get_register(HV_REGISTER_SCONTROL); > + sctrl.as_uint64 = hv_get_register(REG_SCTRL); > sctrl.enable = 0; > - hv_set_register(HV_REGISTER_SCONTROL, sctrl.as_uint64); > + hv_set_register(REG_SCTRL, sctrl.as_uint64); > > if (vmbus_irq != -1) > disable_percpu_irq(vmbus_irq); -- Vitaly