From patchwork Mon Oct 27 15:09:27 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Stabellini X-Patchwork-Id: 39633 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-wi0-f199.google.com (mail-wi0-f199.google.com [209.85.212.199]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 16D832118A for ; Mon, 27 Oct 2014 15:12:37 +0000 (UTC) Received: by mail-wi0-f199.google.com with SMTP id r20sf2082857wiv.10 for ; Mon, 27 Oct 2014 08:12:36 -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=6Pkj/g02vBXWEJFpK+NjDxgAr5UNMPOvGEfElLt078Y=; b=NG8QdUrNwOU+r8qEoLD28ViqIToo70NtIvLG313IZNIMbFhtpBxcpDSlRBYWUXrhrE WqtQd3N2DbkX8G3fWmZqq8/ggAhpsq3kaQgwj89oLPJozxFZY6N0+5QY1A+P3JZl4IGm cF4w4Z/dt0s0JLlLTx61Psa7FyxHTZm83hg5dqQ5lcU3Qup7Mxwc8Iu5t+ExNTlH4L8j 88620AWwal1IMynt35LSco2WElKyu94UaYcE+Ksz65nmeOx28o0zRFbq55mW2ono9Bc9 GYyCRmzGnIL1x9HVRi6EyHgw7W+FXOTzttzJw8gDso4Kq5QdNCuAxpmTZfmIQnBqA/s2 1LEg== X-Gm-Message-State: ALoCoQkg/lYC3blHh4/P7ExQ+CXR9y8FzEottU5X86hfsyz6/MW7ndqAGrgzdyNf8SxWMFqQqcAz X-Received: by 10.112.247.74 with SMTP id yc10mr627998lbc.8.1414422756244; Mon, 27 Oct 2014 08:12:36 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.153.4.33 with SMTP id cb1ls230249lad.89.gmail; Mon, 27 Oct 2014 08:12:36 -0700 (PDT) X-Received: by 10.152.45.2 with SMTP id i2mr24529120lam.7.1414422756044; Mon, 27 Oct 2014 08:12:36 -0700 (PDT) Received: from mail-la0-f51.google.com (mail-la0-f51.google.com. [209.85.215.51]) by mx.google.com with ESMTPS id ps4si20459756lbb.16.2014.10.27.08.12.36 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 27 Oct 2014 08:12:36 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.51 as permitted sender) client-ip=209.85.215.51; Received: by mail-la0-f51.google.com with SMTP id q1so2867937lam.10 for ; Mon, 27 Oct 2014 08:12:36 -0700 (PDT) X-Received: by 10.112.189.10 with SMTP id ge10mr24165325lbc.23.1414422755954; Mon, 27 Oct 2014 08:12:35 -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 c5csp309714lbz; Mon, 27 Oct 2014 08:12:35 -0700 (PDT) X-Received: by 10.67.30.34 with SMTP id kb2mr24268035pad.97.1414422754213; Mon, 27 Oct 2014 08:12:34 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id cg2si10814150pad.34.2014.10.27.08.12.33 for ; Mon, 27 Oct 2014 08:12:34 -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 S1752861AbaJ0PMN (ORCPT + 26 others); Mon, 27 Oct 2014 11:12:13 -0400 Received: from smtp02.citrix.com ([66.165.176.63]:4108 "EHLO SMTP02.CITRIX.COM" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752198AbaJ0PML (ORCPT ); Mon, 27 Oct 2014 11:12:11 -0400 X-IronPort-AV: E=Sophos;i="5.04,796,1406592000"; d="scan'208";a="186508126" 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; Mon, 27 Oct 2014 11:12:05 -0400 Received: from kaball.uk.xensource.com ([10.80.2.59]) by ukmail1.uk.xensource.com with esmtp (Exim 4.69) (envelope-from ) id 1Xilxg-0006cI-E4; Mon, 27 Oct 2014 15:12:00 +0000 From: Stefano Stabellini To: CC: , , , , , , Stefano Stabellini Subject: [PATCH v7 7/8] xen/arm/arm64: introduce xen_arch_need_swiotlb Date: Mon, 27 Oct 2014 15:09:27 +0000 Message-ID: <1414422568-19103-7-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.51 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 Acked-by: Ian Campbell Reviewed-by: David Vrabel --- 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 ff413a8..28396aa 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_device_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,