* fix default dma_mmap_* pgprot v2 @ 2019-08-05 8:01 Christoph Hellwig 2019-08-05 8:01 ` [PATCH 1/2] dma-mapping: fix page attributes for dma_mmap_* Christoph Hellwig 2019-08-05 8:01 ` [PATCH 2/2] MIPS: remove support for DMA_ATTR_WRITE_COMBINE Christoph Hellwig 0 siblings, 2 replies; 10+ messages in thread From: Christoph Hellwig @ 2019-08-05 8:01 UTC (permalink / raw) To: iommu Cc: Shawn Anastasio, Will Deacon, Michael Ellerman, linuxppc-dev, linux-kernel, Russell King, linux-mips, Paul Burton, Catalin Marinas, James Hogan, Robin Murphy, linux-arm-kernel Hi all, As Shawn pointed out we've had issues with the dma mmap pgprots ever since the dma_common_mmap helper was added beyong the initial architectures - we default to uncached mappings, but for devices that are DMA coherent, or if the DMA_ATTR_NON_CONSISTENT is set (and supported) this can lead to aliasing of cache attributes. This patch fixes that. My explanation of why this hasn't been much of an issue is that the dma_mmap_ helpers aren't used widely and mostly just in architecture specific drivers. Changes since v1: - fix handling of DMA_ATTR_NON_CONSISTENT where it is a no-op (which is most architectures) - remove DMA_ATTR_WRITE_COMBINE on mips, as it seem dangerous as-is _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/2] dma-mapping: fix page attributes for dma_mmap_* 2019-08-05 8:01 fix default dma_mmap_* pgprot v2 Christoph Hellwig @ 2019-08-05 8:01 ` Christoph Hellwig 2019-08-05 9:10 ` Catalin Marinas 2019-08-06 19:39 ` Shawn Anastasio via iommu 2019-08-05 8:01 ` [PATCH 2/2] MIPS: remove support for DMA_ATTR_WRITE_COMBINE Christoph Hellwig 1 sibling, 2 replies; 10+ messages in thread From: Christoph Hellwig @ 2019-08-05 8:01 UTC (permalink / raw) To: iommu Cc: Gavin Li, Shawn Anastasio, Will Deacon, Michael Ellerman, linuxppc-dev, linux-kernel, Russell King, linux-mips, Paul Burton, Catalin Marinas, James Hogan, Robin Murphy, linux-arm-kernel All the way back to introducing dma_common_mmap we've defaulyed to mark the pages as uncached. But this is wrong for DMA coherent devices. Later on DMA_ATTR_WRITE_COMBINE also got incorrect treatment as that flag is only treated special on the alloc side for non-coherent devices. Introduce a new dma_pgprot helper that deals with the check for coherent devices so that only the remapping cases even reach arch_dma_mmap_pgprot and we thus ensure no aliasing of page attributes happens, which makes the powerpc version of arch_dma_mmap_pgprot obsolete and simplifies the remaining ones. Note that this means arch_dma_mmap_pgprot is a bit misnamed now, but we'll phase it out soon. Fixes: 64ccc9c033c6 ("common: dma-mapping: add support for generic dma_mmap_* calls") Reported-by: Shawn Anastasio <shawn@anastas.io> Reported-by: Gavin Li <git@thegavinli.com> Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/arm/mm/dma-mapping.c | 4 +--- arch/arm64/mm/dma-mapping.c | 4 +--- arch/powerpc/Kconfig | 1 - arch/powerpc/kernel/dma-common.c | 17 ----------------- drivers/iommu/dma-iommu.c | 6 +++--- include/linux/dma-mapping.h | 1 + include/linux/dma-noncoherent.h | 5 ----- kernel/dma/mapping.c | 17 ++++++++++++++++- kernel/dma/remap.c | 2 +- 9 files changed, 23 insertions(+), 34 deletions(-) delete mode 100644 arch/powerpc/kernel/dma-common.c diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 6774b03aa405..d42557ee69c2 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -2405,9 +2405,7 @@ long arch_dma_coherent_to_pfn(struct device *dev, void *cpu_addr, pgprot_t arch_dma_mmap_pgprot(struct device *dev, pgprot_t prot, unsigned long attrs) { - if (!dev_is_dma_coherent(dev)) - return __get_dma_pgprot(attrs, prot); - return prot; + return __get_dma_pgprot(attrs, prot); } void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c index 1d3f0b5a9940..bd2b039f43a6 100644 --- a/arch/arm64/mm/dma-mapping.c +++ b/arch/arm64/mm/dma-mapping.c @@ -14,9 +14,7 @@ pgprot_t arch_dma_mmap_pgprot(struct device *dev, pgprot_t prot, unsigned long attrs) { - if (!dev_is_dma_coherent(dev) || (attrs & DMA_ATTR_WRITE_COMBINE)) - return pgprot_writecombine(prot); - return prot; + return pgprot_writecombine(prot); } void arch_sync_dma_for_device(struct device *dev, phys_addr_t paddr, diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 77f6ebf97113..d8dcd8820369 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -121,7 +121,6 @@ config PPC select ARCH_32BIT_OFF_T if PPC32 select ARCH_HAS_DEBUG_VIRTUAL select ARCH_HAS_DEVMEM_IS_ALLOWED - select ARCH_HAS_DMA_MMAP_PGPROT select ARCH_HAS_ELF_RANDOMIZE select ARCH_HAS_FORTIFY_SOURCE select ARCH_HAS_GCOV_PROFILE_ALL diff --git a/arch/powerpc/kernel/dma-common.c b/arch/powerpc/kernel/dma-common.c deleted file mode 100644 index dc7ef6b17b69..000000000000 --- a/arch/powerpc/kernel/dma-common.c +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * Contains common dma routines for all powerpc platforms. - * - * Copyright (C) 2019 Shawn Anastasio. - */ - -#include <linux/mm.h> -#include <linux/dma-noncoherent.h> - -pgprot_t arch_dma_mmap_pgprot(struct device *dev, pgprot_t prot, - unsigned long attrs) -{ - if (!dev_is_dma_coherent(dev)) - return pgprot_noncached(prot); - return prot; -} diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index a7f9c3edbcb2..0015fe610b23 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -574,7 +574,7 @@ static void *iommu_dma_alloc_remap(struct device *dev, size_t size, struct iova_domain *iovad = &cookie->iovad; bool coherent = dev_is_dma_coherent(dev); int ioprot = dma_info_to_prot(DMA_BIDIRECTIONAL, coherent, attrs); - pgprot_t prot = arch_dma_mmap_pgprot(dev, PAGE_KERNEL, attrs); + pgprot_t prot = dma_pgprot(dev, PAGE_KERNEL, attrs); unsigned int count, min_size, alloc_sizes = domain->pgsize_bitmap; struct page **pages; struct sg_table sgt; @@ -975,7 +975,7 @@ static void *iommu_dma_alloc_pages(struct device *dev, size_t size, return NULL; if (IS_ENABLED(CONFIG_DMA_REMAP) && (!coherent || PageHighMem(page))) { - pgprot_t prot = arch_dma_mmap_pgprot(dev, PAGE_KERNEL, attrs); + pgprot_t prot = dma_pgprot(dev, PAGE_KERNEL, attrs); cpu_addr = dma_common_contiguous_remap(page, alloc_size, VM_USERMAP, prot, __builtin_return_address(0)); @@ -1035,7 +1035,7 @@ static int iommu_dma_mmap(struct device *dev, struct vm_area_struct *vma, unsigned long pfn, off = vma->vm_pgoff; int ret; - vma->vm_page_prot = arch_dma_mmap_pgprot(dev, vma->vm_page_prot, attrs); + vma->vm_page_prot = dma_pgprot(dev, vma->vm_page_prot, attrs); if (dma_mmap_from_dev_coherent(dev, vma, cpu_addr, size, &ret)) return ret; diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index f7d1eea32c78..3dda399ec9ce 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h @@ -611,6 +611,7 @@ static inline void dma_sync_single_range_for_device(struct device *dev, #define dma_get_sgtable(d, t, v, h, s) dma_get_sgtable_attrs(d, t, v, h, s, 0) #define dma_mmap_coherent(d, v, c, h, s) dma_mmap_attrs(d, v, c, h, s, 0) +pgprot_t dma_pgprot(struct device *dev, pgprot_t prot, unsigned long attrs); extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, dma_addr_t dma_addr, size_t size, unsigned long attrs); diff --git a/include/linux/dma-noncoherent.h b/include/linux/dma-noncoherent.h index 3813211a9aad..9ae5cee543c4 100644 --- a/include/linux/dma-noncoherent.h +++ b/include/linux/dma-noncoherent.h @@ -42,13 +42,8 @@ void arch_dma_free(struct device *dev, size_t size, void *cpu_addr, dma_addr_t dma_addr, unsigned long attrs); long arch_dma_coherent_to_pfn(struct device *dev, void *cpu_addr, dma_addr_t dma_addr); - -#ifdef CONFIG_ARCH_HAS_DMA_MMAP_PGPROT pgprot_t arch_dma_mmap_pgprot(struct device *dev, pgprot_t prot, unsigned long attrs); -#else -# define arch_dma_mmap_pgprot(dev, prot, attrs) pgprot_noncached(prot) -#endif #ifdef CONFIG_DMA_NONCOHERENT_CACHE_SYNC void arch_dma_cache_sync(struct device *dev, void *vaddr, size_t size, diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index b945239621d8..51d9657e0a8f 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -150,6 +150,21 @@ int dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, } EXPORT_SYMBOL(dma_get_sgtable_attrs); +/* + * Return the page attributes used for mapping dma_alloc_* memory, either in + * kernel space if remapping is needed, or to userspace through dma_mmap_*. + */ +pgprot_t dma_pgprot(struct device *dev, pgprot_t prot, unsigned long attrs) +{ + if (dev_is_dma_coherent(dev) || + (IS_ENABLED(CONFIG_DMA_NONCOHERENT_CACHE_SYNC) && + (attrs & DMA_ATTR_NON_CONSISTENT))) + return prot; + if (IS_ENABLED(CONFIG_ARCH_HAS_DMA_MMAP_PGPROT)) + return arch_dma_mmap_pgprot(dev, prot, attrs); + return pgprot_noncached(prot); +} + /* * Create userspace mapping for the DMA-coherent memory. */ @@ -164,7 +179,7 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, unsigned long pfn; int ret = -ENXIO; - vma->vm_page_prot = arch_dma_mmap_pgprot(dev, vma->vm_page_prot, attrs); + vma->vm_page_prot = dma_pgprot(dev, vma->vm_page_prot, attrs); if (dma_mmap_from_dev_coherent(dev, vma, cpu_addr, size, &ret)) return ret; diff --git a/kernel/dma/remap.c b/kernel/dma/remap.c index a594aec07882..ffe78f0b2fe4 100644 --- a/kernel/dma/remap.c +++ b/kernel/dma/remap.c @@ -218,7 +218,7 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, /* create a coherent mapping */ ret = dma_common_contiguous_remap(page, size, VM_USERMAP, - arch_dma_mmap_pgprot(dev, PAGE_KERNEL, attrs), + dma_pgprot(dev, PAGE_KERNEL, attrs), __builtin_return_address(0)); if (!ret) { __dma_direct_free_pages(dev, size, page); -- 2.20.1 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] dma-mapping: fix page attributes for dma_mmap_* 2019-08-05 8:01 ` [PATCH 1/2] dma-mapping: fix page attributes for dma_mmap_* Christoph Hellwig @ 2019-08-05 9:10 ` Catalin Marinas 2019-08-06 19:39 ` Shawn Anastasio via iommu 1 sibling, 0 replies; 10+ messages in thread From: Catalin Marinas @ 2019-08-05 9:10 UTC (permalink / raw) To: Christoph Hellwig Cc: Gavin Li, Shawn Anastasio, Michael Ellerman, linuxppc-dev, linux-kernel, Russell King, linux-mips, iommu, Paul Burton, James Hogan, Will Deacon, linux-arm-kernel, Robin Murphy On Mon, Aug 05, 2019 at 11:01:44AM +0300, Christoph Hellwig wrote: > All the way back to introducing dma_common_mmap we've defaulyed to mark s/defaultyed/defaulted/ > the pages as uncached. But this is wrong for DMA coherent devices. > Later on DMA_ATTR_WRITE_COMBINE also got incorrect treatment as that > flag is only treated special on the alloc side for non-coherent devices. > > Introduce a new dma_pgprot helper that deals with the check for coherent > devices so that only the remapping cases even reach arch_dma_mmap_pgprot s/even/ever/ > diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c > index 1d3f0b5a9940..bd2b039f43a6 100644 > --- a/arch/arm64/mm/dma-mapping.c > +++ b/arch/arm64/mm/dma-mapping.c > @@ -14,9 +14,7 @@ > pgprot_t arch_dma_mmap_pgprot(struct device *dev, pgprot_t prot, > unsigned long attrs) > { > - if (!dev_is_dma_coherent(dev) || (attrs & DMA_ATTR_WRITE_COMBINE)) > - return pgprot_writecombine(prot); > - return prot; > + return pgprot_writecombine(prot); > } For arm64: Acked-by: Catalin Marinas <catalin.marinas@arm.com> _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] dma-mapping: fix page attributes for dma_mmap_* 2019-08-05 8:01 ` [PATCH 1/2] dma-mapping: fix page attributes for dma_mmap_* Christoph Hellwig 2019-08-05 9:10 ` Catalin Marinas @ 2019-08-06 19:39 ` Shawn Anastasio via iommu 2019-08-07 6:04 ` Christoph Hellwig 1 sibling, 1 reply; 10+ messages in thread From: Shawn Anastasio via iommu @ 2019-08-06 19:39 UTC (permalink / raw) To: Christoph Hellwig, iommu Cc: Gavin Li, linux-kernel, Will Deacon, Michael Ellerman, linuxppc-dev, Russell King, linux-mips, Paul Burton, Catalin Marinas, James Hogan, Robin Murphy, linux-arm-kernel On 8/5/19 10:01 AM, Christoph Hellwig wrote: > diff --git a/include/linux/dma-noncoherent.h b/include/linux/dma-noncoherent.h > index 3813211a9aad..9ae5cee543c4 100644 > --- a/include/linux/dma-noncoherent.h > +++ b/include/linux/dma-noncoherent.h > @@ -42,13 +42,8 @@ void arch_dma_free(struct device *dev, size_t size, void *cpu_addr, > dma_addr_t dma_addr, unsigned long attrs); > long arch_dma_coherent_to_pfn(struct device *dev, void *cpu_addr, > dma_addr_t dma_addr); > - > -#ifdef CONFIG_ARCH_HAS_DMA_MMAP_PGPROT > pgprot_t arch_dma_mmap_pgprot(struct device *dev, pgprot_t prot, > unsigned long attrs); > -#else > -# define arch_dma_mmap_pgprot(dev, prot, attrs) pgprot_noncached(prot) > -#endif Nit, but maybe the prototype should still be ifdef'd here? It at least could prevent a reader from incorrectly thinking that the function is always present. Also, like Will mentioned earlier, the function name isn't entirely accurate anymore. I second the suggestion of using something like arch_dma_noncoherent_pgprot(). As for your idea of defining pgprot_dmacoherent for all architectures as #ifndef pgprot_dmacoherent #define pgprot_dmacoherent pgprot_noncached #endif I think that the name here is kind of misleading too, since this definition will only be used when there is no support for proper DMA coherency. _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] dma-mapping: fix page attributes for dma_mmap_* 2019-08-06 19:39 ` Shawn Anastasio via iommu @ 2019-08-07 6:04 ` Christoph Hellwig 2019-08-07 11:45 ` Shawn Anastasio via iommu 0 siblings, 1 reply; 10+ messages in thread From: Christoph Hellwig @ 2019-08-07 6:04 UTC (permalink / raw) To: Shawn Anastasio Cc: Gavin Li, linux-kernel, Michael Ellerman, linuxppc-dev, Russell King, linux-mips, iommu, Paul Burton, Catalin Marinas, James Hogan, Will Deacon, Christoph Hellwig, linux-arm-kernel, Robin Murphy On Tue, Aug 06, 2019 at 09:39:06PM +0200, Shawn Anastasio wrote: >> -#ifdef CONFIG_ARCH_HAS_DMA_MMAP_PGPROT >> pgprot_t arch_dma_mmap_pgprot(struct device *dev, pgprot_t prot, >> unsigned long attrs); >> -#else >> -# define arch_dma_mmap_pgprot(dev, prot, attrs) pgprot_noncached(prot) >> -#endif > > Nit, but maybe the prototype should still be ifdef'd here? It at least > could prevent a reader from incorrectly thinking that the function is > always present. Actually it is typical modern Linux style to just provide a prototype and then use "if (IS_ENABLED(CONFIG_FOO))" to guard the call(s) to it. > > Also, like Will mentioned earlier, the function name isn't entirely > accurate anymore. I second the suggestion of using something like > arch_dma_noncoherent_pgprot(). As mentioned I plan to remove arch_dma_mmap_pgprot for 5.4, so I'd rather avoid churn for the short period of time. > As for your idea of defining > pgprot_dmacoherent for all architectures as > > #ifndef pgprot_dmacoherent > #define pgprot_dmacoherent pgprot_noncached > #endif > > I think that the name here is kind of misleading too, since this > definition will only be used when there is no support for proper > DMA coherency. Do you have a suggestion for a better name? I'm pretty bad at naming, so just reusing the arm name seemed like a good way to avoid having to make naming decisions myself. _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] dma-mapping: fix page attributes for dma_mmap_* 2019-08-07 6:04 ` Christoph Hellwig @ 2019-08-07 11:45 ` Shawn Anastasio via iommu 0 siblings, 0 replies; 10+ messages in thread From: Shawn Anastasio via iommu @ 2019-08-07 11:45 UTC (permalink / raw) To: Christoph Hellwig Cc: Gavin Li, linux-kernel, Will Deacon, Michael Ellerman, linuxppc-dev, Russell King, linux-mips, iommu, Paul Burton, Catalin Marinas, James Hogan, Robin Murphy, linux-arm-kernel On 8/7/19 8:04 AM, Christoph Hellwig wrote: > Actually it is typical modern Linux style to just provide a prototype > and then use "if (IS_ENABLED(CONFIG_FOO))" to guard the call(s) to it. I see. >> Also, like Will mentioned earlier, the function name isn't entirely >> accurate anymore. I second the suggestion of using something like >> arch_dma_noncoherent_pgprot(). > > As mentioned I plan to remove arch_dma_mmap_pgprot for 5.4, so I'd > rather avoid churn for the short period of time. Yeah, fair enough. >> As for your idea of defining >> pgprot_dmacoherent for all architectures as >> >> #ifndef pgprot_dmacoherent >> #define pgprot_dmacoherent pgprot_noncached >> #endif >> >> I think that the name here is kind of misleading too, since this >> definition will only be used when there is no support for proper >> DMA coherency. > > Do you have a suggestion for a better name? I'm pretty bad at naming, > so just reusing the arm name seemed like a good way to avoid having > to make naming decisions myself. Good question. Perhaps something like `pgprot_dmacoherent_fallback` would better convey that this is only used for devices that don't support DMA coherency? Or maybe `pgprot_dma_noncoherent`? _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 2/2] MIPS: remove support for DMA_ATTR_WRITE_COMBINE 2019-08-05 8:01 fix default dma_mmap_* pgprot v2 Christoph Hellwig 2019-08-05 8:01 ` [PATCH 1/2] dma-mapping: fix page attributes for dma_mmap_* Christoph Hellwig @ 2019-08-05 8:01 ` Christoph Hellwig 2019-08-05 8:06 ` Sergei Shtylyov 1 sibling, 1 reply; 10+ messages in thread From: Christoph Hellwig @ 2019-08-05 8:01 UTC (permalink / raw) To: iommu Cc: Shawn Anastasio, Will Deacon, Michael Ellerman, linuxppc-dev, linux-kernel, Russell King, linux-mips, Paul Burton, Catalin Marinas, James Hogan, Robin Murphy, linux-arm-kernel Mips uses the KSEG1 kernel memory segment do map dma coherent allocations for non-coherent devices as uncachable, and does not have any kind of special support for DMA_ATTR_WRITE_COMBINE in the allocation path. Thus supporting DMA_ATTR_WRITE_COMBINE in dma_mmap_attrs will lead to multiple mappings with different caching attributes. Fixes: 8c172467be36 ("MIPS: Add implementation of dma_map_ops.mmap()") Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/mips/Kconfig | 1 - arch/mips/mm/dma-noncoherent.c | 8 -------- 2 files changed, 9 deletions(-) diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index d50fafd7bf3a..86e6760ef0d0 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -1119,7 +1119,6 @@ config DMA_PERDEV_COHERENT config DMA_NONCOHERENT bool - select ARCH_HAS_DMA_MMAP_PGPROT select ARCH_HAS_SYNC_DMA_FOR_DEVICE select ARCH_HAS_UNCACHED_SEGMENT select NEED_DMA_MAP_STATE diff --git a/arch/mips/mm/dma-noncoherent.c b/arch/mips/mm/dma-noncoherent.c index ed56c6fa7be2..1d4d57dd9acf 100644 --- a/arch/mips/mm/dma-noncoherent.c +++ b/arch/mips/mm/dma-noncoherent.c @@ -65,14 +65,6 @@ long arch_dma_coherent_to_pfn(struct device *dev, void *cpu_addr, return page_to_pfn(virt_to_page(cached_kernel_address(cpu_addr))); } -pgprot_t arch_dma_mmap_pgprot(struct device *dev, pgprot_t prot, - unsigned long attrs) -{ - if (attrs & DMA_ATTR_WRITE_COMBINE) - return pgprot_writecombine(prot); - return pgprot_noncached(prot); -} - static inline void dma_sync_virt(void *addr, size_t size, enum dma_data_direction dir) { -- 2.20.1 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] MIPS: remove support for DMA_ATTR_WRITE_COMBINE 2019-08-05 8:01 ` [PATCH 2/2] MIPS: remove support for DMA_ATTR_WRITE_COMBINE Christoph Hellwig @ 2019-08-05 8:06 ` Sergei Shtylyov 0 siblings, 0 replies; 10+ messages in thread From: Sergei Shtylyov @ 2019-08-05 8:06 UTC (permalink / raw) To: Christoph Hellwig, iommu Cc: Shawn Anastasio, Will Deacon, Michael Ellerman, linuxppc-dev, linux-kernel, Russell King, linux-mips, Paul Burton, Catalin Marinas, James Hogan, Robin Murphy, linux-arm-kernel Hello! On 05.08.2019 11:01, Christoph Hellwig wrote: > Mips uses the KSEG1 kernel memory segment do map dma coherent MIPS. s/do/to/? > allocations for n on-coherent devices as uncachable, and does not have Uncacheable? > any kind of special support for DMA_ATTR_WRITE_COMBINE in the allocation > path. Thus supporting DMA_ATTR_WRITE_COMBINE in dma_mmap_attrs will > lead to multiple mappings with different caching attributes. > > Fixes: 8c172467be36 ("MIPS: Add implementation of dma_map_ops.mmap()") > Signed-off-by: Christoph Hellwig <hch@lst.de> [...] MBR, Sergei _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply [flat|nested] 10+ messages in thread
* fix default dma_mmap_* pgprot v3 @ 2019-08-07 6:16 Christoph Hellwig 2019-08-07 6:16 ` [PATCH 2/2] MIPS: remove support for DMA_ATTR_WRITE_COMBINE Christoph Hellwig 0 siblings, 1 reply; 10+ messages in thread From: Christoph Hellwig @ 2019-08-07 6:16 UTC (permalink / raw) To: iommu Cc: Shawn Anastasio, Will Deacon, Michael Ellerman, linuxppc-dev, linux-kernel, Russell King, linux-mips, Paul Burton, Catalin Marinas, James Hogan, Robin Murphy, linux-arm-kernel Hi all, As Shawn pointed out we've had issues with the dma mmap pgprots ever since the dma_common_mmap helper was added beyong the initial architectures - we default to uncached mappings, but for devices that are DMA coherent, or if the DMA_ATTR_NON_CONSISTENT is set (and supported) this can lead to aliasing of cache attributes. This patch fixes that. My explanation of why this hasn't been much of an issue is that the dma_mmap_ helpers aren't used widely and mostly just in architecture specific drivers. Changes since v2: - fix m68knommu compile by inlining dma_prprot helper and providing a stub for !CONFIG_MMU - fix various typos in the commit messages Changes since v1: - fix handling of DMA_ATTR_NON_CONSISTENT where it is a no-op (which is most architectures) - remove DMA_ATTR_WRITE_COMBINE on mips, as it seem dangerous as-is _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 2/2] MIPS: remove support for DMA_ATTR_WRITE_COMBINE 2019-08-07 6:16 fix default dma_mmap_* pgprot v3 Christoph Hellwig @ 2019-08-07 6:16 ` Christoph Hellwig 2019-09-18 19:50 ` Maciej W. Rozycki 0 siblings, 1 reply; 10+ messages in thread From: Christoph Hellwig @ 2019-08-07 6:16 UTC (permalink / raw) To: iommu Cc: Shawn Anastasio, Will Deacon, Michael Ellerman, linuxppc-dev, linux-kernel, Russell King, linux-mips, Paul Burton, Catalin Marinas, James Hogan, Robin Murphy, linux-arm-kernel Mips uses the KSEG1 kernel memory segment to map dma coherent allocations for non-coherent devices as uncacheable, and does not have any kind of special support for DMA_ATTR_WRITE_COMBINE in the allocation path. Thus supporting DMA_ATTR_WRITE_COMBINE in dma_mmap_attrs will lead to multiple mappings with different caching attributes. Fixes: 8c172467be36 ("MIPS: Add implementation of dma_map_ops.mmap()") Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/mips/Kconfig | 1 - arch/mips/mm/dma-noncoherent.c | 8 -------- 2 files changed, 9 deletions(-) diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index d50fafd7bf3a..86e6760ef0d0 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -1119,7 +1119,6 @@ config DMA_PERDEV_COHERENT config DMA_NONCOHERENT bool - select ARCH_HAS_DMA_MMAP_PGPROT select ARCH_HAS_SYNC_DMA_FOR_DEVICE select ARCH_HAS_UNCACHED_SEGMENT select NEED_DMA_MAP_STATE diff --git a/arch/mips/mm/dma-noncoherent.c b/arch/mips/mm/dma-noncoherent.c index ed56c6fa7be2..1d4d57dd9acf 100644 --- a/arch/mips/mm/dma-noncoherent.c +++ b/arch/mips/mm/dma-noncoherent.c @@ -65,14 +65,6 @@ long arch_dma_coherent_to_pfn(struct device *dev, void *cpu_addr, return page_to_pfn(virt_to_page(cached_kernel_address(cpu_addr))); } -pgprot_t arch_dma_mmap_pgprot(struct device *dev, pgprot_t prot, - unsigned long attrs) -{ - if (attrs & DMA_ATTR_WRITE_COMBINE) - return pgprot_writecombine(prot); - return pgprot_noncached(prot); -} - static inline void dma_sync_virt(void *addr, size_t size, enum dma_data_direction dir) { -- 2.20.1 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] MIPS: remove support for DMA_ATTR_WRITE_COMBINE 2019-08-07 6:16 ` [PATCH 2/2] MIPS: remove support for DMA_ATTR_WRITE_COMBINE Christoph Hellwig @ 2019-09-18 19:50 ` Maciej W. Rozycki 0 siblings, 0 replies; 10+ messages in thread From: Maciej W. Rozycki @ 2019-09-18 19:50 UTC (permalink / raw) To: Christoph Hellwig Cc: Shawn Anastasio, Michael Ellerman, linuxppc-dev, linux-kernel, Russell King, linux-mips, iommu, Paul Burton, Catalin Marinas, James Hogan, Will Deacon, linux-arm-kernel, Robin Murphy On Wed, 7 Aug 2019, Christoph Hellwig wrote: > Mips uses the KSEG1 kernel memory segment to map dma coherent > allocations for non-coherent devices as uncacheable, and does not have > any kind of special support for DMA_ATTR_WRITE_COMBINE in the allocation > path. Thus supporting DMA_ATTR_WRITE_COMBINE in dma_mmap_attrs will > lead to multiple mappings with different caching attributes. FYI, AFAIK _CACHE_UNCACHED_ACCELERATED (where supported) is effectively write-combine. Though IIUC someone would have to wire it in first. Maciej _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2019-09-18 20:01 UTC | newest] Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-08-05 8:01 fix default dma_mmap_* pgprot v2 Christoph Hellwig 2019-08-05 8:01 ` [PATCH 1/2] dma-mapping: fix page attributes for dma_mmap_* Christoph Hellwig 2019-08-05 9:10 ` Catalin Marinas 2019-08-06 19:39 ` Shawn Anastasio via iommu 2019-08-07 6:04 ` Christoph Hellwig 2019-08-07 11:45 ` Shawn Anastasio via iommu 2019-08-05 8:01 ` [PATCH 2/2] MIPS: remove support for DMA_ATTR_WRITE_COMBINE Christoph Hellwig 2019-08-05 8:06 ` Sergei Shtylyov 2019-08-07 6:16 fix default dma_mmap_* pgprot v3 Christoph Hellwig 2019-08-07 6:16 ` [PATCH 2/2] MIPS: remove support for DMA_ATTR_WRITE_COMBINE Christoph Hellwig 2019-09-18 19:50 ` Maciej W. Rozycki
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).