From patchwork Thu Jul 24 13:31:06 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Stabellini X-Patchwork-Id: 34223 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-qa0-f69.google.com (mail-qa0-f69.google.com [209.85.216.69]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 71E0C20C7F for ; Thu, 24 Jul 2014 13:34:19 +0000 (UTC) Received: by mail-qa0-f69.google.com with SMTP id v10sf7668286qac.8 for ; Thu, 24 Jul 2014 06:34:19 -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=c89UjDX4cajM6CPlYUUu5L/fmMKGBzFlTbb30Oi3TMU=; b=LqNQHtEpzosTjB0gjy8XPl5JcnsArdMda0Dmx0sMymeebDjBJMReTcUlAreLACUxuL ue0VAgeN2fIFqkLmH94mVnZN3r5d3Agg2afPnhuHqTQydBNUHSk/Lz+UKUipLrYed93q XJ4/tTQUwzPXagSjq3yGHjQHaA5dNcncnqPxUj9HEwlMGvW69IzZfeCCwKuO2zQD58a0 w9ABo8x0kUxBzVpvkUqnteXjkIlRlouBmJ+TiLjvycbhASL1FAcReEwUifDkSlkHoISA ShDX3Z8RLo5xQqyMkVze8cStuHhHFgugBZv7GzY5nCVoFK6+r0ocUWTfXITBoO/TngEF mtSw== X-Gm-Message-State: ALoCoQkaE/tQMguax1NH57zmqiJUf3KVypKx2a4RUk8rnMliAe2wCmLye4CbHUPVYgWUGQmOTbGP X-Received: by 10.236.161.8 with SMTP id v8mr3842678yhk.0.1406208859258; Thu, 24 Jul 2014 06:34:19 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.50.8.2 with SMTP id n2ls1257666iga.6.gmail; Thu, 24 Jul 2014 06:34:19 -0700 (PDT) X-Received: by 10.66.236.161 with SMTP id uv1mr10366312pac.85.1406208859137; Thu, 24 Jul 2014 06:34:19 -0700 (PDT) Received: from mail-vc0-f175.google.com (mail-vc0-f175.google.com [209.85.220.175]) by mx.google.com with ESMTPS id mx8si4995823vec.34.2014.07.24.06.34.17 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 24 Jul 2014 06:34:17 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.175 as permitted sender) client-ip=209.85.220.175; Received: by mail-vc0-f175.google.com with SMTP id hu12so4875830vcb.34 for ; Thu, 24 Jul 2014 06:34:17 -0700 (PDT) X-Received: by 10.220.118.136 with SMTP id v8mr12292881vcq.50.1406208857102; Thu, 24 Jul 2014 06:34:17 -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 tc5csp365511vcb; Thu, 24 Jul 2014 06:34:16 -0700 (PDT) X-Received: by 10.50.36.106 with SMTP id p10mr39678335igj.9.1406208856514; Thu, 24 Jul 2014 06:34:16 -0700 (PDT) Received: from lists.xen.org (lists.xen.org. [50.57.142.19]) by mx.google.com with ESMTPS id lb5si19483670igb.1.2014.07.24.06.34.16 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Thu, 24 Jul 2014 06:34:16 -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 1XAJ85-0002Ji-FO; Thu, 24 Jul 2014 13:32:17 +0000 Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1XAJ84-0002JM-6Z for xen-devel@lists.xensource.com; Thu, 24 Jul 2014 13:32:16 +0000 Received: from [193.109.254.147:34081] by server-9.bemta-14.messagelabs.com id 90/30-31535-FDA01D35; Thu, 24 Jul 2014 13:32:15 +0000 X-Env-Sender: Stefano.Stabellini@citrix.com X-Msg-Ref: server-15.tower-27.messagelabs.com!1406208733!19403643!2 X-Originating-IP: [66.165.176.89] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n X-StarScan-Received: X-StarScan-Version: 6.11.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 19418 invoked from network); 24 Jul 2014 13:32:14 -0000 Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89) by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP; 24 Jul 2014 13:32:14 -0000 X-IronPort-AV: E=Sophos;i="5.01,724,1400025600"; d="scan'208";a="155291329" Received: from accessns.citrite.net (HELO FTLPEX01CL03.citrite.net) ([10.9.154.239]) by FTLPIPO01.CITRIX.COM with ESMTP; 24 Jul 2014 13:32:13 +0000 Received: from ukmail1.uk.xensource.com (10.80.16.128) by smtprelay.citrix.com (10.13.107.80) with Microsoft SMTP Server id 14.3.181.6; Thu, 24 Jul 2014 09:32:12 -0400 Received: from kaball.uk.xensource.com ([10.80.2.59]) by ukmail1.uk.xensource.com with esmtp (Exim 4.69) (envelope-from ) id 1XAJ7v-0002G4-0a; Thu, 24 Jul 2014 14:32:07 +0100 From: Stefano Stabellini To: Date: Thu, 24 Jul 2014 14:31:06 +0100 Message-ID: <1406208666-23547-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: MIA1 Cc: julien.grall@citrix.com, Ian.Campbell@citrix.com, Stefano Stabellini Subject: [Xen-devel] [PATCH v3 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.175 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. Introduce gnttab_need_identity_mapping, to check if a domain needs the identity mapping. On x86 it just returns always 0. Signed-off-by: Stefano Stabellini --- 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 | 35 +++++++++++++++++++++++++++-------- xen/common/kernel.c | 3 +++ xen/include/asm-arm/grant_table.h | 3 +++ xen/include/asm-x86/grant_table.h | 2 ++ xen/include/public/features.h | 3 +++ 5 files changed, 38 insertions(+), 8 deletions(-) diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index 464007e..67cbed9 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -727,7 +727,7 @@ __gnttab_map_grant_ref( double_gt_lock(lgt, rgt); - if ( gnttab_need_iommu_mapping(ld) ) + if ( gnttab_need_iommu_mapping(ld) || gnttab_need_identity_mapping(ld) ) { unsigned int wrc, rdc; int err = 0; @@ -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 ( gnttab_need_identity_mapping(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 ( gnttab_need_identity_mapping(ld) ) + err = arch_grant_map_page_identity(ld, frame, 0); + else + err = iommu_map_page(ld, frame, frame, IOMMUF_readable); + } } if ( err ) { @@ -935,15 +945,24 @@ __gnttab_unmap_common( act->pin -= GNTPIN_hstw_inc; } - if ( gnttab_need_iommu_mapping(ld) ) + if ( gnttab_need_iommu_mapping(ld) || gnttab_need_identity_mapping(ld) ) { unsigned int wrc, rdc; 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 ( gnttab_need_identity_mapping(ld) ) + err = arch_grant_unmap_page_identity(ld, op->frame); + else + err = iommu_unmap_page(ld, op->frame); + } else if ( wrc == 0 ) + { + if ( gnttab_need_identity_mapping(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..dacbe38 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -325,6 +326,8 @@ DO(xen_version)(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) break; } #endif + if ( gnttab_need_identity_mapping(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..6f7ccd9 100644 --- a/xen/include/asm-arm/grant_table.h +++ b/xen/include/asm-arm/grant_table.h @@ -36,6 +36,9 @@ static inline int replace_grant_supported(void) #define gnttab_need_iommu_mapping(d) \ (is_domain_direct_mapped(d) && need_iommu(d)) +#define gnttab_need_identity_mapping(d) \ + (is_domain_direct_mapped(d) && !need_iommu(d)) + #endif /* __ASM_GRANT_TABLE_H__ */ /* * Local variables: diff --git a/xen/include/asm-x86/grant_table.h b/xen/include/asm-x86/grant_table.h index 8c9bbcf..56861a7 100644 --- a/xen/include/asm-x86/grant_table.h +++ b/xen/include/asm-x86/grant_table.h @@ -68,6 +68,8 @@ static inline void gnttab_clear_flag(unsigned int nr, uint16_t *st) #define gnttab_need_iommu_mapping(d) \ (!paging_mode_translate(d) && need_iommu(d)) +#define gnttab_need_identity_mapping(d) (0) + static inline int replace_grant_supported(void) { return 1; 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__ */