From patchwork Fri Oct 10 11:51:47 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Stabellini X-Patchwork-Id: 38561 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-lb0-f198.google.com (mail-lb0-f198.google.com [209.85.217.198]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 1A19120D3D for ; Fri, 10 Oct 2014 11:54:45 +0000 (UTC) Received: by mail-lb0-f198.google.com with SMTP id 10sf2022524lbg.9 for ; Fri, 10 Oct 2014 04:54:44 -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:cc:subject:date:message-id :in-reply-to:references:mime-version:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe:content-type; bh=mAjPM7i9tjLdflkPoirQrY7nZErbir+0VbTLDDjFD9E=; b=dR49ctEuYjwwmQRdM+NCCK+bBvD5+c1odaMxsPj/gVW3k8Ll9eipwubaM0RI4B1ksj Lh16nnMoxkSpk5QESnuu1kJHxW2s50YwYYoiWYtHxNgUFgrGBsS1tBwjJYH1rYI9t/R7 WntCpiywHm76HA4pSy+3FSNGeG7j8ny/cfhrUkl7R2m9WPh8t821Nv0DXSMMrhLhWIaz hVnckN+Eh3y4vC1kvPZAMu/oK7Fso53eBhM1/B3gJnieblAw5VLigLfEu/eHYo3Zbtuo c52Ss81qoO8l6vmFqTuDfR+2iZ+cMwjOrKmquqAr3pIAZMLsoft8a2wd/BbjYAlo2nuD Ef7A== X-Gm-Message-State: ALoCoQk0024M3qa4VoMsFfenPBTlFRUf4Hz3HBl6S3qAoiYToFfYQyVREvR5DfGyPaSDAMMLy20m X-Received: by 10.181.28.169 with SMTP id jp9mr957420wid.6.1412942084680; Fri, 10 Oct 2014 04:54:44 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.4.7 with SMTP id g7ls271722lag.43.gmail; Fri, 10 Oct 2014 04:54:44 -0700 (PDT) X-Received: by 10.112.158.227 with SMTP id wx3mr4167027lbb.1.1412942084457; Fri, 10 Oct 2014 04:54:44 -0700 (PDT) Received: from mail-la0-f41.google.com (mail-la0-f41.google.com [209.85.215.41]) by mx.google.com with ESMTPS id ir4si8768325lac.116.2014.10.10.04.54.43 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 10 Oct 2014 04:54:43 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.41 as permitted sender) client-ip=209.85.215.41; Received: by mail-la0-f41.google.com with SMTP id pn19so3114324lab.28 for ; Fri, 10 Oct 2014 04:54:43 -0700 (PDT) X-Received: by 10.152.22.42 with SMTP id a10mr4397163laf.56.1412942083504; Fri, 10 Oct 2014 04:54:43 -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 c5csp412776lbz; Fri, 10 Oct 2014 04:54:42 -0700 (PDT) X-Received: by 10.67.15.205 with SMTP id fq13mr934160pad.59.1412942081801; Fri, 10 Oct 2014 04:54:41 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id sl5si3407727pbc.164.2014.10.10.04.54.41 for ; Fri, 10 Oct 2014 04:54:41 -0700 (PDT) Received-SPF: none (google.com: linux-kernel-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753733AbaJJLyT (ORCPT + 27 others); Fri, 10 Oct 2014 07:54:19 -0400 Received: from smtp.citrix.com ([66.165.176.89]:22994 "EHLO SMTP.CITRIX.COM" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753074AbaJJLyO (ORCPT ); Fri, 10 Oct 2014 07:54:14 -0400 X-IronPort-AV: E=Sophos;i="5.04,691,1406592000"; d="scan'208";a="180114190" Received: from ukmail1.uk.xensource.com (10.80.16.128) by smtprelay.citrix.com (10.13.107.78) with Microsoft SMTP Server id 14.3.181.6; Fri, 10 Oct 2014 07:54:09 -0400 Received: from kaball.uk.xensource.com ([10.80.2.59]) by ukmail1.uk.xensource.com with esmtp (Exim 4.69) (envelope-from ) id 1XcYln-0008ML-VS; Fri, 10 Oct 2014 12:54:04 +0100 From: Stefano Stabellini To: CC: , , , , , , Stefano Stabellini Subject: [PATCH v4 6/7] xen/arm/arm64: introduce xen_arch_need_swiotlb Date: Fri, 10 Oct 2014 12:51:47 +0100 Message-ID: <1412941908-5850-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: MIA1 Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@vger.kernel.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.215.41 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-Post: , List-Help: , List-Archive: List-Unsubscribe: , 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 --- 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..fb7839d 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 9d460e0..0c2a75a 100644 --- a/arch/arm/xen/mm.c +++ b/arch/arm/xen/mm.c @@ -139,6 +139,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..0a45242 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..ac0bd60 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,