From patchwork Fri Aug 11 14:21:32 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Durrant X-Patchwork-Id: 9896085 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 628E660325 for ; Fri, 11 Aug 2017 14:24:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 54F0128689 for ; Fri, 11 Aug 2017 14:24:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 49B34286C5; Fri, 11 Aug 2017 14:24:19 +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 7CAFD28683 for ; Fri, 11 Aug 2017 14:24:16 +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 1dgAp3-0006Oc-2X; Fri, 11 Aug 2017 14:21:57 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dgAp1-0006OP-G0 for xen-devel@lists.xenproject.org; Fri, 11 Aug 2017 14:21:55 +0000 Received: from [85.158.137.68] by server-8.bemta-3.messagelabs.com id 54/31-02176-28DBD895; Fri, 11 Aug 2017 14:21:54 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupnkeJIrShJLcpLzFFi42JxWrrBXrdxb2+ kwZxWLovvWyYzOTB6HP5whSWAMYo1My8pvyKBNaPva2xBt1ZFy/Sb7A2Mr+S6GDk5JAT8JX5+ nMQOYrMJ6EhMfXqJtYuRg0NEQEXi9l6DLkYuDmaBU4wSs/7cZgOpERawkXj28ghYPYuAqsTs/ 7dZQGxeoPi1KZvZIGbKS+xqu8gKYnMK2Er83t4AZgsB1bw8+QrKVpFYP3UWG0SvoMTJmU/A5j ALSEgcfPGCeQIj7ywkqVlIUgsYmVYxqhenFpWlFuma6CUVZaZnlOQmZuboGhoY6+WmFhcnpqf mJCYV6yXn525iBAYOAxDsYGz84nSIUZKDSUmUN8GnN1KILyk/pTIjsTgjvqg0J7X4EKMMB4eS BC/XHqCcYFFqempFWmYOMIRh0hIcPEoivAtB0rzFBYm5xZnpEKlTjLocryb8/8YkxJKXn5cqJ c47HaRIAKQoozQPbgQsni4xykoJ8zICHSXEU5BalJtZgir/ilGcg1FJmFcbZApPZl4J3KZXQE cwAR3R5wN2REkiQkqqgVFzT8Ff09iyV3vnJovINhy7PmWp+/s2bVebwv2vmiw3f7kZkF0ppDW FbcKNuoqbyzfOOZsTVcYwfTM/8+alMq1dLzQ85Vdszm2+4//84+bGuIm7TjCJvDMXftqyRCV0 aWrGzm/RO6tLg84kJ1fuZesVfGAYcee2lNviiGmbM99fzZNc7sd29poSS3FGoqEWc1FxIgCsu WjUogIAAA== X-Env-Sender: prvs=389ee98fb=Paul.Durrant@citrix.com X-Msg-Ref: server-2.tower-31.messagelabs.com!1502461311!97942722!1 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 15891 invoked from network); 11 Aug 2017 14:21:52 -0000 Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63) by server-2.tower-31.messagelabs.com with RC4-SHA encrypted SMTP; 11 Aug 2017 14:21:52 -0000 X-IronPort-AV: E=Sophos;i="5.41,358,1498521600"; d="scan'208";a="443478704" From: Paul Durrant To: Date: Fri, 11 Aug 2017 15:21:32 +0100 Message-ID: <20170811142143.35787-2-paul.durrant@citrix.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170811142143.35787-1-paul.durrant@citrix.com> References: <20170811142143.35787-1-paul.durrant@citrix.com> MIME-Version: 1.0 Cc: Andrew Cooper , Julien Grall , Paul Durrant , Stefano Stabellini , Jan Beulich Subject: [Xen-devel] [PATCH v2 01/12] [x86|arm]: remove code duplication 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 There is a substantial amount of code duplicated between the x86 and arm implementations of mm.c:xenmem_add_to_physmap_one() for XENMAPSPACE_grant_table. Also, the code in question looks like it really should be in common/grant_table.c This patch introduces a new function in common/grant_table.c to get the mfn of a specified frame in the grant table of a specified guest, and calls to that from the arch-specific code in mm.c. Signed-off-by: Paul Durrant --- Cc: Stefano Stabellini Cc: Julien Grall Cc: Jan Beulich Cc: Andrew Cooper --- xen/arch/arm/mm.c | 29 ++++------------------------- xen/arch/x86/mm.c | 26 +++----------------------- xen/common/grant_table.c | 33 +++++++++++++++++++++++++++++++++ xen/include/xen/grant_table.h | 3 +++ 4 files changed, 43 insertions(+), 48 deletions(-) diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index a810a056d7..5ae9607821 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -1229,32 +1229,11 @@ int xenmem_add_to_physmap_one( switch ( space ) { case XENMAPSPACE_grant_table: - grant_write_lock(d->grant_table); - - if ( d->grant_table->gt_version == 0 ) - d->grant_table->gt_version = 1; - - if ( d->grant_table->gt_version == 2 && - (idx & XENMAPIDX_grant_table_status) ) - { - idx &= ~XENMAPIDX_grant_table_status; - if ( idx < nr_status_frames(d->grant_table) ) - mfn = virt_to_mfn(d->grant_table->status[idx]); - else - return -EINVAL; - } - else - { - if ( (idx >= nr_grant_frames(d->grant_table)) && - (idx < max_grant_frames) ) - gnttab_grow_table(d, idx + 1); - - if ( idx < nr_grant_frames(d->grant_table) ) - mfn = virt_to_mfn(d->grant_table->shared_raw[idx]); - else - return -EINVAL; - } + mfn = gnttab_get_frame(d, idx); + if ( mfn_eq(mfn, INVALID_MFN) ) + return -EINVAL; + grant_write_lock(d->grant_table); d->arch.grant_table_gfn[idx] = gfn; t = p2m_ram_rw; diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 97b3b4ba2c..e44b298df1 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -4622,29 +4622,9 @@ int xenmem_add_to_physmap_one( mfn = virt_to_mfn(d->shared_info); break; case XENMAPSPACE_grant_table: - grant_write_lock(d->grant_table); - - if ( d->grant_table->gt_version == 0 ) - d->grant_table->gt_version = 1; - - if ( d->grant_table->gt_version == 2 && - (idx & XENMAPIDX_grant_table_status) ) - { - idx &= ~XENMAPIDX_grant_table_status; - if ( idx < nr_status_frames(d->grant_table) ) - mfn = virt_to_mfn(d->grant_table->status[idx]); - } - else - { - if ( (idx >= nr_grant_frames(d->grant_table)) && - (idx < max_grant_frames) ) - gnttab_grow_table(d, idx + 1); - - if ( idx < nr_grant_frames(d->grant_table) ) - mfn = virt_to_mfn(d->grant_table->shared_raw[idx]); - } - - grant_write_unlock(d->grant_table); + mfn = mfn_x(gnttab_get_frame(d, idx)); + if ( mfn_eq(_mfn(mfn), INVALID_MFN) ) + return -EINVAL; break; case XENMAPSPACE_gmfn_range: case XENMAPSPACE_gmfn: diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index ae34547005..1411519126 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -1604,6 +1604,39 @@ active_alloc_failed: return 0; } +mfn_t +gnttab_get_frame(struct domain *d, unsigned int idx) +{ + struct grant_table *gt = d->grant_table; + mfn_t mfn = INVALID_MFN; + + grant_write_lock(gt); + + if ( gt->gt_version == 0 ) + gt->gt_version = 1; + + if ( gt->gt_version == 2 && + (idx & XENMAPIDX_grant_table_status) ) + { + idx &= ~XENMAPIDX_grant_table_status; + if ( idx < nr_status_frames(gt) ) + mfn = _mfn(virt_to_mfn(gt->status[idx])); + } + else + { + if ( (idx >= nr_grant_frames(gt)) && + (idx < max_grant_frames) ) + gnttab_grow_table(d, idx + 1); + + if ( idx < nr_grant_frames(gt) ) + mfn = _mfn(virt_to_mfn(gt->shared_raw[idx])); + } + + grant_write_unlock(gt); + + return mfn; +} + static long gnttab_setup_table( XEN_GUEST_HANDLE_PARAM(gnttab_setup_table_t) uop, unsigned int count) diff --git a/xen/include/xen/grant_table.h b/xen/include/xen/grant_table.h index 4e7789968c..685af7c578 100644 --- a/xen/include/xen/grant_table.h +++ b/xen/include/xen/grant_table.h @@ -128,6 +128,9 @@ gnttab_release_mappings( int gnttab_grow_table(struct domain *d, unsigned int req_nr_frames); +/* Get mfn of grant frame */ +mfn_t gnttab_get_frame(struct domain *d, unsigned int idx); + /* Number of grant table frames. Caller must hold d's grant table lock. */ static inline unsigned int nr_grant_frames(struct grant_table *gt) {