From patchwork Thu Aug 17 14:44:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wei Liu X-Patchwork-Id: 9906527 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id E26576038C for ; Thu, 17 Aug 2017 14:49:47 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D38A428B3B for ; Thu, 17 Aug 2017 14:49:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C818828B3D; Thu, 17 Aug 2017 14:49:47 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 3160728B3B for ; Thu, 17 Aug 2017 14:49:47 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1diM5C-0002zB-Ut; Thu, 17 Aug 2017 14:47:38 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1diM5A-0002t6-Sn for xen-devel@lists.xenproject.org; Thu, 17 Aug 2017 14:47:36 +0000 Received: from [85.158.139.211] by server-10.bemta-5.messagelabs.com id 51/6F-01732-88CA5995; Thu, 17 Aug 2017 14:47:36 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprAIsWRWlGSWpSXmKPExsXitHSDvW77mqm RBm0flS2+b5nM5MDocfjDFZYAxijWzLyk/IoE1oz7x0ULLthWrL52jLGBsUG/i5GTQ0LAX6Kv aSsziM0moCzxs7OXDcQWEdCTaDrwnLGLkYuDWWAOo8TUuV2MIAlhAReJQ60bWEFsFgFViUUzt wLFOTh4BSwldj/JgZgpL7Gr7SJYCSdQ+NCkxWDzhQQsJGZ/aGeHsBUkOqYfYwKxeQUEJU7OfM ICYjMLSEgcfPGCeQIj7ywkqVlIUgsYmVYxahSnFpWlFukaGuglFWWmZ5TkJmbmAHmmermpxcW J6ak5iUnFesn5uZsYgaHDAAQ7GNdMdT7EKMnBpCTK+3vWlEghvqT8lMqMxOKM+KLSnNTiQ4wy HBxKEryFq6dGCgkWpaanVqRl5gCDGCYtwcGjJMJbCZLmLS5IzC3OTIdInWLU5Xg14f83JiGWv Py8VClx3kiQIgGQoozSPLgRsIi6xCgrJczLCHSUEE9BalFuZgmq/CtGcQ5GJWFeX5ApPJl5JX CbXgEdwQR0xJX2SSBHlCQipKQaGBs/vX554e43/ct/JVOPKB+co6Lruri+rnX55peHTsy8u2q 75MnOI29vTv2Zcpv50MHDO7J4avzWn9d5skzi7rw36+fwuKodfSk4aUFZl6aQfcceow0xZ09b n2FfIrP7XI/ZFYUfa1e9OZ1ufVt3gr6WitbV0luTXhmrGvRZfZudsObSWg2LOJH7SizFGYmGW sxFxYkAo9z5WKMCAAA= X-Env-Sender: prvs=395e6b081=wei.liu2@citrix.com X-Msg-Ref: server-6.tower-206.messagelabs.com!1502981244!104877606!6 X-Originating-IP: [66.165.176.63] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 9.4.45; banners=-,-,- X-VirusChecked: Checked Received: (qmail 2241 invoked from network); 17 Aug 2017 14:47:35 -0000 Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63) by server-6.tower-206.messagelabs.com with RC4-SHA encrypted SMTP; 17 Aug 2017 14:47:35 -0000 X-IronPort-AV: E=Sophos;i="5.41,388,1498521600"; d="scan'208";a="444178871" From: Wei Liu To: Xen-devel Date: Thu, 17 Aug 2017 15:44:39 +0100 Message-ID: <20170817144456.18989-15-wei.liu2@citrix.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170817144456.18989-1-wei.liu2@citrix.com> References: <20170817144456.18989-1-wei.liu2@citrix.com> MIME-Version: 1.0 Cc: George Dunlap , Andrew Cooper , Wei Liu , Jan Beulich Subject: [Xen-devel] [PATCH v4 14/31] x86/mm: move and rename guest_{, un}map_l1e X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP Move them to pv/mm.c and rename them pv_{,un}map_guest_l1e. Signed-off-by: Wei Liu --- xen/arch/x86/mm.c | 63 +++++++++++---------------------------------- xen/arch/x86/pv/mm.c | 33 ++++++++++++++++++++++++ xen/include/asm-x86/pv/mm.h | 9 +++++++ 3 files changed, 57 insertions(+), 48 deletions(-) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index dd8fa43ef3..c42dd5f8f5 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -512,39 +512,6 @@ void update_cr3(struct vcpu *v) make_cr3(v, cr3_mfn); } -/* Get a mapping of a PV guest's l1e for this virtual address. */ -static l1_pgentry_t *guest_map_l1e(unsigned long addr, unsigned long *gl1mfn) -{ - l2_pgentry_t l2e; - - ASSERT(!paging_mode_translate(current->domain)); - ASSERT(!paging_mode_external(current->domain)); - - if ( unlikely(!__addr_ok(addr)) ) - return NULL; - - /* Find this l1e and its enclosing l1mfn in the linear map. */ - if ( __copy_from_user(&l2e, - &__linear_l2_table[l2_linear_offset(addr)], - sizeof(l2_pgentry_t)) ) - return NULL; - - /* Check flags that it will be safe to read the l1e. */ - if ( (l2e_get_flags(l2e) & (_PAGE_PRESENT | _PAGE_PSE)) != _PAGE_PRESENT ) - return NULL; - - *gl1mfn = l2e_get_pfn(l2e); - - return (l1_pgentry_t *)map_domain_page(_mfn(*gl1mfn)) + - l1_table_offset(addr); -} - -/* Pull down the mapping we got from guest_map_l1e(). */ -static inline void guest_unmap_l1e(void *p) -{ - unmap_domain_page(p); -} - static inline void page_set_tlbflush_timestamp(struct page_info *page) { /* @@ -3786,7 +3753,7 @@ static int create_grant_va_mapping( adjust_guest_l1e(nl1e, d); - pl1e = guest_map_l1e(va, &gl1mfn); + pl1e = pv_map_guest_l1e(va, &gl1mfn); if ( !pl1e ) { gdprintk(XENLOG_WARNING, "Could not find L1 PTE for address %lx\n", va); @@ -3795,7 +3762,7 @@ static int create_grant_va_mapping( if ( !get_page_from_mfn(_mfn(gl1mfn), current->domain) ) { - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return GNTST_general_error; } @@ -3803,7 +3770,7 @@ static int create_grant_va_mapping( if ( !page_lock(l1pg) ) { put_page(l1pg); - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return GNTST_general_error; } @@ -3811,7 +3778,7 @@ static int create_grant_va_mapping( { page_unlock(l1pg); put_page(l1pg); - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return GNTST_general_error; } @@ -3820,7 +3787,7 @@ static int create_grant_va_mapping( page_unlock(l1pg); put_page(l1pg); - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); if ( okay ) put_page_from_l1e(ol1e, d); @@ -3836,7 +3803,7 @@ static int replace_grant_va_mapping( struct page_info *l1pg; int rc = 0; - pl1e = guest_map_l1e(addr, &gl1mfn); + pl1e = pv_map_guest_l1e(addr, &gl1mfn); if ( !pl1e ) { gdprintk(XENLOG_WARNING, "Could not find L1 PTE for address %lx\n", addr); @@ -3887,7 +3854,7 @@ static int replace_grant_va_mapping( page_unlock(l1pg); put_page(l1pg); out: - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return rc; } @@ -3945,7 +3912,7 @@ int replace_grant_pv_mapping(uint64_t addr, unsigned long frame, if ( !new_addr ) return destroy_grant_va_mapping(addr, frame, curr); - pl1e = guest_map_l1e(new_addr, &gl1mfn); + pl1e = pv_map_guest_l1e(new_addr, &gl1mfn); if ( !pl1e ) { gdprintk(XENLOG_WARNING, @@ -3955,7 +3922,7 @@ int replace_grant_pv_mapping(uint64_t addr, unsigned long frame, if ( !get_page_from_mfn(_mfn(gl1mfn), current->domain) ) { - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return GNTST_general_error; } @@ -3963,7 +3930,7 @@ int replace_grant_pv_mapping(uint64_t addr, unsigned long frame, if ( !page_lock(l1pg) ) { put_page(l1pg); - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return GNTST_general_error; } @@ -3971,7 +3938,7 @@ int replace_grant_pv_mapping(uint64_t addr, unsigned long frame, { page_unlock(l1pg); put_page(l1pg); - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return GNTST_general_error; } @@ -3983,13 +3950,13 @@ int replace_grant_pv_mapping(uint64_t addr, unsigned long frame, page_unlock(l1pg); put_page(l1pg); gdprintk(XENLOG_WARNING, "Cannot delete PTE entry at %p\n", pl1e); - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return GNTST_general_error; } page_unlock(l1pg); put_page(l1pg); - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); rc = replace_grant_va_mapping(addr, frame, ol1e, curr); if ( rc ) @@ -4123,7 +4090,7 @@ static int __do_update_va_mapping( return rc; rc = -EINVAL; - pl1e = guest_map_l1e(va, &gl1mfn); + pl1e = pv_map_guest_l1e(va, &gl1mfn); if ( unlikely(!pl1e || !get_page_from_mfn(_mfn(gl1mfn), d)) ) goto out; @@ -4148,7 +4115,7 @@ static int __do_update_va_mapping( out: if ( pl1e ) - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); switch ( flags & UVMF_FLUSHTYPE_MASK ) { diff --git a/xen/arch/x86/pv/mm.c b/xen/arch/x86/pv/mm.c index 2cb5995e62..32e73d59df 100644 --- a/xen/arch/x86/pv/mm.c +++ b/xen/arch/x86/pv/mm.c @@ -63,6 +63,39 @@ void pv_get_guest_eff_kern_l1e(struct vcpu *v, unsigned long addr, toggle_guest_mode(v); } +/* Get a mapping of a PV guest's l1e for this virtual address. */ +l1_pgentry_t *pv_map_guest_l1e(unsigned long addr, unsigned long *gl1mfn) +{ + l2_pgentry_t l2e; + + ASSERT(!paging_mode_translate(current->domain)); + ASSERT(!paging_mode_external(current->domain)); + + if ( unlikely(!__addr_ok(addr)) ) + return NULL; + + /* Find this l1e and its enclosing l1mfn in the linear map. */ + if ( __copy_from_user(&l2e, + &__linear_l2_table[l2_linear_offset(addr)], + sizeof(l2_pgentry_t)) ) + return NULL; + + /* Check flags that it will be safe to read the l1e. */ + if ( (l2e_get_flags(l2e) & (_PAGE_PRESENT | _PAGE_PSE)) != _PAGE_PRESENT ) + return NULL; + + *gl1mfn = l2e_get_pfn(l2e); + + return (l1_pgentry_t *)map_domain_page(_mfn(*gl1mfn)) + + l1_table_offset(addr); +} + +/* Pull down the mapping we got from pv_map_guest_l1e(). */ +void pv_unmap_guest_l1e(void *p) +{ + unmap_domain_page(p); +} + /* * How to write an entry to the guest pagetables. * Returns false for failure (pointer not valid), true for success. diff --git a/xen/include/asm-x86/pv/mm.h b/xen/include/asm-x86/pv/mm.h index b3887989b6..006156d0e1 100644 --- a/xen/include/asm-x86/pv/mm.h +++ b/xen/include/asm-x86/pv/mm.h @@ -86,6 +86,9 @@ bool pv_update_intpte(intpte_t *p, intpte_t old, intpte_t new, _t ## e_get_intpte(_o), _t ## e_get_intpte(_n), \ (_m), (_v), (_ad)) +l1_pgentry_t *pv_map_guest_l1e(unsigned long addr, unsigned long *gl1mfn); +void pv_unmap_guest_l1e(void *p); + #else static inline void pv_get_guest_eff_l1e(unsigned long addr, @@ -101,6 +104,12 @@ static inline bool pv_update_intpte(intpte_t *p, intpte_t old, intpte_t new, int preserve_ad) { return false; } +static inline l1_pgentry_t *pv_map_guest_l1e(unsigned long addr, + unsigned long *gl1mfn); +{ return NULL; } + +static inline void pv_unmap_guest_l1e(void *p) {} + #endif #endif /* __X86_PV_MM_H__ */