From patchwork Mon Jul 28 10:16:50 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Stabellini X-Patchwork-Id: 34348 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-pa0-f71.google.com (mail-pa0-f71.google.com [209.85.220.71]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id C4AAB23977 for ; Mon, 28 Jul 2014 10:20:24 +0000 (UTC) Received: by mail-pa0-f71.google.com with SMTP id et14sf51646580pad.2 for ; Mon, 28 Jul 2014 03:20:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:date:message-id:in-reply-to :references:mime-version:cc:subject:precedence:list-id :list-unsubscribe:list-post:list-help:list-subscribe:sender :errors-to:x-original-sender:x-original-authentication-results :mailing-list:list-archive:content-type:content-transfer-encoding; bh=Nr+OZhn9KC75n6qMfhpiamGYmuADML3Ot8uEBnRtY/0=; b=J1QChQOYdphGkt62ddRBHbaObKWIevn4bosCUcWKL2ovm+J7aQzMbVa+/GmGwaucvf SU9kTCMqgCWDojjjFlRI+ZoVlSJb5uwLWLQazSCU6tTo+R++iwENwAsVyM04qv/YkfQL WU2qiVmC6mAguAwSX/ze5lQl31Ar80GlMuKzWbFivxzHZTIIq99BVazJiZFdWz9NrXDF 1f34z0T6Df5uSbBD1XGpB+WkJv+tHuG6j6VeFz24VfF8MZ+YJcZKoX1L8ajI/8WYY3dy 2ki9qyuOZQWpvkPnzhhH44cDPCUOk8iSK8YzsfNEiKqLNFWyt6W/S1c79BJP7JK5/R/l l8vg== X-Gm-Message-State: ALoCoQlhLWDChHrv/NZ+KMkJLdxTHZ8nNq5SpAFr0+vnZ3jYqRS9GNTu6RuhukIz6IfSFTn0Z1qC X-Received: by 10.70.44.230 with SMTP id h6mr16026185pdm.7.1406542824082; Mon, 28 Jul 2014 03:20:24 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.80.36 with SMTP id b33ls2073502qgd.68.gmail; Mon, 28 Jul 2014 03:20:23 -0700 (PDT) X-Received: by 10.52.138.209 with SMTP id qs17mr428524vdb.80.1406542823944; Mon, 28 Jul 2014 03:20:23 -0700 (PDT) Received: from mail-vc0-f178.google.com (mail-vc0-f178.google.com [209.85.220.178]) by mx.google.com with ESMTPS id uq10si11321715veb.46.2014.07.28.03.20.23 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 28 Jul 2014 03:20:23 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.178 as permitted sender) client-ip=209.85.220.178; Received: by mail-vc0-f178.google.com with SMTP id la4so10792058vcb.37 for ; Mon, 28 Jul 2014 03:20:23 -0700 (PDT) X-Received: by 10.53.10.36 with SMTP id dx4mr36810940vdd.0.1406542823841; Mon, 28 Jul 2014 03:20:23 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.221.37.5 with SMTP id tc5csp154897vcb; Mon, 28 Jul 2014 03:20:23 -0700 (PDT) X-Received: by 10.42.64.77 with SMTP id f13mr10037279ici.72.1406542822776; Mon, 28 Jul 2014 03:20:22 -0700 (PDT) Received: from lists.xen.org (lists.xen.org. [50.57.142.19]) by mx.google.com with ESMTPS id c17si39776715ici.87.2014.07.28.03.20.22 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Mon, 28 Jul 2014 03:20:22 -0700 (PDT) Received-SPF: none (google.com: xen-devel-bounces@lists.xen.org does not designate permitted sender hosts) client-ip=50.57.142.19; Received: from localhost ([127.0.0.1] helo=lists.xen.org) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1XBi0j-0001aJ-BM; Mon, 28 Jul 2014 10:18:29 +0000 Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1XBi0h-0001Zm-V5 for xen-devel@lists.xensource.com; Mon, 28 Jul 2014 10:18:28 +0000 Received: from [193.109.254.147:40018] by server-12.bemta-14.messagelabs.com id 9C/89-23840-37326D35; Mon, 28 Jul 2014 10:18:27 +0000 X-Env-Sender: Stefano.Stabellini@citrix.com X-Msg-Ref: server-3.tower-27.messagelabs.com!1406542704!12097195!2 X-Originating-IP: [66.165.176.63] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n X-StarScan-Received: X-StarScan-Version: 6.11.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 30441 invoked from network); 28 Jul 2014 10:18:26 -0000 Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63) by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP; 28 Jul 2014 10:18:26 -0000 X-IronPort-AV: E=Sophos;i="5.01,748,1400025600"; d="scan'208";a="156845676" Received: from accessns.citrite.net (HELO FTLPEX01CL02.citrite.net) ([10.9.154.239]) by FTLPIPO02.CITRIX.COM with ESMTP; 28 Jul 2014 10:18:00 +0000 Received: from ukmail1.uk.xensource.com (10.80.16.128) by smtprelay.citrix.com (10.13.107.79) with Microsoft SMTP Server id 14.3.181.6; Mon, 28 Jul 2014 06:17:59 -0400 Received: from kaball.uk.xensource.com ([10.80.2.59]) by ukmail1.uk.xensource.com with esmtp (Exim 4.69) (envelope-from ) id 1XBi0A-0005Bg-FA; Mon, 28 Jul 2014 11:17:54 +0100 From: Stefano Stabellini To: Date: Mon, 28 Jul 2014 11:16:50 +0100 Message-ID: <1406542610-18724-3-git-send-email-stefano.stabellini@eu.citrix.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: References: MIME-Version: 1.0 X-DLP: MIA2 Cc: julien.grall@citrix.com, Ian.Campbell@citrix.com, Stefano Stabellini Subject: [Xen-devel] [PATCH v4 3/3] xen/arm: introduce XENFEAT_grant_map_identity X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Post: , List-Help: , List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: stefano.stabellini@eu.citrix.com X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.178 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Archive: The flag specifies that the hypervisor maps a grant page to guest physical address == machine address of the page in addition to the normal grant mapping address. Frontends are allowed to map the same page multiple times using multiple grant references. On the backend side it can be difficult to find out the physical address corresponding to a particular machine address, especially at the completation of a dma operation. To simplify address translations, we introduce a second mapping of the grant at physical address == machine address so that dom0 can issue cache maintenance operations without having to find the pfn. Call arch_grant_map_page_identity and arch_grant_unmap_page_identity from __gnttab_map_grant_ref and __gnttab_unmap_common to introduce the second mapping if the domain is directly mapped. To do so we also need to change gnttab_need_iommu_mapping to just be defined as is_domain_direct_mapped on arm. Signed-off-by: Stefano Stabellini --- Changes in v4: - add XENFEAT_grant_map_identity if is_domain_direct_mapped; - remove gnttab_need_identity_mapping, check is_domain_direct_mapped instead; - define gnttab_need_iommu_mapping as is_domain_direct_mapped on arm. Changes in v3: - introduce gnttab_need_identity_mapping; - check gnttab_need_identity_mapping in __gnttab_map_grant_ref and __gnttab_unmap_common. Changes in v2: - rename XENFEAT_grant_map_11 to XENFEAT_grant_map_identity; - remove superfluous ifdef CONFIG_ARM in xen/common/kernel.c; - don't modify gnttab_need_iommu_mapping; - call arch_grant_map_page_identity and arch_grant_unmap_page_identity from grant_table functions. --- xen/common/grant_table.c | 31 +++++++++++++++++++++++++------ xen/common/kernel.c | 2 ++ xen/include/asm-arm/grant_table.h | 3 +-- xen/include/public/features.h | 3 +++ 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index 464007e..68df49d 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -738,13 +738,23 @@ __gnttab_map_grant_ref( !(old_pin & (GNTPIN_hstw_mask|GNTPIN_devw_mask)) ) { if ( wrc == 0 ) - err = iommu_map_page(ld, frame, frame, - IOMMUF_readable|IOMMUF_writable); + { + if ( is_domain_direct_mapped(ld) ) + err = arch_grant_map_page_identity(ld, frame, 1); + else + err = iommu_map_page(ld, frame, frame, + IOMMUF_readable|IOMMUF_writable); + } } else if ( act_pin && !old_pin ) { if ( (wrc + rdc) == 0 ) - err = iommu_map_page(ld, frame, frame, IOMMUF_readable); + { + if ( is_domain_direct_mapped(ld) ) + err = arch_grant_map_page_identity(ld, frame, 0); + else + err = iommu_map_page(ld, frame, frame, IOMMUF_readable); + } } if ( err ) { @@ -941,9 +951,18 @@ __gnttab_unmap_common( int err = 0; mapcount(lgt, rd, op->frame, &wrc, &rdc); if ( (wrc + rdc) == 0 ) - err = iommu_unmap_page(ld, op->frame); - else if ( wrc == 0 ) - err = iommu_map_page(ld, op->frame, op->frame, IOMMUF_readable); + { + if ( is_domain_direct_mapped(ld) ) + err = arch_grant_unmap_page_identity(ld, op->frame); + else + err = iommu_unmap_page(ld, op->frame); + } else if ( wrc == 0 ) + { + if ( is_domain_direct_mapped(ld) ) + err = arch_grant_map_page_identity(ld, op->frame, 0); + else + err = iommu_map_page(ld, op->frame, op->frame, IOMMUF_readable); + } if ( err ) { rc = GNTST_general_error; diff --git a/xen/common/kernel.c b/xen/common/kernel.c index 7e83353..fa40a36 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -325,6 +325,8 @@ DO(xen_version)(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) break; } #endif + if ( is_domain_direct_mapped(d) ) + fi.submap |= 1U << XENFEAT_grant_map_identity; break; default: return -EINVAL; diff --git a/xen/include/asm-arm/grant_table.h b/xen/include/asm-arm/grant_table.h index eac8a70..47147ce 100644 --- a/xen/include/asm-arm/grant_table.h +++ b/xen/include/asm-arm/grant_table.h @@ -33,8 +33,7 @@ static inline int replace_grant_supported(void) ( ((i >= nr_grant_frames(d->grant_table)) && \ (i < max_nr_grant_frames)) ? 0 : (d->arch.grant_table_gpfn[i])) -#define gnttab_need_iommu_mapping(d) \ - (is_domain_direct_mapped(d) && need_iommu(d)) +#define gnttab_need_iommu_mapping(d) (is_domain_direct_mapped(d)) #endif /* __ASM_GRANT_TABLE_H__ */ /* diff --git a/xen/include/public/features.h b/xen/include/public/features.h index a149aa6..ba753a0 100644 --- a/xen/include/public/features.h +++ b/xen/include/public/features.h @@ -94,6 +94,9 @@ /* operation as Dom0 is supported */ #define XENFEAT_dom0 11 +/* Xen also maps grant references at pfn = mfn */ +#define XENFEAT_grant_map_identity 12 + #define XENFEAT_NR_SUBMAPS 1 #endif /* __XEN_PUBLIC_FEATURES_H__ */