From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 16CA5C3A5A3 for ; Tue, 27 Aug 2019 06:38:02 +0000 (UTC) Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CFE1E206BB for ; Tue, 27 Aug 2019 06:38:01 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CFE1E206BB Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=lst.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=iommu-bounces@lists.linux-foundation.org Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 89235FBC; Tue, 27 Aug 2019 06:38:01 +0000 (UTC) Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 16F58FA9 for ; Tue, 27 Aug 2019 06:38:00 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from verein.lst.de (verein.lst.de [213.95.11.211]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id E5F3B1FB for ; Tue, 27 Aug 2019 06:37:57 +0000 (UTC) Received: by verein.lst.de (Postfix, from userid 2407) id 8625768AFE; Tue, 27 Aug 2019 08:37:54 +0200 (CEST) Date: Tue, 27 Aug 2019 08:37:54 +0200 From: Christoph Hellwig To: Stefano Stabellini , Konrad Rzeszutek Wilk Subject: Re: [PATCH 03/11] xen/arm: simplify dma_cache_maint Message-ID: <20190827063754.GA32045@lst.de> References: <20190826121944.515-1-hch@lst.de> <20190826121944.515-4-hch@lst.de> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190826121944.515-4-hch@lst.de> User-Agent: Mutt/1.5.17 (2007-11-01) Cc: xen-devel@lists.xenproject.org, iommu@lists.linux-foundation.org, x86@kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org X-BeenThere: iommu@lists.linux-foundation.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: Development issues for Linux IOMMU support List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: iommu-bounces@lists.linux-foundation.org Errors-To: iommu-bounces@lists.linux-foundation.org And this was still buggy I think, it really needs some real Xen/Arm testing which I can't do. Hopefully better version below: -- >From 5ad4b6e291dbb49f65480c9b769414931cbd485a Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 24 Jul 2019 15:26:08 +0200 Subject: xen/arm: simplify dma_cache_maint 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 --- 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 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A1671C3A5A3 for ; Tue, 27 Aug 2019 06:38:19 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 71172206BB for ; Tue, 27 Aug 2019 06:38:19 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 71172206BB Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=lst.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i2V79-0007Wb-5Z; Tue, 27 Aug 2019 06:37:59 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i2V78-0007WW-AA for xen-devel@lists.xenproject.org; Tue, 27 Aug 2019 06:37:58 +0000 X-Inumbo-ID: 3478e718-c895-11e9-ae2c-12813bfff9fa Received: from verein.lst.de (unknown [213.95.11.211]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 3478e718-c895-11e9-ae2c-12813bfff9fa; Tue, 27 Aug 2019 06:37:57 +0000 (UTC) Received: by verein.lst.de (Postfix, from userid 2407) id 8625768AFE; Tue, 27 Aug 2019 08:37:54 +0200 (CEST) Date: Tue, 27 Aug 2019 08:37:54 +0200 From: Christoph Hellwig To: Stefano Stabellini , Konrad Rzeszutek Wilk Message-ID: <20190827063754.GA32045@lst.de> References: <20190826121944.515-1-hch@lst.de> <20190826121944.515-4-hch@lst.de> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190826121944.515-4-hch@lst.de> User-Agent: Mutt/1.5.17 (2007-11-01) Subject: Re: [Xen-devel] [PATCH 03/11] xen/arm: simplify dma_cache_maint X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: xen-devel@lists.xenproject.org, iommu@lists.linux-foundation.org, x86@kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" QW5kIHRoaXMgd2FzIHN0aWxsIGJ1Z2d5IEkgdGhpbmssIGl0IHJlYWxseSBuZWVkcyBzb21lIHJl YWwgWGVuL0FybQp0ZXN0aW5nIHdoaWNoIEkgY2FuJ3QgZG8uICBIb3BlZnVsbHkgYmV0dGVyIHZl cnNpb24gYmVsb3c6CgotLQpGcm9tIDVhZDRiNmUyOTFkYmI0OWY2NTQ4MGM5Yjc2OTQxNDkzMWNi ZDQ4NWEgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCkZyb206IENocmlzdG9waCBIZWxsd2lnIDxo Y2hAbHN0LmRlPgpEYXRlOiBXZWQsIDI0IEp1bCAyMDE5IDE1OjI2OjA4ICswMjAwClN1YmplY3Q6 IHhlbi9hcm06IHNpbXBsaWZ5IGRtYV9jYWNoZV9tYWludAoKQ2FsY3VsYXRlIHRoZSByZXF1aXJl ZCBvcGVyYXRpb24gaW4gdGhlIGNhbGxlciwgYW5kIHBhc3MgaXQgZGlyZWN0bHkKaW5zdGVhZCBv ZiByZWNhbGN1bGF0aW5nIGl0IGZvciBlYWNoIHBhZ2UsIGFuZCB1c2Ugc2ltcGxlIGFyaXRobWV0 aWNzCnRvIGdldCBmcm9tIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHRvIFhlbiBwYWdlIHNpemUgYWxp Z25lZCBjaHVua3MuCgpTaWduZWQtb2ZmLWJ5OiBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGxzdC5k ZT4KLS0tCiBhcmNoL2FybS94ZW4vbW0uYyB8IDYxICsrKysrKysrKysrKysrKystLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMjEgaW5zZXJ0aW9ucygrKSwg NDAgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0veGVuL21tLmMgYi9hcmNoL2Fy bS94ZW4vbW0uYwppbmRleCA5MDU3NGQ4OWQwZDQuLjJmZGUxNjE3MzNiMCAxMDA2NDQKLS0tIGEv YXJjaC9hcm0veGVuL21tLmMKKysrIGIvYXJjaC9hcm0veGVuL21tLmMKQEAgLTM1LDY0ICszNSw0 NSBAQCB1bnNpZ25lZCBsb25nIHhlbl9nZXRfc3dpb3RsYl9mcmVlX3BhZ2VzKHVuc2lnbmVkIGlu dCBvcmRlcikKIAlyZXR1cm4gX19nZXRfZnJlZV9wYWdlcyhmbGFncywgb3JkZXIpOwogfQogCi1l bnVtIGRtYV9jYWNoZV9vcCB7Ci0gICAgICAgRE1BX1VOTUFQLAotICAgICAgIERNQV9NQVAsCi19 Owogc3RhdGljIGJvb2wgaHlwZXJjYWxsX2NmbHVzaCA9IGZhbHNlOwogCi0vKiBmdW5jdGlvbnMg Y2FsbGVkIGJ5IFNXSU9UTEIgKi8KLQotc3RhdGljIHZvaWQgZG1hX2NhY2hlX21haW50KGRtYV9h ZGRyX3QgaGFuZGxlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKLQlzaXplX3Qgc2l6ZSwgZW51bSBk bWFfZGF0YV9kaXJlY3Rpb24gZGlyLCBlbnVtIGRtYV9jYWNoZV9vcCBvcCkKKy8qIGJ1ZmZlcnMg aW4gaGlnaG1lbSBvciBmb3JlaWduIHBhZ2VzIGNhbm5vdCBjcm9zcyBwYWdlIGJvdW5kYXJpZXMg Ki8KK3N0YXRpYyB2b2lkIGRtYV9jYWNoZV9tYWludChkbWFfYWRkcl90IGhhbmRsZSwgc2l6ZV90 IHNpemUsIHUzMiBvcCkKIHsKIAlzdHJ1Y3QgZ250dGFiX2NhY2hlX2ZsdXNoIGNmbHVzaDsKLQl1 bnNpZ25lZCBsb25nIHhlbl9wZm47Ci0Jc2l6ZV90IGxlZnQgPSBzaXplOwogCi0JeGVuX3BmbiA9 IChoYW5kbGUgPj4gWEVOX1BBR0VfU0hJRlQpICsgb2Zmc2V0IC8gWEVOX1BBR0VfU0laRTsKLQlv ZmZzZXQgJT0gWEVOX1BBR0VfU0laRTsKKwljZmx1c2guYS5kZXZfYnVzX2FkZHIgPSBoYW5kbGUg JiBYRU5fUEFHRV9NQVNLOworCWNmbHVzaC5vZmZzZXQgPSB4ZW5fb2Zmc2V0X2luX3BhZ2UoaGFu ZGxlKTsKKwljZmx1c2gub3AgPSBvcDsKIAogCWRvIHsKLQkJc2l6ZV90IGxlbiA9IGxlZnQ7Ci0J Ci0JCS8qIGJ1ZmZlcnMgaW4gaGlnaG1lbSBvciBmb3JlaWduIHBhZ2VzIGNhbm5vdCBjcm9zcyBw YWdlCi0JCSAqIGJvdW5kYXJpZXMgKi8KLQkJaWYgKGxlbiArIG9mZnNldCA+IFhFTl9QQUdFX1NJ WkUpCi0JCQlsZW4gPSBYRU5fUEFHRV9TSVpFIC0gb2Zmc2V0OwotCi0JCWNmbHVzaC5vcCA9IDA7 Ci0JCWNmbHVzaC5hLmRldl9idXNfYWRkciA9IHhlbl9wZm4gPDwgWEVOX1BBR0VfU0hJRlQ7Ci0J CWNmbHVzaC5vZmZzZXQgPSBvZmZzZXQ7Ci0JCWNmbHVzaC5sZW5ndGggPSBsZW47Ci0KLQkJaWYg KG9wID09IERNQV9VTk1BUCAmJiBkaXIgIT0gRE1BX1RPX0RFVklDRSkKLQkJCWNmbHVzaC5vcCA9 IEdOVFRBQl9DQUNIRV9JTlZBTDsKLQkJaWYgKG9wID09IERNQV9NQVApIHsKLQkJCWlmIChkaXIg PT0gRE1BX0ZST01fREVWSUNFKQotCQkJCWNmbHVzaC5vcCA9IEdOVFRBQl9DQUNIRV9JTlZBTDsK LQkJCWVsc2UKLQkJCQljZmx1c2gub3AgPSBHTlRUQUJfQ0FDSEVfQ0xFQU47Ci0JCX0KLQkJaWYg KGNmbHVzaC5vcCkKLQkJCUhZUEVSVklTT1JfZ3JhbnRfdGFibGVfb3AoR05UVEFCT1BfY2FjaGVf Zmx1c2gsICZjZmx1c2gsIDEpOworCQlpZiAoc2l6ZSArIGNmbHVzaC5vZmZzZXQgPiBYRU5fUEFH RV9TSVpFKQorCQkJY2ZsdXNoLmxlbmd0aCA9IFhFTl9QQUdFX1NJWkUgLSBjZmx1c2gub2Zmc2V0 OworCQllbHNlCisJCQljZmx1c2gubGVuZ3RoID0gc2l6ZTsKKworCQlIWVBFUlZJU09SX2dyYW50 X3RhYmxlX29wKEdOVFRBQk9QX2NhY2hlX2ZsdXNoLCAmY2ZsdXNoLCAxKTsKIAotCQlvZmZzZXQg PSAwOwotCQl4ZW5fcGZuKys7Ci0JCWxlZnQgLT0gbGVuOwotCX0gd2hpbGUgKGxlZnQpOworCQlj Zmx1c2gub2Zmc2V0ID0gMDsKKwkJY2ZsdXNoLmEuZGV2X2J1c19hZGRyICs9IGNmbHVzaC5sZW5n dGg7CisJCXNpemUgLT0gY2ZsdXNoLmxlbmd0aDsKKwl9IHdoaWxlIChzaXplKTsKIH0KIAogc3Rh dGljIHZvaWQgX194ZW5fZG1hX3BhZ2VfZGV2X3RvX2NwdShzdHJ1Y3QgZGV2aWNlICpod2Rldiwg ZG1hX2FkZHJfdCBoYW5kbGUsCiAJCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlv biBkaXIpCiB7Ci0JZG1hX2NhY2hlX21haW50KGhhbmRsZSAmIFBBR0VfTUFTSywgaGFuZGxlICYg flBBR0VfTUFTSywgc2l6ZSwgZGlyLCBETUFfVU5NQVApOworCWlmIChkaXIgIT0gRE1BX1RPX0RF VklDRSkKKwkJZG1hX2NhY2hlX21haW50KGhhbmRsZSwgc2l6ZSwgR05UVEFCX0NBQ0hFX0lOVkFM KTsKIH0KIAogc3RhdGljIHZvaWQgX194ZW5fZG1hX3BhZ2VfY3B1X3RvX2RldihzdHJ1Y3QgZGV2 aWNlICpod2RldiwgZG1hX2FkZHJfdCBoYW5kbGUsCiAJCXNpemVfdCBzaXplLCBlbnVtIGRtYV9k YXRhX2RpcmVjdGlvbiBkaXIpCiB7Ci0JZG1hX2NhY2hlX21haW50KGhhbmRsZSAmIFBBR0VfTUFT SywgaGFuZGxlICYgflBBR0VfTUFTSywgc2l6ZSwgZGlyLCBETUFfTUFQKTsKKwlpZiAoZGlyID09 IERNQV9GUk9NX0RFVklDRSkKKwkJZG1hX2NhY2hlX21haW50KGhhbmRsZSwgc2l6ZSwgR05UVEFC X0NBQ0hFX0lOVkFMKTsKKwllbHNlCisJCWRtYV9jYWNoZV9tYWludChoYW5kbGUsIHNpemUsIEdO VFRBQl9DQUNIRV9DTEVBTik7CiB9CiAKIHZvaWQgX194ZW5fZG1hX21hcF9wYWdlKHN0cnVjdCBk ZXZpY2UgKmh3ZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLS0gCjIuMjAuMQoKCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxp c3QKWGVuLWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHBzOi8vbGlzdHMueGVucHJvamVj dC5vcmcvbWFpbG1hbi9saXN0aW5mby94ZW4tZGV2ZWw= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5356BC3A5A3 for ; Tue, 27 Aug 2019 06:38:06 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 24CB82064A for ; Tue, 27 Aug 2019 06:38:06 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="fBwv0FEh" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 24CB82064A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=lst.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=3XhD1HcCCX1+bSrmdgzuu5gDht6o5nAUeqRnm4sBwQk=; b=fBwv0FEhObnrRb 12x3ZF+ym/W7f59gI1fuv5k/IhwgsDkftYbZmbbelQtlcswhISK0KCdITEBT6047oyOZUJyAurEfo DNr2ZNE3Athdnl1/wXCk8/T9ZqLw7cnqS3amWIEyPw02oEvHPt5/0co0yiCArkDRpEexrjOwltDrt hlXZNQ8y+RNedK6cXU0mZFbcTE3ZYJzsuB2Y4e6ixcCfVhpt4cDtifksQdwUx86PDJ0QY6suWcCXc uxsdwt68Q1y2FiKYSzg7/h92HC5jajFm3wFNL3ZIoUoWy3Tbwe/u5sGdhXmrOnMZt59K17FsX8Pz8 4AbhCJnka4/0ZgCZUvZg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1i2V7A-0005Gq-M1; Tue, 27 Aug 2019 06:38:00 +0000 Received: from verein.lst.de ([213.95.11.211]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1i2V77-0005GP-Ms for linux-arm-kernel@lists.infradead.org; Tue, 27 Aug 2019 06:37:59 +0000 Received: by verein.lst.de (Postfix, from userid 2407) id 8625768AFE; Tue, 27 Aug 2019 08:37:54 +0200 (CEST) Date: Tue, 27 Aug 2019 08:37:54 +0200 From: Christoph Hellwig To: Stefano Stabellini , Konrad Rzeszutek Wilk Subject: Re: [PATCH 03/11] xen/arm: simplify dma_cache_maint Message-ID: <20190827063754.GA32045@lst.de> References: <20190826121944.515-1-hch@lst.de> <20190826121944.515-4-hch@lst.de> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190826121944.515-4-hch@lst.de> User-Agent: Mutt/1.5.17 (2007-11-01) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190826_233758_044813_41942456 X-CRM114-Status: GOOD ( 14.16 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: xen-devel@lists.xenproject.org, iommu@lists.linux-foundation.org, x86@kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org And this was still buggy I think, it really needs some real Xen/Arm testing which I can't do. Hopefully better version below: -- >From 5ad4b6e291dbb49f65480c9b769414931cbd485a Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 24 Jul 2019 15:26:08 +0200 Subject: xen/arm: simplify dma_cache_maint 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 --- 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 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D79C4C3A5A3 for ; Tue, 27 Aug 2019 06:37:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id AE336206BB for ; Tue, 27 Aug 2019 06:37:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727455AbfH0Gh6 (ORCPT ); Tue, 27 Aug 2019 02:37:58 -0400 Received: from verein.lst.de ([213.95.11.211]:53995 "EHLO verein.lst.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725811AbfH0Gh6 (ORCPT ); Tue, 27 Aug 2019 02:37:58 -0400 Received: by verein.lst.de (Postfix, from userid 2407) id 8625768AFE; Tue, 27 Aug 2019 08:37:54 +0200 (CEST) Date: Tue, 27 Aug 2019 08:37:54 +0200 From: Christoph Hellwig To: Stefano Stabellini , Konrad Rzeszutek Wilk Cc: xen-devel@lists.xenproject.org, iommu@lists.linux-foundation.org, x86@kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH 03/11] xen/arm: simplify dma_cache_maint Message-ID: <20190827063754.GA32045@lst.de> References: <20190826121944.515-1-hch@lst.de> <20190826121944.515-4-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190826121944.515-4-hch@lst.de> User-Agent: Mutt/1.5.17 (2007-11-01) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org And this was still buggy I think, it really needs some real Xen/Arm testing which I can't do. Hopefully better version below: -- >From 5ad4b6e291dbb49f65480c9b769414931cbd485a Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 24 Jul 2019 15:26:08 +0200 Subject: xen/arm: simplify dma_cache_maint 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 --- 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