From patchwork Wed Jul 6 13:01:13 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 71458 Delivered-To: patch@linaro.org Received: by 10.140.28.4 with SMTP id 4csp854169qgy; Wed, 6 Jul 2016 06:04:14 -0700 (PDT) X-Received: by 10.36.47.141 with SMTP id j135mr12804324itj.82.1467810252921; Wed, 06 Jul 2016 06:04:12 -0700 (PDT) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id a5si3841619itc.23.2016.07.06.06.04.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 06 Jul 2016 06:04:12 -0700 (PDT) Received-SPF: neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) client-ip=192.237.175.120; Authentication-Results: mx.google.com; spf=neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) smtp.mailfrom=xen-devel-bounces@lists.xen.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bKmSU-0000N5-S1; Wed, 06 Jul 2016 13:01:42 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bKmST-0000Jr-9H for xen-devel@lists.xen.org; Wed, 06 Jul 2016 13:01:41 +0000 Received: from [85.158.137.68] by server-6.bemta-3.messagelabs.com id C2/14-24961-4310D775; Wed, 06 Jul 2016 13:01:40 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrKLMWRWlGSWpSXmKPExsVysyfVTdeYsTb coPu1qcWSj4tZHBg9ju7+zRTAGMWamZeUX5HAmnH5sm3BIYuKG1MuMjcwnlbpYuTiEBLYxChx 4NNPVgjnNKPE+jOtTF2MnBxsApoSdz5/ArNFBKQlrn2+zAhiMws4SLz5eI8FxBYWSJJ43b+SH cRmEVCVuHZxJjOIzSvgKrFq3Rw2EFtCQE7i5LHJrCA2J1B8+rXHYPVCAi4S2xdPYp7AyL2AkW EVo3pxalFZapGuqV5SUWZ6RkluYmaOrqGBsV5uanFxYnpqTmJSsV5yfu4mRqB36xkYGHcwXv7 qdIhRkoNJSZSX5Vt1uBBfUn5KZUZicUZ8UWlOavEhRhkODiUJ3ob/NeFCgkWp6akVaZk5wDCD SUtw8CiJ8D4CSfMWFyTmFmemQ6ROMSpKifN2giQEQBIZpXlwbbDQvsQoKyXMy8jAwCDEU5Bal JtZgir/ilGcg1FJmPfmP6ApPJl5JXDTXwEtZgJa/NOlGmRxSSJCSqqBMcNBjN9GrZSPI67G6R P3kvSy29wtxwUf5y2JZ3vU+9tLNfX4vupCicBdTaxf/DPeCNk+W9jVWntGvPdksvP5abs937c efC66wOGyf9vDJVccozrn6U4yT3b5YOVsqDnRWCJywfodLS3L3+0SXaNj+fuu+dqyzTuWmt/a W3u5ZN6ny0qtxv03lFiKMxINtZiLihMBf75uQ2gCAAA= X-Env-Sender: julien.grall@arm.com X-Msg-Ref: server-12.tower-31.messagelabs.com!1467810093!32456182!6 X-Originating-IP: [217.140.101.70] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 8.46; banners=-,-,- X-VirusChecked: Checked Received: (qmail 9318 invoked from network); 6 Jul 2016 13:01:39 -0000 Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by server-12.tower-31.messagelabs.com with SMTP; 6 Jul 2016 13:01:39 -0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 329E2BBD; Wed, 6 Jul 2016 06:02:38 -0700 (PDT) Received: from e108454-lin.cambridge.arm.com (e108454-lin.cambridge.arm.com [10.1.215.28]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 868333F21A; Wed, 6 Jul 2016 06:01:38 -0700 (PDT) From: Julien Grall To: xen-devel@lists.xen.org Date: Wed, 6 Jul 2016 14:01:13 +0100 Message-Id: <1467810073-27971-15-git-send-email-julien.grall@arm.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1467810073-27971-1-git-send-email-julien.grall@arm.com> References: <1467810073-27971-1-git-send-email-julien.grall@arm.com> Cc: Julien Grall , sstabellini@kernel.org Subject: [Xen-devel] [PATCH v6 14/14] xen/arm: p2m: Rework the interface of apply_p2m_changes and use typesafe 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: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" Most of the callers of apply_p2m_changes have a GFN, a MFN and the number of frame to change in hand. Rather than asking each caller to convert the frame to an address, rework the interfaces to pass the GFN, MFN and the number of frame. Note that it would be possible to do more clean-up in apply_p2m_changes, but this will be done in a follow-up series. Signed-off-by: Julien Grall --- Changes in v4: - Patch added --- xen/arch/arm/p2m.c | 62 ++++++++++++++++++++++++------------------------------ 1 file changed, 28 insertions(+), 34 deletions(-) diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c index c7f6766..ce1c1e0 100644 --- a/xen/arch/arm/p2m.c +++ b/xen/arch/arm/p2m.c @@ -906,25 +906,26 @@ static void update_reference_mapping(struct page_info *page, static int apply_p2m_changes(struct domain *d, enum p2m_operation op, - paddr_t start_gpaddr, - paddr_t end_gpaddr, - paddr_t maddr, + gfn_t sgfn, + unsigned long nr, + mfn_t smfn, int mattr, uint32_t mask, p2m_type_t t, p2m_access_t a) { + paddr_t start_gpaddr = pfn_to_paddr(gfn_x(sgfn)); + paddr_t end_gpaddr = pfn_to_paddr(gfn_x(sgfn) + nr); + paddr_t maddr = pfn_to_paddr(mfn_x(smfn)); int rc, ret; struct p2m_domain *p2m = &d->arch.p2m; lpae_t *mappings[4] = { NULL, NULL, NULL, NULL }; struct page_info *pages[4] = { NULL, NULL, NULL, NULL }; - paddr_t addr, orig_maddr = maddr; + paddr_t addr; unsigned int level = 0; unsigned int cur_root_table = ~0; unsigned int cur_offset[4] = { ~0, ~0, ~0, ~0 }; unsigned int count = 0; - const unsigned long sgfn = paddr_to_pfn(start_gpaddr), - egfn = paddr_to_pfn(end_gpaddr); const unsigned int preempt_count_limit = (op == MEMACCESS) ? 1 : 0x2000; const bool_t preempt = !is_idle_vcpu(current); bool_t flush = false; @@ -986,9 +987,9 @@ static int apply_p2m_changes(struct domain *d, * Preempt setting mem_access permissions as required by XSA-89, * if it's not the last iteration. */ - uint32_t progress = paddr_to_pfn(addr) - sgfn + 1; + uint32_t progress = paddr_to_pfn(addr) - gfn_x(sgfn) + 1; - if ( (egfn - sgfn) > progress && !(progress & mask) ) + if ( nr > progress && !(progress & mask) ) { rc = progress; goto out; @@ -1117,8 +1118,9 @@ static int apply_p2m_changes(struct domain *d, if ( op == INSERT ) { - p2m->max_mapped_gfn = gfn_max(p2m->max_mapped_gfn, _gfn(egfn)); - p2m->lowest_mapped_gfn = gfn_min(p2m->lowest_mapped_gfn, _gfn(sgfn)); + p2m->max_mapped_gfn = gfn_max(p2m->max_mapped_gfn, + gfn_add(sgfn, nr)); + p2m->lowest_mapped_gfn = gfn_min(p2m->lowest_mapped_gfn, sgfn); } rc = 0; @@ -1127,7 +1129,7 @@ out: if ( flush ) { flush_tlb_domain(d); - ret = iommu_iotlb_flush(d, sgfn, egfn - sgfn); + ret = iommu_iotlb_flush(d, gfn_x(sgfn), nr); if ( !rc ) rc = ret; } @@ -1146,12 +1148,14 @@ out: if ( rc < 0 && ( op == INSERT ) && addr != start_gpaddr ) { + unsigned long gfn = paddr_to_pfn(addr); + BUG_ON(addr == end_gpaddr); /* * addr keeps the address of the end of the last successfully-inserted * mapping. */ - apply_p2m_changes(d, REMOVE, start_gpaddr, addr, orig_maddr, + apply_p2m_changes(d, REMOVE, sgfn, gfn - gfn_x(sgfn), smfn, mattr, 0, p2m_invalid, d->arch.p2m.default_access); } @@ -1164,10 +1168,7 @@ static inline int p2m_insert_mapping(struct domain *d, mfn_t mfn, int mattr, p2m_type_t t) { - return apply_p2m_changes(d, INSERT, - pfn_to_paddr(gfn_x(start_gfn)), - pfn_to_paddr(gfn_x(start_gfn) + nr), - pfn_to_paddr(mfn_x(mfn)), + return apply_p2m_changes(d, INSERT, start_gfn, nr, mfn, mattr, 0, t, d->arch.p2m.default_access); } @@ -1176,10 +1177,7 @@ static inline int p2m_remove_mapping(struct domain *d, unsigned long nr, mfn_t mfn) { - return apply_p2m_changes(d, REMOVE, - pfn_to_paddr(gfn_x(start_gfn)), - pfn_to_paddr(gfn_x(start_gfn) + nr), - pfn_to_paddr(mfn_x(mfn)), + return apply_p2m_changes(d, REMOVE, start_gfn, nr, mfn, /* arguments below not used when removing mapping */ MATTR_MEM, 0, p2m_invalid, d->arch.p2m.default_access); @@ -1399,13 +1397,13 @@ err: int relinquish_p2m_mapping(struct domain *d) { struct p2m_domain *p2m = &d->arch.p2m; + unsigned long nr; - return apply_p2m_changes(d, RELINQUISH, - pfn_to_paddr(gfn_x(p2m->lowest_mapped_gfn)), - pfn_to_paddr(gfn_x(p2m->max_mapped_gfn)), - pfn_to_paddr(mfn_x(INVALID_MFN)), - MATTR_MEM, 0, p2m_invalid, - d->arch.p2m.default_access); + nr = gfn_x(p2m->max_mapped_gfn) - gfn_x(p2m->lowest_mapped_gfn); + + return apply_p2m_changes(d, RELINQUISH, p2m->lowest_mapped_gfn, nr, + INVALID_MFN, MATTR_MEM, 0, p2m_invalid, + d->arch.p2m.default_access); } int p2m_cache_flush(struct domain *d, gfn_t start, unsigned long nr) @@ -1416,10 +1414,7 @@ int p2m_cache_flush(struct domain *d, gfn_t start, unsigned long nr) start = gfn_max(start, p2m->lowest_mapped_gfn); end = gfn_min(end, p2m->max_mapped_gfn); - return apply_p2m_changes(d, CACHEFLUSH, - pfn_to_paddr(gfn_x(start)), - pfn_to_paddr(gfn_x(end)), - pfn_to_paddr(mfn_x(INVALID_MFN)), + return apply_p2m_changes(d, CACHEFLUSH, start, nr, INVALID_MFN, MATTR_MEM, 0, p2m_invalid, d->arch.p2m.default_access); } @@ -1828,10 +1823,9 @@ long p2m_set_mem_access(struct domain *d, gfn_t gfn, uint32_t nr, return 0; } - rc = apply_p2m_changes(d, MEMACCESS, - pfn_to_paddr(gfn_x(gfn) + start), - pfn_to_paddr(gfn_x(gfn) + nr), - 0, MATTR_MEM, mask, 0, a); + rc = apply_p2m_changes(d, MEMACCESS, gfn_add(gfn, start), + (nr - start), INVALID_MFN, + MATTR_MEM, mask, 0, a); if ( rc < 0 ) return rc; else if ( rc > 0 )