From patchwork Thu Jul 20 16:04:19 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wei Liu X-Patchwork-Id: 9855327 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 0D48D600F5 for ; Thu, 20 Jul 2017 16:18:39 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F20DA2870D for ; Thu, 20 Jul 2017 16:18:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E704F28725; Thu, 20 Jul 2017 16:18:38 +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 DB9822870D for ; Thu, 20 Jul 2017 16:18:37 +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 1dYE7u-0002ws-Om; Thu, 20 Jul 2017 16:16:34 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dYE7u-0002vW-4i for xen-devel@lists.xenproject.org; Thu, 20 Jul 2017 16:16:34 +0000 Received: from [85.158.139.211] by server-1.bemta-5.messagelabs.com id C9/09-01993-167D0795; Thu, 20 Jul 2017 16:16:33 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprIIsWRWlGSWpSXmKPExsXitHSDvW7i9YJ Ig7ttLBbft0xmcmD0OPzhCksAYxRrZl5SfkUCa8aV+3kFR2wruto6GBsYv+h1MXJySAj4S9yY s4UdxGYTUJb42dnLBmKLCOhJNB14ztjFyMXBLDCHUWLq3C5GkISwgItE/7w5YA0sAqoSE+40g jXwClhI3D66iAliqLzErraLrCA2J1B8za+vYHEhAXOJzfvns0DYChId048xQfQKSpyc+QQszi wgIXHwxQvmCYy8s5CkZiFJLWBkWsWoUZxaVJZapGtkoJdUlJmeUZKbmJmja2hgqpebWlycmJ6 ak5hUrJecn7uJERg89QwMjDsYG2f7HWKU5GBSEuVlCSyIFOJLyk+pzEgszogvKs1JLT7EKMPB oSTBy3ANKCdYlJqeWpGWmQMMY5i0BAePkgivIEiat7ggMbc4Mx0idYpRl+PVhP/fmIRY8vLzU qXEeW1AigRAijJK8+BGwGLqEqOslDAvIwMDgxBPQWpRbmYJqvwrRnEORiVh3niQKTyZeSVwm1 4BHcEEdMQjN7AjShIRUlINjHquJ9Z8WtZcaWAZvuHrLKez1v82/OTf/CRaVda56OeWy4d+vtp m/+auRz3bLF33ZNfDFo3vrh1ccKe5VtvzxaLN/SvdnAvtnT+8f9M4PZtZ4KnuL/WdxhJb/9yz 4ms98vPQn4KKJqaTG9r/prtFz/242Wsaj/e1CsOMPeIz57qaWHmn825ovarEUpyRaKjFXFScC AChL69GpAIAAA== X-Env-Sender: prvs=3674d857a=wei.liu2@citrix.com X-Msg-Ref: server-4.tower-206.messagelabs.com!1500567381!103772445!5 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.25; banners=-,-,- X-VirusChecked: Checked Received: (qmail 64721 invoked from network); 20 Jul 2017 16:16:32 -0000 Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63) by server-4.tower-206.messagelabs.com with RC4-SHA encrypted SMTP; 20 Jul 2017 16:16:32 -0000 X-IronPort-AV: E=Sophos;i="5.40,384,1496102400"; d="scan'208";a="440670518" From: Wei Liu To: Xen-devel Date: Thu, 20 Jul 2017 17:04:19 +0100 Message-ID: <20170720160426.2343-15-wei.liu2@citrix.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170720160426.2343-1-wei.liu2@citrix.com> References: <20170720160426.2343-1-wei.liu2@citrix.com> MIME-Version: 1.0 Cc: George Dunlap , Andrew Cooper , Wei Liu , Jan Beulich Subject: [Xen-devel] [PATCH v3 14/21] 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 c0a6ecc5b6..5a9cc7173a 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -535,39 +535,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) { /* @@ -4014,7 +3981,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); @@ -4023,7 +3990,7 @@ static int create_grant_va_mapping( if ( get_page_from_pagenr(gl1mfn, current->domain) ) { - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return GNTST_general_error; } @@ -4031,7 +3998,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; } @@ -4039,7 +4006,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; } @@ -4048,7 +4015,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); @@ -4064,7 +4031,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); @@ -4115,7 +4082,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; } @@ -4173,7 +4140,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, @@ -4183,7 +4150,7 @@ int replace_grant_pv_mapping(uint64_t addr, unsigned long frame, if ( get_page_from_pagenr(gl1mfn, current->domain) ) { - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return GNTST_general_error; } @@ -4191,7 +4158,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; } @@ -4199,7 +4166,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; } @@ -4211,13 +4178,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 ) @@ -4351,7 +4318,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_pagenr(gl1mfn, d)) ) goto out; @@ -4376,7 +4343,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 4931bccb29..a71ce934fa 100644 --- a/xen/include/asm-x86/pv/mm.h +++ b/xen/include/asm-x86/pv/mm.h @@ -87,6 +87,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, @@ -102,6 +105,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__ */