From patchwork Fri Dec 1 10:45:35 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Durrant X-Patchwork-Id: 172413 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:bcd1:0:b0:403:3b70:6f57 with SMTP id r17csp1025914vqy; Fri, 1 Dec 2023 02:46:44 -0800 (PST) X-Google-Smtp-Source: AGHT+IG00sU3+V44GUxXVCGI2gtEnyC1+FRP9kvFDRKis4u1rnEHo7Xgf+YaetzmZfdD1LW7vPM5 X-Received: by 2002:a17:90b:80b:b0:285:8673:450d with SMTP id bk11-20020a17090b080b00b002858673450dmr24881528pjb.40.1701427603985; Fri, 01 Dec 2023 02:46:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1701427603; cv=none; d=google.com; s=arc-20160816; b=EpzfjalIQa6Sdeq72W8f1z7/33C432Wv1dGbNTQ6CTvJSzKXNMh4a8Mcii+SFSSLBu hxkE5FLxqR/FSMCmSnKLGW9HxiPwc0nKJTdOL6rFWUB23oJl05ER82TbcV1UwCeItYTq AVSR5AWptKcTonXwL2DTOB7vwlTBZ+DPZqn01sPCW+s8Z2p5THfdr9V+tv0J/pej1Otb myXdkvKtVJYrG0S11olNr9CkOe4mAiCVrhjfX4abc3Zd5s3CESQ9JTHoFx0lxpowa7MA TBStFcm0n+UZEyEtOdSQe8f+lBUytvt/E4lNaExtEvQQwdJtPzRnkgGjZJbL+7Xp7xNr wIUg== 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:to:from :dkim-signature; bh=XqNvN8Mg13YD+DXjeh+PV6E2xDfXAoMQ4rXRMVJHewY=; fh=Cum1qOF0YrAzH/5yQjcCBfU63B+V0l01YtzsDBRUOAc=; b=Z3vnyGaVzmRy5vaxneuVeSjB9mBR0tq+N4YqYG7R/pOaFTTCUjs6olDyNkzog3kk0S yQpFDMvl3IJ1aUGvIAP5FAbpuFfLsRp+X3hhotBUWwkMT5WQetOJsIJ9fJQh0xQOI4rI lw9AN6eB50etlkYdlvFSXwhkvRXD6FAIcqjl4AM9x+xO+8Iz3+zznaKwa3lalC4+ZI0B 2pIXmcfYEp7yE0RFM47bsXQV3OqXeeAsfY/1RjvTUVfkTuuYiN5VsOLGGNWmTsetm3+y HN9d24kWPz+4DETgXgxc8IzEl8smUbIE8Excafoaqk5MqVCzt8A1zV1D61PgLmwZ1UKV A0ag== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@xen.org header.s=20200302mail header.b=kI8mcnYH; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from agentk.vger.email (agentk.vger.email. [2620:137:e000::3:2]) by mx.google.com with ESMTPS id t6-20020a170902e84600b001cf7c3a22c9si3234914plg.276.2023.12.01.02.46.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 01 Dec 2023 02:46:43 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) client-ip=2620:137:e000::3:2; Authentication-Results: mx.google.com; dkim=pass header.i=@xen.org header.s=20200302mail header.b=kI8mcnYH; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id 19B6480F6692; Fri, 1 Dec 2023 02:46:39 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1378396AbjLAKqS (ORCPT + 99 others); Fri, 1 Dec 2023 05:46:18 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34946 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1378388AbjLAKqP (ORCPT ); Fri, 1 Dec 2023 05:46:15 -0500 Received: from mail.xenproject.org (mail.xenproject.org [104.130.215.37]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DBD47196; Fri, 1 Dec 2023 02:46:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=xen.org; s=20200302mail; h=Content-Transfer-Encoding:MIME-Version:References: In-Reply-To:Message-Id:Date:Subject:To:From; bh=XqNvN8Mg13YD+DXjeh+PV6E2xDfXAoMQ4rXRMVJHewY=; b=kI8mcnYHDv1ww3/E+0zAz51qll 2OI4JiPs8G0XPAmE5gRwij/dPDhSkNZ6shIgZHO9dxsHaOnRzlSnVFQ8Daoom9nllED8XVlBguhzJ iG+uYpBwt+xLLqZpwmKL8XmLhrwT5MsXQOjtp6GTgiWPIMYjzD8eJtvC4MsW9QrVYPS4=; Received: from xenbits.xenproject.org ([104.239.192.120]) by mail.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1r911t-0005P4-7Z; Fri, 01 Dec 2023 10:45:53 +0000 Received: from 54-240-197-231.amazon.com ([54.240.197.231] helo=REM-PW02S00X.ant.amazon.com) by xenbits.xenproject.org with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1r911s-0003dT-Je; Fri, 01 Dec 2023 10:45:53 +0000 From: Paul Durrant To: David Woodhouse , Paul Durrant , Sean Christopherson , Paolo Bonzini , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , kvm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/2] KVM: xen: separate initialization of shared_info cache and content Date: Fri, 1 Dec 2023 10:45:35 +0000 Message-Id: <20231201104536.947-2-paul@xen.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231201104536.947-1-paul@xen.org> References: <20231201104536.947-1-paul@xen.org> MIME-Version: 1.0 X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on agentk.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Fri, 01 Dec 2023 02:46:39 -0800 (PST) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1784076151081308776 X-GMAIL-MSGID: 1784076151081308776 From: Paul Durrant The shared_info cache should only need to be set up once by the VMM, but the content of the shared_info page may need changed if the mode of guest changes from 32-bit to 64-bit or vice versa. This re-initialization of the content will be handles in a subsequent patch. Signed-off-by: Paul Durrant --- arch/x86/kvm/xen.c | 70 ++++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c index cfd5051e0800..7bead3f65e55 100644 --- a/arch/x86/kvm/xen.c +++ b/arch/x86/kvm/xen.c @@ -34,7 +34,7 @@ static bool kvm_xen_hcall_evtchn_send(struct kvm_vcpu *vcpu, u64 param, u64 *r); DEFINE_STATIC_KEY_DEFERRED_FALSE(kvm_xen_enabled, HZ); -static int kvm_xen_shared_info_init(struct kvm *kvm, u64 addr, bool addr_is_gfn) +static int kvm_xen_shared_info_init(struct kvm *kvm) { struct gfn_to_pfn_cache *gpc = &kvm->arch.xen.shinfo_cache; struct pvclock_wall_clock *wc; @@ -44,34 +44,22 @@ static int kvm_xen_shared_info_init(struct kvm *kvm, u64 addr, bool addr_is_gfn) int ret = 0; int idx = srcu_read_lock(&kvm->srcu); - if ((addr_is_gfn && addr == KVM_XEN_INVALID_GFN) || - (!addr_is_gfn && addr == 0)) { - kvm_gpc_deactivate(gpc); - goto out; - } + read_lock_irq(&gpc->lock); + while (!kvm_gpc_check(gpc, PAGE_SIZE)) { + read_unlock_irq(&gpc->lock); - do { - if (addr_is_gfn) - ret = kvm_gpc_activate(gpc, gfn_to_gpa(addr), PAGE_SIZE); - else - ret = kvm_gpc_activate_hva(gpc, addr, PAGE_SIZE); + ret = kvm_gpc_refresh(gpc, PAGE_SIZE); if (ret) goto out; - /* - * This code mirrors kvm_write_wall_clock() except that it writes - * directly through the pfn cache and doesn't mark the page dirty. - */ - wall_nsec = kvm_get_wall_clock_epoch(kvm); - - /* It could be invalid again already, so we need to check */ read_lock_irq(&gpc->lock); + } - if (gpc->valid) - break; - - read_unlock_irq(&gpc->lock); - } while (1); + /* + * This code mirrors kvm_write_wall_clock() except that it writes + * directly through the pfn cache and doesn't mark the page dirty. + */ + wall_nsec = ktime_get_real_ns() - get_kvmclock_ns(kvm); /* Paranoia checks on the 32-bit struct layout */ BUILD_BUG_ON(offsetof(struct compat_shared_info, wc) != 0x900); @@ -642,17 +630,39 @@ int kvm_xen_hvm_set_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data) break; case KVM_XEN_ATTR_TYPE_SHARED_INFO: - mutex_lock(&kvm->arch.xen.xen_lock); - r = kvm_xen_shared_info_init(kvm, data->u.shared_info.gfn, true); - mutex_unlock(&kvm->arch.xen.xen_lock); - break; + case KVM_XEN_ATTR_TYPE_SHARED_INFO_HVA: { + int idx; - case KVM_XEN_ATTR_TYPE_SHARED_INFO_HVA: mutex_lock(&kvm->arch.xen.xen_lock); - r = kvm_xen_shared_info_init(kvm, data->u.shared_info.hva, false); + + idx = srcu_read_lock(&kvm->srcu); + if (data->type == KVM_XEN_ATTR_TYPE_SHARED_INFO) { + if (data->u.shared_info.gfn == KVM_XEN_INVALID_GFN) { + kvm_gpc_deactivate(&kvm->arch.xen.shinfo_cache); + r = 0; + } else { + r = kvm_gpc_activate(&kvm->arch.xen.shinfo_cache, + gfn_to_gpa(data->u.shared_info.gfn), + PAGE_SIZE); + } + } else { + if (data->u.shared_info.hva == 0) { + kvm_gpc_deactivate(&kvm->arch.xen.shinfo_cache); + r = 0; + } else { + r = kvm_gpc_activate_hva(&kvm->arch.xen.shinfo_cache, + data->u.shared_info.hva, + PAGE_SIZE); + } + } + srcu_read_unlock(&kvm->srcu, idx); + + if (!r && kvm->arch.xen.shinfo_cache.active) + r = kvm_xen_shared_info_init(kvm); + mutex_unlock(&kvm->arch.xen.xen_lock); break; - + } case KVM_XEN_ATTR_TYPE_UPCALL_VECTOR: if (data->u.vector && data->u.vector < 0x10) r = -EINVAL;