From patchwork Sat Oct 25 13:57:21 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Stabellini X-Patchwork-Id: 39526 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-lb0-f199.google.com (mail-lb0-f199.google.com [209.85.217.199]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id EA7B224026 for ; Sat, 25 Oct 2014 14:01:18 +0000 (UTC) Received: by mail-lb0-f199.google.com with SMTP id w7sf2675747lbi.10 for ; Sat, 25 Oct 2014 07:01:17 -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=fHEPrbL372nNU40PpLT32OgG7rlmis9kHzRoBt7EF0I=; b=i1+lwQuiSwdeyyDOn43lVSF9nNUJc5Tjwx+uiQTJeQcmWNSL9UZatp7+BrphkCRb7i yrE3l8lMRH5jfBA8s4/V+GQNhVMpedqAHcIGw//D76DjsG85n8LQr7ZA7yNaeoUWibcj MztLZEs7Q/jqup8C6E+5z2iR9UGTt01graySIs/avX1nvBviMLXoHORoCrVDZy2Ge+/1 B7WLtiwGrL091CdYdBQ+lAGOlz1QYmFyKk85UmRW7FX71cIlM3uf8O0GRgxyZd34QxtW t/YkkJ7hyW+Yd4uQNFHpd+XQnKn4hhfZcKzCkQ5uX+KqxiGmYK6nM1dn/SspDYnDUP1D iktw== X-Gm-Message-State: ALoCoQnAi+riZjfJrafjmk+4ikTQmlu23a/PHIrZsF9Zk5Gmy5je4sKzjkdHonDQObAh5+Z5lumq X-Received: by 10.194.86.66 with SMTP id n2mr5746wjz.7.1414245677147; Sat, 25 Oct 2014 07:01:17 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.36.38 with SMTP id n6ls500467laj.86.gmail; Sat, 25 Oct 2014 07:01:16 -0700 (PDT) X-Received: by 10.152.198.166 with SMTP id jd6mr9983354lac.81.1414245676949; Sat, 25 Oct 2014 07:01:16 -0700 (PDT) Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com. [209.85.217.181]) by mx.google.com with ESMTPS id ao5si11457764lbc.58.2014.10.25.07.01.16 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 25 Oct 2014 07:01:16 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.181 as permitted sender) client-ip=209.85.217.181; Received: by mail-lb0-f181.google.com with SMTP id l4so3878838lbv.12 for ; Sat, 25 Oct 2014 07:01:16 -0700 (PDT) X-Received: by 10.152.29.8 with SMTP id f8mr11155235lah.56.1414245676497; Sat, 25 Oct 2014 07:01:16 -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.112.84.229 with SMTP id c5csp42413lbz; Sat, 25 Oct 2014 07:01:15 -0700 (PDT) X-Received: by 10.140.31.139 with SMTP id f11mr12433364qgf.30.1414245675075; Sat, 25 Oct 2014 07:01:15 -0700 (PDT) Received: from lists.xen.org (lists.xen.org. [50.57.142.19]) by mx.google.com with ESMTPS id 94si12619701qgf.64.2014.10.25.07.01.14 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Sat, 25 Oct 2014 07:01:15 -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 1Xi1t8-0000Hy-EZ; Sat, 25 Oct 2014 14:00:14 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1Xi1t1-0000CV-7A for xen-devel@lists.xensource.com; Sat, 25 Oct 2014 14:00:07 +0000 Received: from [85.158.137.68] by server-6.bemta-3.messagelabs.com id 14/57-03128-6ECAB445; Sat, 25 Oct 2014 14:00:06 +0000 X-Env-Sender: Stefano.Stabellini@citrix.com X-Msg-Ref: server-4.tower-31.messagelabs.com!1414245602!11481389!5 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.12.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 12965 invoked from network); 25 Oct 2014 14:00:05 -0000 Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89) by server-4.tower-31.messagelabs.com with RC4-SHA encrypted SMTP; 25 Oct 2014 14:00:05 -0000 X-IronPort-AV: E=Sophos;i="5.04,786,1406592000"; d="scan'208";a="184886136" 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; Sat, 25 Oct 2014 10:00:00 -0400 Received: from kaball.uk.xensource.com ([10.80.2.59]) by ukmail1.uk.xensource.com with esmtp (Exim 4.69) (envelope-from ) id 1Xi1sp-0000C6-TP; Sat, 25 Oct 2014 14:59:55 +0100 From: Stefano Stabellini To: Date: Sat, 25 Oct 2014 14:57:21 +0100 Message-ID: <1414245442-4306-6-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: Ian.Campbell@citrix.com, Stefano Stabellini , linux-kernel@vger.kernel.org, david.vrabel@citrix.com, linux-arm-kernel@lists.infradead.org Subject: [Xen-devel] [PATCH v6 6/7] xen/arm/arm64: introduce xen_arch_need_swiotlb 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.217.181 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: Introduce an arch specific function to find out whether a particular dma mapping operation needs to bounce on the swiotlb buffer. On ARM and ARM64, if the page involved is a foreign page and the device is not coherent, we need to bounce because at unmap time we cannot execute any required cache maintenance operations (we don't know how to find the pfn from the mfn). No change of behaviour for x86. Signed-off-by: Stefano Stabellini Acked-by: Ian Campbell --- Changes in v6: - fix ts. Changes in v5: - fix indentation. --- arch/arm/include/asm/xen/page.h | 4 ++++ arch/arm/xen/mm.c | 7 +++++++ arch/x86/include/asm/xen/page.h | 7 +++++++ drivers/xen/swiotlb-xen.c | 5 ++++- 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/arch/arm/include/asm/xen/page.h b/arch/arm/include/asm/xen/page.h index 135c24a..68c739b 100644 --- a/arch/arm/include/asm/xen/page.h +++ b/arch/arm/include/asm/xen/page.h @@ -107,4 +107,8 @@ static inline bool set_phys_to_machine(unsigned long pfn, unsigned long mfn) #define xen_remap(cookie, size) ioremap_cache((cookie), (size)) #define xen_unmap(cookie) iounmap((cookie)) +bool xen_arch_need_swiotlb(struct device *dev, + unsigned long pfn, + unsigned long mfn); + #endif /* _ASM_ARM_XEN_PAGE_H */ diff --git a/arch/arm/xen/mm.c b/arch/arm/xen/mm.c index 8a23a10..5b2c7e3 100644 --- a/arch/arm/xen/mm.c +++ b/arch/arm/xen/mm.c @@ -144,6 +144,13 @@ void xen_dma_sync_single_for_device(struct device *hwdev, __xen_dma_page_cpu_to_dev(hwdev, handle, size, dir); } +bool xen_arch_need_swiotlb(struct device *dev, + unsigned long pfn, + unsigned long mfn) +{ + return ((pfn != mfn) && !is_dma_coherent(dev)); +} + int xen_create_contiguous_region(phys_addr_t pstart, unsigned int order, unsigned int address_bits, dma_addr_t *dma_handle) diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h index c949923..f58ef6c 100644 --- a/arch/x86/include/asm/xen/page.h +++ b/arch/x86/include/asm/xen/page.h @@ -236,4 +236,11 @@ void make_lowmem_page_readwrite(void *vaddr); #define xen_remap(cookie, size) ioremap((cookie), (size)); #define xen_unmap(cookie) iounmap((cookie)) +static inline bool xen_arch_need_swiotlb(struct device *dev, + unsigned long pfn, + unsigned long mfn) +{ + return false; +} + #endif /* _ASM_X86_XEN_PAGE_H */ diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c index ebd8f21..ac5d41b 100644 --- a/drivers/xen/swiotlb-xen.c +++ b/drivers/xen/swiotlb-xen.c @@ -399,7 +399,9 @@ dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page, * buffering it. */ if (dma_capable(dev, dev_addr, size) && - !range_straddles_page_boundary(phys, size) && !swiotlb_force) { + !range_straddles_page_boundary(phys, size) && + !xen_arch_need_swiotlb(dev, PFN_DOWN(phys), PFN_DOWN(dev_addr)) && + !swiotlb_force) { /* we are not interested in the dma_addr returned by * xen_dma_map_page, only in the potential cache flushes executed * by the function. */ @@ -557,6 +559,7 @@ xen_swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl, dma_addr_t dev_addr = xen_phys_to_bus(paddr); if (swiotlb_force || + xen_arch_need_swiotlb(hwdev, PFN_DOWN(paddr), PFN_DOWN(dev_addr)) || !dma_capable(hwdev, dev_addr, sg->length) || range_straddles_page_boundary(paddr, sg->length)) { phys_addr_t map = swiotlb_tbl_map_single(hwdev,