From: Christoph Hellwig <hch@lst.de> To: iommu@lists.linux-foundation.org Cc: Robin Murphy <robin.murphy@arm.com>, Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will.deacon@arm.com>, Guo Ren <ren_guo@c-sky.com>, Laura Abbott <labbott@redhat.com>, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH 6/9] dma-remap: support DMA_ATTR_NO_KERNEL_MAPPING Date: Mon, 5 Nov 2018 13:19:28 +0100 [thread overview] Message-ID: <20181105121931.13481-7-hch@lst.de> (raw) In-Reply-To: <20181105121931.13481-1-hch@lst.de> Do not waste vmalloc space on allocations that do not require a mapping into the kernel address space. Signed-off-by: Christoph Hellwig <hch@lst.de> --- kernel/dma/remap.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/kernel/dma/remap.c b/kernel/dma/remap.c index 8f1fca34b894..10a545126b0b 100644 --- a/kernel/dma/remap.c +++ b/kernel/dma/remap.c @@ -200,7 +200,8 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, size = PAGE_ALIGN(size); - if (!gfpflags_allow_blocking(flags)) { + if (!gfpflags_allow_blocking(flags) && + !(attrs & DMA_ATTR_NO_KERNEL_MAPPING)) { ret = dma_alloc_from_pool(size, &page, flags); if (!ret) return NULL; @@ -215,6 +216,9 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, /* remove any dirty cache lines on the kernel alias */ arch_dma_prep_coherent(page, size); + if (attrs & DMA_ATTR_NO_KERNEL_MAPPING) + return page; /* opaqueue cookie */ + /* create a coherent mapping */ ret = dma_common_contiguous_remap(page, size, VM_USERMAP, arch_dma_mmap_pgprot(dev, PAGE_KERNEL, attrs), @@ -227,7 +231,10 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, void arch_dma_free(struct device *dev, size_t size, void *vaddr, dma_addr_t dma_handle, unsigned long attrs) { - if (!dma_free_from_pool(vaddr, PAGE_ALIGN(size))) { + if (attrs & DMA_ATTR_NO_KERNEL_MAPPING) { + /* vaddr is a struct page cookie, not a kernel address */ + __dma_direct_free_pages(dev, size, vaddr); + } else if (!dma_free_from_pool(vaddr, PAGE_ALIGN(size))) { phys_addr_t phys = dma_to_phys(dev, dma_handle); struct page *page = pfn_to_page(__phys_to_pfn(phys)); -- 2.19.1
WARNING: multiple messages have this Message-ID (diff)
From: hch@lst.de (Christoph Hellwig) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 6/9] dma-remap: support DMA_ATTR_NO_KERNEL_MAPPING Date: Mon, 5 Nov 2018 13:19:28 +0100 [thread overview] Message-ID: <20181105121931.13481-7-hch@lst.de> (raw) In-Reply-To: <20181105121931.13481-1-hch@lst.de> Do not waste vmalloc space on allocations that do not require a mapping into the kernel address space. Signed-off-by: Christoph Hellwig <hch@lst.de> --- kernel/dma/remap.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/kernel/dma/remap.c b/kernel/dma/remap.c index 8f1fca34b894..10a545126b0b 100644 --- a/kernel/dma/remap.c +++ b/kernel/dma/remap.c @@ -200,7 +200,8 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, size = PAGE_ALIGN(size); - if (!gfpflags_allow_blocking(flags)) { + if (!gfpflags_allow_blocking(flags) && + !(attrs & DMA_ATTR_NO_KERNEL_MAPPING)) { ret = dma_alloc_from_pool(size, &page, flags); if (!ret) return NULL; @@ -215,6 +216,9 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, /* remove any dirty cache lines on the kernel alias */ arch_dma_prep_coherent(page, size); + if (attrs & DMA_ATTR_NO_KERNEL_MAPPING) + return page; /* opaqueue cookie */ + /* create a coherent mapping */ ret = dma_common_contiguous_remap(page, size, VM_USERMAP, arch_dma_mmap_pgprot(dev, PAGE_KERNEL, attrs), @@ -227,7 +231,10 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, void arch_dma_free(struct device *dev, size_t size, void *vaddr, dma_addr_t dma_handle, unsigned long attrs) { - if (!dma_free_from_pool(vaddr, PAGE_ALIGN(size))) { + if (attrs & DMA_ATTR_NO_KERNEL_MAPPING) { + /* vaddr is a struct page cookie, not a kernel address */ + __dma_direct_free_pages(dev, size, vaddr); + } else if (!dma_free_from_pool(vaddr, PAGE_ALIGN(size))) { phys_addr_t phys = dma_to_phys(dev, dma_handle); struct page *page = pfn_to_page(__phys_to_pfn(phys)); -- 2.19.1
next prev parent reply other threads:[~2018-11-05 12:20 UTC|newest] Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-11-05 12:19 move the arm arch_dma_alloc implementation to common code Christoph Hellwig 2018-11-05 12:19 ` Christoph Hellwig 2018-11-05 12:19 ` Christoph Hellwig 2018-11-05 12:19 ` [PATCH 1/9] dma-direct: provide page based alloc/free helpers Christoph Hellwig 2018-11-05 12:19 ` Christoph Hellwig 2018-11-30 19:04 ` Robin Murphy 2018-11-30 19:04 ` Robin Murphy 2018-12-01 16:56 ` Christoph Hellwig 2018-12-01 16:56 ` Christoph Hellwig 2018-11-05 12:19 ` [PATCH 2/9] dma-direct: reject highmem pages from dma_alloc_from_contiguous Christoph Hellwig 2018-11-05 12:19 ` Christoph Hellwig 2018-11-30 19:04 ` Robin Murphy 2018-11-30 19:04 ` Robin Murphy 2018-12-01 16:57 ` Christoph Hellwig 2018-12-01 16:57 ` Christoph Hellwig 2018-11-05 12:19 ` [PATCH 3/9] dma-mapping: move the remap helpers to a separate file Christoph Hellwig 2018-11-05 12:19 ` Christoph Hellwig 2018-11-30 19:05 ` Robin Murphy 2018-11-30 19:05 ` Robin Murphy 2018-11-30 19:05 ` Robin Murphy 2018-12-01 16:59 ` Christoph Hellwig 2018-12-01 16:59 ` Christoph Hellwig 2018-11-05 12:19 ` [PATCH 4/9] dma-mapping: move the arm64 ncoherent alloc/free support to common code Christoph Hellwig 2018-11-05 12:19 ` Christoph Hellwig 2018-11-15 19:50 ` Will Deacon 2018-11-15 19:50 ` Will Deacon 2018-11-30 19:05 ` Robin Murphy 2018-11-30 19:05 ` Robin Murphy 2018-11-30 19:05 ` Robin Murphy 2018-12-01 17:03 ` Christoph Hellwig 2018-12-01 17:03 ` Christoph Hellwig 2018-12-04 10:09 ` Russell King - ARM Linux 2018-12-04 10:09 ` Russell King - ARM Linux 2018-12-04 10:09 ` Russell King - ARM Linux 2018-12-04 14:22 ` Christoph Hellwig 2018-12-04 14:22 ` Christoph Hellwig 2018-11-05 12:19 ` [PATCH 5/9] dma-mapping: support highmem in the generic remap allocator Christoph Hellwig 2018-11-05 12:19 ` Christoph Hellwig 2018-11-30 19:05 ` Robin Murphy 2018-11-30 19:05 ` Robin Murphy 2018-12-04 8:38 ` Marek Szyprowski 2018-12-04 8:38 ` Marek Szyprowski 2018-12-04 14:23 ` Christoph Hellwig 2018-12-04 14:23 ` Christoph Hellwig 2018-12-04 14:23 ` Christoph Hellwig [not found] ` <CGME20181205101414eucas1p2fdde1c06ad6352293980b94b86b022f9@eucas1p2.samsung.com> 2018-12-05 10:14 ` [PATCH] dma-mapping: fix lack of DMA address assignment in " Marek Szyprowski 2018-12-05 10:14 ` Marek Szyprowski 2018-12-05 12:35 ` Thierry Reding 2018-12-05 12:35 ` Thierry Reding 2018-12-05 13:49 ` Christoph Hellwig 2018-12-05 13:49 ` Christoph Hellwig 2018-11-05 12:19 ` Christoph Hellwig [this message] 2018-11-05 12:19 ` [PATCH 6/9] dma-remap: support DMA_ATTR_NO_KERNEL_MAPPING Christoph Hellwig 2018-11-30 19:05 ` Robin Murphy 2018-11-30 19:05 ` Robin Murphy 2018-11-30 19:05 ` Robin Murphy 2018-12-01 17:05 ` Christoph Hellwig 2018-12-01 17:05 ` Christoph Hellwig 2018-12-01 17:05 ` Christoph Hellwig 2018-11-05 12:19 ` [PATCH 7/9] csky: don't select DMA_NONCOHERENT_OPS Christoph Hellwig 2018-11-05 12:19 ` Christoph Hellwig 2018-11-05 15:47 ` Guo Ren 2018-11-05 15:47 ` Guo Ren 2018-11-05 12:19 ` [PATCH 8/9] csky: don't use GFP_DMA in atomic_pool_init Christoph Hellwig 2018-11-05 12:19 ` Christoph Hellwig 2018-11-05 15:47 ` Guo Ren 2018-11-05 15:47 ` Guo Ren 2018-11-05 12:19 ` [PATCH 9/9] csky: use the generic remapping dma alloc implementation Christoph Hellwig 2018-11-05 12:19 ` Christoph Hellwig 2018-11-06 7:01 ` Guo Ren 2018-11-06 7:01 ` Guo Ren 2018-11-09 7:51 ` Christoph Hellwig 2018-11-09 7:51 ` Christoph Hellwig 2018-11-09 7:52 ` move the arm arch_dma_alloc implementation to common code Christoph Hellwig 2018-11-09 7:52 ` Christoph Hellwig 2018-11-15 19:50 ` Will Deacon 2018-11-15 19:50 ` Will Deacon 2018-11-15 19:50 ` Will Deacon 2018-11-15 20:58 ` Robin Murphy 2018-11-15 20:58 ` Robin Murphy 2018-11-27 7:37 ` Christoph Hellwig 2018-11-27 7:37 ` Christoph Hellwig 2018-11-28 12:18 ` Robin Murphy 2018-11-28 12:18 ` Robin Murphy
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20181105121931.13481-7-hch@lst.de \ --to=hch@lst.de \ --cc=catalin.marinas@arm.com \ --cc=iommu@lists.linux-foundation.org \ --cc=labbott@redhat.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=ren_guo@c-sky.com \ --cc=robin.murphy@arm.com \ --cc=will.deacon@arm.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.