Received: by 2002:a25:c593:0:0:0:0:0 with SMTP id v141csp801891ybe; Thu, 5 Sep 2019 06:14:26 -0700 (PDT) X-Google-Smtp-Source: APXvYqwUabE+Ufgyqoc+O7Cj8aLfU2RjMP0blHHyaL5xcs4SvTU57qZw+zu+xgwCS9qhNZY4FClr X-Received: by 2002:a17:902:a01:: with SMTP id 1mr3149678plo.317.1567689266591; Thu, 05 Sep 2019 06:14:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1567689266; cv=none; d=google.com; s=arc-20160816; b=yZ2v1IJ14gLvkpXd9qYKkgDo4YZJsbKv4lkZCnpFXnqlm8aMByDgLqr7G/Fz5NXnW2 CceuJbvZei1reNPCN+iL+lbCRRq/Kh8bMglBzcvSHxjAWaeTzNPVKuUF5MRv7lxsXPkg BBAZo573t4nC1LKDPHCrslCQQ22R1oD1TJVwCjab8OYZmxWYCB73A5d8jTT227d7i1oE Sd8A0D1ZdVe/iSJSTctIfKjt1Hc1dLmi2l2vXvz/t5BK2BMgLLsCfGpUd6duLELnuNqE Vqz0PEqBRANqt6BJsStBEhuON6nw2UW8XpLVdBhFIts0ISI5M7TeRsT69isIvJRPz8kz h9YQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=1EUMcSIJcoIdNfawPXZnVgY52ahSnbBC8m8PhYzXTXA=; b=di6VuHw3BQ8jM0VeMhk7kcm3iYldSTzQcMYIlmUGhoKVMjei9S/7X90JgHpU3vr3SJ IA96VVKRf6pGXxVyvgnD1WNZPRUapugnBPtOKG8SRSzf/WPpdCLfvrwXclOrFPPnWr6Y xZiL6iK9PJxFAVEBr48GJk2dfhI2TdtEbX/FGunM7kQO1doGTIcROd3syNNEcRYagjaL 0OZdO4TeZAPNoO3ZzDqUxLrAvI88cBucXFG6s/h+WUBhSjdIQVoWeS9mNBHZZ9mmFPAe iSBpGD0sm7baL1oKA3rTCSo3BERG6upQkKzC1pMGu7ujMMygqGv8J2FylotDkREm5KyF UePg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@infradead.org header.s=bombadil.20170209 header.b=YLR+2Mcq; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k23si2026983pfa.261.2019.09.05.06.14.10; Thu, 05 Sep 2019 06:14:26 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@infradead.org header.s=bombadil.20170209 header.b=YLR+2Mcq; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388702AbfIELk7 (ORCPT + 99 others); Thu, 5 Sep 2019 07:40:59 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:51140 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730753AbfIELk5 (ORCPT ); Thu, 5 Sep 2019 07:40:57 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From :Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=1EUMcSIJcoIdNfawPXZnVgY52ahSnbBC8m8PhYzXTXA=; b=YLR+2Mcqormr7CEGgHFd40t7qq eILbjn15A/xbqT635S9uRx5l4Q3RftZMKTxm5ZYRAiPLqR7UaUgxKjqb8lAmtwnxzubgvfikZ+UTq TP7cSaakXWbmuj6a9matgbQzlv6qXZCu5IXEcVetgv2EjGj/k8Yjq8ZlMycTbQaQDJOnEMCZGLYgw Qp1Ry8PZBhmcv1EMTp3B8KlbtocALD87gofJPJAUcZbb1foENin2OVOnkMm9G1Ekc6ev/Ywoh733n Ab41jKpNWntOcRcQooHhMlXWKKxiiVRLT9HmUqxDv/lgX2QSJprjN6DYUY1G/MxRg9kKSaJ/Ij1/I ocEWPWHA==; Received: from [2001:4bb8:18c:1755:a4b2:9562:6bf1:4bb9] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92 #3 (Red Hat Linux)) id 1i5q8C-0004sy-Uh; Thu, 05 Sep 2019 11:40:53 +0000 From: Christoph Hellwig To: Stefano Stabellini , Konrad Rzeszutek Wilk , gross@suse.com, boris.ostrovsky@oracle.com Cc: x86@kernel.org, linux-arm-kernel@lists.infradead.org, xen-devel@lists.xenproject.org, iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH 04/11] xen/arm: simplify dma_cache_maint Date: Thu, 5 Sep 2019 13:34:01 +0200 Message-Id: <20190905113408.3104-5-hch@lst.de> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190905113408.3104-1-hch@lst.de> References: <20190905113408.3104-1-hch@lst.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Calculate the required operation in the caller, and pass it directly instead of recalculating it for each page, and use simple arithmetics to get from the physical address to Xen page size aligned chunks. Signed-off-by: Christoph Hellwig Reviewed-by: Stefano Stabellini --- arch/arm/xen/mm.c | 61 ++++++++++++++++------------------------------- 1 file changed, 21 insertions(+), 40 deletions(-) diff --git a/arch/arm/xen/mm.c b/arch/arm/xen/mm.c index 90574d89d0d4..2fde161733b0 100644 --- a/arch/arm/xen/mm.c +++ b/arch/arm/xen/mm.c @@ -35,64 +35,45 @@ unsigned long xen_get_swiotlb_free_pages(unsigned int order) return __get_free_pages(flags, order); } -enum dma_cache_op { - DMA_UNMAP, - DMA_MAP, -}; static bool hypercall_cflush = false; -/* functions called by SWIOTLB */ - -static void dma_cache_maint(dma_addr_t handle, unsigned long offset, - size_t size, enum dma_data_direction dir, enum dma_cache_op op) +/* buffers in highmem or foreign pages cannot cross page boundaries */ +static void dma_cache_maint(dma_addr_t handle, size_t size, u32 op) { struct gnttab_cache_flush cflush; - unsigned long xen_pfn; - size_t left = size; - xen_pfn = (handle >> XEN_PAGE_SHIFT) + offset / XEN_PAGE_SIZE; - offset %= XEN_PAGE_SIZE; + cflush.a.dev_bus_addr = handle & XEN_PAGE_MASK; + cflush.offset = xen_offset_in_page(handle); + cflush.op = op; do { - size_t len = left; - - /* buffers in highmem or foreign pages cannot cross page - * boundaries */ - if (len + offset > XEN_PAGE_SIZE) - len = XEN_PAGE_SIZE - offset; - - cflush.op = 0; - cflush.a.dev_bus_addr = xen_pfn << XEN_PAGE_SHIFT; - cflush.offset = offset; - cflush.length = len; - - if (op == DMA_UNMAP && dir != DMA_TO_DEVICE) - cflush.op = GNTTAB_CACHE_INVAL; - if (op == DMA_MAP) { - if (dir == DMA_FROM_DEVICE) - cflush.op = GNTTAB_CACHE_INVAL; - else - cflush.op = GNTTAB_CACHE_CLEAN; - } - if (cflush.op) - HYPERVISOR_grant_table_op(GNTTABOP_cache_flush, &cflush, 1); + if (size + cflush.offset > XEN_PAGE_SIZE) + cflush.length = XEN_PAGE_SIZE - cflush.offset; + else + cflush.length = size; + + HYPERVISOR_grant_table_op(GNTTABOP_cache_flush, &cflush, 1); - offset = 0; - xen_pfn++; - left -= len; - } while (left); + cflush.offset = 0; + cflush.a.dev_bus_addr += cflush.length; + size -= cflush.length; + } while (size); } static void __xen_dma_page_dev_to_cpu(struct device *hwdev, dma_addr_t handle, size_t size, enum dma_data_direction dir) { - dma_cache_maint(handle & PAGE_MASK, handle & ~PAGE_MASK, size, dir, DMA_UNMAP); + if (dir != DMA_TO_DEVICE) + dma_cache_maint(handle, size, GNTTAB_CACHE_INVAL); } static void __xen_dma_page_cpu_to_dev(struct device *hwdev, dma_addr_t handle, size_t size, enum dma_data_direction dir) { - dma_cache_maint(handle & PAGE_MASK, handle & ~PAGE_MASK, size, dir, DMA_MAP); + if (dir == DMA_FROM_DEVICE) + dma_cache_maint(handle, size, GNTTAB_CACHE_INVAL); + else + dma_cache_maint(handle, size, GNTTAB_CACHE_CLEAN); } void __xen_dma_map_page(struct device *hwdev, struct page *page, -- 2.20.1