From patchwork Wed Aug 2 09:59:45 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Durrant X-Patchwork-Id: 9876521 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 168A76037D for ; Wed, 2 Aug 2017 10:02:36 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E6ED1287A3 for ; Wed, 2 Aug 2017 10:02:35 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DBE3B287A9; Wed, 2 Aug 2017 10:02:35 +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 60767287A3 for ; Wed, 2 Aug 2017 10:02:35 +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 1dcqRa-0006OZ-R1; Wed, 02 Aug 2017 09:59:58 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dcqRZ-0006Nj-24 for xen-devel@lists.xenproject.org; Wed, 02 Aug 2017 09:59:57 +0000 Received: from [193.109.254.147] by server-9.bemta-6.messagelabs.com id 62/63-03406-C92A1895; Wed, 02 Aug 2017 09:59:56 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupjkeJIrShJLcpLzFFi42JxWrohUnf2osZ Ig4frLSy+b5nM5MDocfjDFZYAxijWzLyk/IoE1oyfn7YyFXRrVXzZsoK1gfGVXBcjJ4eEgL/E pKmXmEBsNgEdialPL7F2MXJwiAioSNzea9DFyMXBLHCKUWLWn9tsIDXCAuYS3S/XsYPYLEA1h /dvZgap5xWwkdjQxQIxUl5iV9tFVhCbU8BWYtqZFrASIaCSNx/UQcJCQJ3rp84Cm8grIChxcu YTsFZmAQmJgy9eME9g5J2FJDULSWoBI9MqRvXi1KKy1CJdM72kosz0jJLcxMwcXUMDM73c1OL ixPTUnMSkYr3k/NxNjMCwYQCCHYzzTvgfYpTkYFIS5VXsqY8U4kvKT6nMSCzOiC8qzUktPsQo w8GhJMHbvbAxUkiwKDU9tSItMwcYwDBpCQ4eJRFeXZA0b3FBYm5xZjpE6hSjLserCf+/MQmx5 OXnpUqJ824HKRIAKcoozYMbAYumS4yyUsK8jEBHCfEUpBblZpagyr9iFOdgVBLmtQCZwpOZVw K36RXQEUxAR/ypAzuiJBEhJdXAyHd9xe+kR0uXSv+If1dswZE42fK3m8B3oTv5rxtuG85hOJv n/OW9vfw2N9ebMZV2tVlR3fJntEtz3v5uCbs9kdvzhPDOedyGi2ou9K94eURdUluZfUbybaFj E+Zb5QWsM5zedvp8xfuC89Ihpx7KvJR5dev6pj/OH52f1rF5MKru2nu899GPOUosxRmJhlrMR cWJABk7ntShAgAA X-Env-Sender: prvs=380900d51=Paul.Durrant@citrix.com X-Msg-Ref: server-10.tower-27.messagelabs.com!1501667993!86779764!2 X-Originating-IP: [66.165.176.89] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 9.4.25; banners=-,-,- X-VirusChecked: Checked Received: (qmail 22512 invoked from network); 2 Aug 2017 09:59:55 -0000 Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89) by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP; 2 Aug 2017 09:59:55 -0000 X-IronPort-AV: E=Sophos;i="5.41,310,1498521600"; d="scan'208";a="434025327" From: Paul Durrant To: Date: Wed, 2 Aug 2017 10:59:45 +0100 Message-ID: <20170802095949.40677-2-paul.durrant@citrix.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170802095949.40677-1-paul.durrant@citrix.com> References: <20170802095949.40677-1-paul.durrant@citrix.com> MIME-Version: 1.0 Cc: Andrew Cooper , Julien Grall , Paul Durrant , Stefano Stabellini , Jan Beulich Subject: [Xen-devel] [PATCH 1/5] [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 98260f604c..038b20cd5d 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 19f672d880..f8b3505849 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -4863,29 +4863,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) {