From nobody Fri Apr 19 06:36:21 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1555099787; cv=none; d=zoho.com; s=zohoarc; b=ImGfy9R8ukAnvlKVyAToWUhUbOyLcl3c27l+TfTkt7+Q/vuprEkIta4svchfkRareisUvtWOdXAFsohxHyQzrJ89qTdjh3wYi0rP3Y8lDnXbDlv5IwbxI6NbTLikGnfQIpkIFxgtf6K7Tv7oGrwciNg5mFPQUH8ROldUwzo+Stc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1555099787; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:To:ARC-Authentication-Results; bh=xw74n5xvDSmf9VLWxy69pp2WySOc25Wn0gwlZpbVHSA=; b=fWqicFhxSX8DyImnATQjpWqf4zvQHF5RcfmVHxB7+iEFeb5aza5zx+hbaNsAesVROxgGQ/U4Cw77Xc4Q+3lFm1BfD1BBwC5bQEGgN8fCKmTxGrAA9ZVsrHWwxrMD+26aD0zkpFpnoTkEW3DjJGrw5d1ktMcEIBOojGyZD61VE5M= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1555099787478624.6044013749485; Fri, 12 Apr 2019 13:09:47 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hF2TI-0005oc-Cr; Fri, 12 Apr 2019 20:08:24 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hF2TH-0005oX-AG for xen-devel@lists.xenproject.org; Fri, 12 Apr 2019 20:08:23 +0000 Received: from mail-it1-f196.google.com (unknown [209.85.166.196]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id b89da094-5d5e-11e9-92d7-bc764e045a96; Fri, 12 Apr 2019 20:08:21 +0000 (UTC) Received: by mail-it1-f196.google.com with SMTP id a190so1184891ite.4 for ; Fri, 12 Apr 2019 13:08:21 -0700 (PDT) Received: from localhost.localdomain (c-71-205-12-124.hsd1.co.comcast.net. [71.205.12.124]) by smtp.gmail.com with ESMTPSA id p67sm4710768itb.11.2019.04.12.13.08.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 12 Apr 2019 13:08:20 -0700 (PDT) X-Inumbo-ID: b89da094-5d5e-11e9-92d7-bc764e045a96 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:mime-version :content-transfer-encoding; bh=LkvSBcEEp+IPnLjJne8UddoM10A6puIcSSrFrNhRh4c=; b=anAp7Z2MhD0+cvzxR6SwthP3WOGGhDxFPgMDZ/5+La9lrNKEEygY7GEH3uKipnASAI bUe1ZqNE1qdFdmKy1I1W9cDcvudgJvX00ibnsM8OldQGOt8aHBast0HM+F6YlqrBgigb hbntHi1SBRe8mJm2b8YGf927rPNks1Mvixgnq5sY37jrne8FTiSZbhL69cUCtWLn5h1c f9pw6uUTqUASYsXIdzJhKWTGgeDmlDYHSvx4aWzwmUZf85ehz0azt0xUB+6eKDcyPKiA O3RWeQhXzfuIyklox0usVvmFq0tFeYWDel7ZqjL1btEbyXV6P00uU/XAdqgFiouQJh7d Sxvw== X-Gm-Message-State: APjAAAXkR+P1bgfMzfTZ4cd0hp75gCGgYXZkFfk5DxzjGI5Zn1R9JtBe zBZDywziK/MS4l3pzdY7brrMyUch X-Google-Smtp-Source: APXvYqzSPAvIZNhlU+rAsnDpor4UwSlpv5zmYbpQU6CJU25KvNoJ49wqG3vhgxS5Yu4PJ6KpHhxf3A== X-Received: by 2002:a05:6638:25a:: with SMTP id w26mr35473905jaq.112.1555099701121; Fri, 12 Apr 2019 13:08:21 -0700 (PDT) From: Tamas K Lengyel To: xen-devel@lists.xenproject.org Date: Fri, 12 Apr 2019 14:08:13 -0600 Message-Id: <20190412200813.25447-1-tamas@tklengyel.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Subject: [Xen-devel] [PATCH v2] x86/altp2m: cleanup p2m_altp2m_lazy_copy X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Tamas K Lengyel , Wei Liu , George Dunlap , Andrew Cooper , Jan Beulich , Roger Pau Monne Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" The p2m_altp2m_lazy_copy is responsible for lazily populating an altp2m view when the guest traps out due to no EPT entry being present in the active vi= ew. Currently the function took several inputs that it didn't use and also locked/unlocked gfns when it didn't need to. Signed-off-by: Tamas K Lengyel Cc: Jan Beulich Cc: Andrew Cooper Cc: Wei Liu Cc: Roger Pau Monne Cc: George Dunlap Reviewed-by: Andrew Cooper --- v2: return bool; return early if hp2m entry is invalid; use gprintk and use more useful debug message --- xen/arch/x86/hvm/hvm.c | 7 +++-- xen/arch/x86/mm/p2m.c | 61 +++++++++++++++++++-------------------- xen/include/asm-x86/p2m.h | 5 ++-- 3 files changed, 37 insertions(+), 36 deletions(-) diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 8adbb61b57..813e69a4c9 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -1688,6 +1688,7 @@ int hvm_hap_nested_page_fault(paddr_t gpa, unsigned l= ong gla, int sharing_enomem =3D 0; vm_event_request_t *req_ptr =3D NULL; bool_t ap2m_active, sync =3D 0; + unsigned int page_order; =20 /* On Nested Virtualization, walk the guest page table. * If this succeeds, all is fine. @@ -1754,11 +1755,13 @@ int hvm_hap_nested_page_fault(paddr_t gpa, unsigned= long gla, hostp2m =3D p2m_get_hostp2m(currd); mfn =3D get_gfn_type_access(hostp2m, gfn, &p2mt, &p2ma, P2M_ALLOC | (npfec.write_access ? P2M_UNSHAR= E : 0), - NULL); + &page_order); =20 if ( ap2m_active ) { - if ( p2m_altp2m_lazy_copy(curr, gpa, gla, npfec, &p2m) ) + p2m =3D p2m_get_altp2m(curr); + + if ( p2m_altp2m_lazy_copy(p2m, gfn, mfn, p2mt, p2ma, page_order) ) { /* entry was lazily copied from host -- retry */ __put_gfn(hostp2m, gfn); diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c index b9bbb8f485..dcfa3d357b 100644 --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -2375,57 +2375,54 @@ bool_t p2m_switch_vcpu_altp2m_by_id(struct vcpu *v,= unsigned int idx) * indicate that outer handler should handle fault */ =20 -bool_t p2m_altp2m_lazy_copy(struct vcpu *v, paddr_t gpa, - unsigned long gla, struct npfec npfec, - struct p2m_domain **ap2m) +bool p2m_altp2m_lazy_copy(struct p2m_domain *ap2m, unsigned long gfn_l, + mfn_t hmfn, p2m_type_t hp2mt, p2m_access_t hp2ma, + unsigned int page_order) { - struct p2m_domain *hp2m =3D p2m_get_hostp2m(v->domain); - p2m_type_t p2mt; - p2m_access_t p2ma; - unsigned int page_order; - gfn_t gfn =3D _gfn(paddr_to_pfn(gpa)); + p2m_type_t ap2mt; + p2m_access_t ap2ma; unsigned long mask; - mfn_t mfn; - int rv; + gfn_t gfn; + mfn_t amfn; + int rc; =20 - *ap2m =3D p2m_get_altp2m(v); + /* No point checking the altp2m if entry is not present in hostp2m */ + if ( mfn_eq(hmfn, INVALID_MFN) ) + return false; =20 - mfn =3D get_gfn_type_access(*ap2m, gfn_x(gfn), &p2mt, &p2ma, - 0, &page_order); - __put_gfn(*ap2m, gfn_x(gfn)); + p2m_lock(ap2m); =20 - if ( !mfn_eq(mfn, INVALID_MFN) ) - return 0; + amfn =3D __get_gfn_type_access(ap2m, gfn_l, &ap2mt, &ap2ma, + 0, NULL, false); =20 - mfn =3D get_gfn_type_access(hp2m, gfn_x(gfn), &p2mt, &p2ma, - P2M_ALLOC, &page_order); - __put_gfn(hp2m, gfn_x(gfn)); =20 - if ( mfn_eq(mfn, INVALID_MFN) ) + /* If entry is in altp2m already caller should handle the fault */ + if ( !mfn_eq(amfn, INVALID_MFN) ) + { + p2m_unlock(ap2m); return 0; - - p2m_lock(*ap2m); + } =20 /* * If this is a superpage mapping, round down both frame numbers * to the start of the superpage. */ mask =3D ~((1UL << page_order) - 1); - mfn =3D _mfn(mfn_x(mfn) & mask); - gfn =3D _gfn(gfn_x(gfn) & mask); + hmfn =3D _mfn(mfn_x(hmfn) & mask); + gfn =3D _gfn(gfn_l & mask); =20 - rv =3D p2m_set_entry(*ap2m, gfn, mfn, page_order, p2mt, p2ma); - p2m_unlock(*ap2m); + rc =3D p2m_set_entry(ap2m, gfn, hmfn, page_order, hp2mt, hp2ma); + p2m_unlock(ap2m); =20 - if ( rv ) + if ( rc ) { - gdprintk(XENLOG_ERR, - "failed to set entry for %#"PRIx64" -> %#"PRIx64" p2m %#"PRIx64"\n", - gfn_x(gfn), mfn_x(mfn), (unsigned long)*ap2m); - domain_crash(hp2m->domain); + gprintk(XENLOG_ERR, + "failed to set entry for %#"PRIx64" -> %#"PRIx64" altp2m %#"PRIx16= ". rc: %"PRIi32"\n", + gfn_l, mfn_x(hmfn), vcpu_altp2m(current).p2midx, rc); + domain_crash(ap2m->domain); } =20 - return 1; + return true; } =20 enum altp2m_reset_type { diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h index 2801a8ccca..391e7688da 100644 --- a/xen/include/asm-x86/p2m.h +++ b/xen/include/asm-x86/p2m.h @@ -867,8 +867,9 @@ void p2m_altp2m_check(struct vcpu *v, uint16_t idx); void p2m_flush_altp2m(struct domain *d); =20 /* Alternate p2m paging */ -bool_t p2m_altp2m_lazy_copy(struct vcpu *v, paddr_t gpa, - unsigned long gla, struct npfec npfec, struct p2m_domain **ap2m); +bool p2m_altp2m_lazy_copy(struct p2m_domain *ap2m, unsigned long gfn_l, + mfn_t hmfn, p2m_type_t hp2mt, p2m_access_t hp2ma, + unsigned int page_order); =20 /* Make a specific alternate p2m valid */ int p2m_init_altp2m_by_id(struct domain *d, unsigned int idx); --=20 2.20.1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel