History

dma-direct: provide mmap and get_sgtable method overrides

For dma-direct we know that the DMA address is an encoding of the physical address that we can trivially decode. Use that fact to provide implementations that do not need the arch_dma_coherent_to_pfn architecture hook. Note that we still can only support mmap of non-coherent memory only if the architecture provides a way to set an uncached bit in the page tables. This must be true for architectures that use the generic remap helpers, but other architectures can also manually select it.

Christoph Hellwig committed 7 years ago

Commit 34dc0ea1 parent 4e1003a16 files · +85 −75Browse files

Unified · Split

16 files
  1. arch/arc/Kconfig +0 −1
  2. arch/arm/Kconfig +0 −1
  3. arch/arm/mm/dma-mapping.c +0 −6
  4. arch/arm64/Kconfig +0 −1
  5. arch/ia64/Kconfig +1 −1
  6. arch/ia64/kernel/dma-mapping.c +0 −6
  7. arch/microblaze/Kconfig +0 −1
  8. arch/mips/Kconfig +2 −2
  9. arch/mips/mm/dma-noncoherent.c +0 −6
  10. arch/powerpc/platforms/Kconfig.cputype +0 −1
  11. include/linux/dma-direct.h +7 −0
  12. include/linux/dma-noncoherent.h +0 −2
  13. kernel/dma/Kconfig +9 −3
  14. kernel/dma/direct.c +59 −0
  15. kernel/dma/mapping.c +7 −38
  16. kernel/dma/remap.c +0 −6
arch/arc/Kconfig+0−1
@@ -6,7 +6,6 @@ · 5 unmodified lines
66 config ARC
77 def_bool y
88 select ARC_TIMERS
9− select ARCH_HAS_DMA_COHERENT_TO_PFN
109 select ARCH_HAS_DMA_PREP_COHERENT
1110 select ARCH_HAS_PTE_SPECIAL
1211 select ARCH_HAS_SETUP_DMA_OPS
arch/arm/Kconfig+0−1
@@ -7,7 +7,6 @@ config ARM · 6 unmodified lines
77 select ARCH_HAS_BINFMT_FLAT
88 select ARCH_HAS_DEBUG_VIRTUAL if MMU
99 select ARCH_HAS_DEVMEM_IS_ALLOWED
10− select ARCH_HAS_DMA_COHERENT_TO_PFN if SWIOTLB
1110 select ARCH_HAS_DMA_WRITE_COMBINE if !ARM_DMA_MEM_BUFFERABLE
1211 select ARCH_HAS_ELF_RANDOMIZE
1312 select ARCH_HAS_FORTIFY_SOURCE
arch/arm/mm/dma-mapping.c+0−6
@@ -2346,12 +2346,6 @@ void arch_sync_dma_for_cpu(struct device *dev, phys_addr_t paddr, · 2345 unmodified lines
23462346 size, dir);
23472347 }
23482348
2349−long arch_dma_coherent_to_pfn(struct device *dev, void *cpu_addr,
2350− dma_addr_t dma_addr)
2351−{
2352− return dma_to_pfn(dev, dma_addr);
2353−}
2354−
23552349 void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
23562350 gfp_t gfp, unsigned long attrs)
23572351 {
arch/arm64/Kconfig+0−1
@@ -12,7 +12,6 @@ config ARM64 · 11 unmodified lines
1212 select ARCH_CLOCKSOURCE_DATA
1313 select ARCH_HAS_DEBUG_VIRTUAL
1414 select ARCH_HAS_DEVMEM_IS_ALLOWED
15− select ARCH_HAS_DMA_COHERENT_TO_PFN
1615 select ARCH_HAS_DMA_PREP_COHERENT
1716 select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI
1817 select ARCH_HAS_FAST_MULTIPLIER
arch/ia64/Kconfig+1−1
@@ -33,7 +33,7 @@ config IA64 · 32 unmodified lines
3333 select HAVE_ARCH_TRACEHOOK
3434 select HAVE_MEMBLOCK_NODE_MAP
3535 select HAVE_VIRT_CPU_ACCOUNTING
36− select ARCH_HAS_DMA_COHERENT_TO_PFN
36+ select DMA_NONCOHERENT_MMAP
3737 select ARCH_HAS_SYNC_DMA_FOR_CPU
3838 select VIRT_TO_BUS
3939 select GENERIC_IRQ_PROBE
arch/ia64/kernel/dma-mapping.c+0−6
@@ -19,9 +19,3 @@ void arch_dma_free(struct device *dev, size_t size, void *cpu_addr, · 18 unmodified lines
1919 {
2020 dma_direct_free_pages(dev, size, cpu_addr, dma_addr, attrs);
2121 }
22−
23−long arch_dma_coherent_to_pfn(struct device *dev, void *cpu_addr,
24− dma_addr_t dma_addr)
25−{
26− return page_to_pfn(virt_to_page(cpu_addr));
27−}
arch/microblaze/Kconfig+0−1
@@ -4,7 +4,6 @@ config MICROBLAZE · 3 unmodified lines
44 select ARCH_32BIT_OFF_T
55 select ARCH_NO_SWAP
66 select ARCH_HAS_BINFMT_FLAT if !MMU
7− select ARCH_HAS_DMA_COHERENT_TO_PFN if MMU
87 select ARCH_HAS_DMA_PREP_COHERENT
98 select ARCH_HAS_GCOV_PROFILE_ALL
109 select ARCH_HAS_SYNC_DMA_FOR_CPU
arch/mips/Kconfig+2−2
@@ -1134,9 +1134,9 @@ config DMA_NONCOHERENT · 1133 unmodified lines
11341134 select ARCH_HAS_DMA_WRITE_COMBINE
11351135 select ARCH_HAS_SYNC_DMA_FOR_DEVICE
11361136 select ARCH_HAS_UNCACHED_SEGMENT
1137− select NEED_DMA_MAP_STATE
1138− select ARCH_HAS_DMA_COHERENT_TO_PFN
1137+ select DMA_NONCOHERENT_MMAP
11391138 select DMA_NONCOHERENT_CACHE_SYNC
1139+ select NEED_DMA_MAP_STATE
11401140
11411141 config SYS_HAS_EARLY_PRINTK
11421142 bool
arch/mips/mm/dma-noncoherent.c+0−6
@@ -59,12 +59,6 @@ void *cached_kernel_address(void *addr) · 58 unmodified lines
5959 return __va(addr) - UNCAC_BASE;
6060 }
6161
62−long arch_dma_coherent_to_pfn(struct device *dev, void *cpu_addr,
63− dma_addr_t dma_addr)
64−{
65− return page_to_pfn(virt_to_page(cached_kernel_address(cpu_addr)));
66−}
67−
6862 static inline void dma_sync_virt(void *addr, size_t size,
6963 enum dma_data_direction dir)
7064 {
arch/powerpc/platforms/Kconfig.cputype+0−1
@@ -459,7 +459,6 @@ config NOT_COHERENT_CACHE · 458 unmodified lines
459459 bool
460460 depends on 4xx || PPC_8xx || E200 || PPC_MPC512x || \
461461 GAMECUBE_COMMON || AMIGAONE
462− select ARCH_HAS_DMA_COHERENT_TO_PFN
463462 select ARCH_HAS_DMA_PREP_COHERENT
464463 select ARCH_HAS_SYNC_DMA_FOR_DEVICE
465464 select ARCH_HAS_SYNC_DMA_FOR_CPU
include/linux/dma-direct.h+7−0
@@ -68,5 +68,12 @@ void dma_direct_free_pages(struct device *dev, size_t size, void *cpu_addr, · 67 unmodified lines
6868 dma_addr_t dma_addr, unsigned long attrs);
6969 struct page *__dma_direct_alloc_pages(struct device *dev, size_t size,
7070 gfp_t gfp, unsigned long attrs);
71+int dma_direct_get_sgtable(struct device *dev, struct sg_table *sgt,
72+ void *cpu_addr, dma_addr_t dma_addr, size_t size,
73+ unsigned long attrs);
74+bool dma_direct_can_mmap(struct device *dev);
75+int dma_direct_mmap(struct device *dev, struct vm_area_struct *vma,
76+ void *cpu_addr, dma_addr_t dma_addr, size_t size,
77+ unsigned long attrs);
7178 int dma_direct_supported(struct device *dev, u64 mask);
7279 #endif /* _LINUX_DMA_DIRECT_H */
include/linux/dma-noncoherent.h+0−2
@@ -41,8 +41,6 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, · 40 unmodified lines
4141 gfp_t gfp, unsigned long attrs);
4242 void arch_dma_free(struct device *dev, size_t size, void *cpu_addr,
4343 dma_addr_t dma_addr, unsigned long attrs);
44−long arch_dma_coherent_to_pfn(struct device *dev, void *cpu_addr,
45− dma_addr_t dma_addr);
4644
4745 #ifdef CONFIG_MMU
4846 /*
kernel/dma/Kconfig+9−3
@@ -51,9 +51,6 @@ config ARCH_HAS_SYNC_DMA_FOR_CPU_ALL · 50 unmodified lines
5151 config ARCH_HAS_DMA_PREP_COHERENT
5252 bool
5353
54−config ARCH_HAS_DMA_COHERENT_TO_PFN
55− bool
56−
5754 config ARCH_HAS_FORCE_DMA_UNENCRYPTED
5855 bool
5956
@@ -68,9 +65,18 @@ config SWIOTLB · 8 unmodified lines
6865 bool
6966 select NEED_DMA_MAP_STATE
7067
68+#
69+# Should be selected if we can mmap non-coherent mappings to userspace.
70+# The only thing that is really required is a way to set an uncached bit
71+# in the pagetables
72+#
73+config DMA_NONCOHERENT_MMAP
74+ bool
75+
7176 config DMA_REMAP
7277 depends on MMU
7378 select GENERIC_ALLOCATOR
79+ select DMA_NONCOHERENT_MMAP
7480 bool
7581
7682 config DMA_DIRECT_REMAP
kernel/dma/direct.c+59−0
@@ -43,6 +43,12 @@ static inline dma_addr_t phys_to_dma_direct(struct device *dev, · 42 unmodified lines
4343 return phys_to_dma(dev, phys);
4444 }
4545
46+static inline struct page *dma_direct_to_page(struct device *dev,
47+ dma_addr_t dma_addr)
48+{
49+ return pfn_to_page(PHYS_PFN(dma_to_phys(dev, dma_addr)));
50+}
51+
4652 u64 dma_direct_get_required_mask(struct device *dev)
4753 {
4854 u64 max_dma = phys_to_dma_direct(dev, (max_pfn - 1) << PAGE_SHIFT);
@@ -379,6 +385,59 @@ dma_addr_t dma_direct_map_resource(struct device *dev, phys_addr_t paddr, · 330 unmodified lines
379385 }
380386 EXPORT_SYMBOL(dma_direct_map_resource);
381387
388+int dma_direct_get_sgtable(struct device *dev, struct sg_table *sgt,
389+ void *cpu_addr, dma_addr_t dma_addr, size_t size,
390+ unsigned long attrs)
391+{
392+ struct page *page = dma_direct_to_page(dev, dma_addr);
393+ int ret;
394+
395+ ret = sg_alloc_table(sgt, 1, GFP_KERNEL);
396+ if (!ret)
397+ sg_set_page(sgt->sgl, page, PAGE_ALIGN(size), 0);
398+ return ret;
399+}
400+
401+#ifdef CONFIG_MMU
402+bool dma_direct_can_mmap(struct device *dev)
403+{
404+ return dev_is_dma_coherent(dev) ||
405+ IS_ENABLED(CONFIG_DMA_NONCOHERENT_MMAP);
406+}
407+
408+int dma_direct_mmap(struct device *dev, struct vm_area_struct *vma,
409+ void *cpu_addr, dma_addr_t dma_addr, size_t size,
410+ unsigned long attrs)
411+{
412+ unsigned long user_count = vma_pages(vma);
413+ unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT;
414+ unsigned long pfn = PHYS_PFN(dma_to_phys(dev, dma_addr));
415+ int ret = -ENXIO;
416+
417+ vma->vm_page_prot = dma_pgprot(dev, vma->vm_page_prot, attrs);
418+
419+ if (dma_mmap_from_dev_coherent(dev, vma, cpu_addr, size, &ret))
420+ return ret;
421+
422+ if (vma->vm_pgoff >= count || user_count > count - vma->vm_pgoff)
423+ return -ENXIO;
424+ return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff,
425+ user_count << PAGE_SHIFT, vma->vm_page_prot);
426+}
427+#else /* CONFIG_MMU */
428+bool dma_direct_can_mmap(struct device *dev)
429+{
430+ return false;
431+}
432+
433+int dma_direct_mmap(struct device *dev, struct vm_area_struct *vma,
434+ void *cpu_addr, dma_addr_t dma_addr, size_t size,
435+ unsigned long attrs)
436+{
437+ return -ENXIO;
438+}
439+#endif /* CONFIG_MMU */
440+
382441 /*
383442 * Because 32-bit DMA masks are so common we expect every architecture to be
384443 * able to satisfy them - either by not supporting more physical memory, or by
kernel/dma/mapping.c+7−38
@@ -112,24 +112,9 @@ int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, · 111 unmodified lines
112112 void *cpu_addr, dma_addr_t dma_addr, size_t size,
113113 unsigned long attrs)
114114 {
115− struct page *page;
115+ struct page *page = virt_to_page(cpu_addr);
116116 int ret;
117117
118− if (!dev_is_dma_coherent(dev)) {
119− unsigned long pfn;
120−
121− if (!IS_ENABLED(CONFIG_ARCH_HAS_DMA_COHERENT_TO_PFN))
122− return -ENXIO;
123−
124− /* If the PFN is not valid, we do not have a struct page */
125− pfn = arch_dma_coherent_to_pfn(dev, cpu_addr, dma_addr);
126− if (!pfn_valid(pfn))
127− return -ENXIO;
128− page = pfn_to_page(pfn);
129− } else {
130− page = virt_to_page(cpu_addr);
131− }
132−
133118 ret = sg_alloc_table(sgt, 1, GFP_KERNEL);
134119 if (!ret)
135120 sg_set_page(sgt->sgl, page, PAGE_ALIGN(size), 0);
@@ -154,7 +139,7 @@ int dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, · 18 unmodified lines
154139 const struct dma_map_ops *ops = get_dma_ops(dev);
155140
156141 if (dma_is_direct(ops))
157− return dma_common_get_sgtable(dev, sgt, cpu_addr, dma_addr,
142+ return dma_direct_get_sgtable(dev, sgt, cpu_addr, dma_addr,
158143 size, attrs);
159144 if (!ops->get_sgtable)
160145 return -ENXIO;
@@ -192,7 +177,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, · 31 unmodified lines
192177 unsigned long user_count = vma_pages(vma);
193178 unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT;
194179 unsigned long off = vma->vm_pgoff;
195− unsigned long pfn;
196180 int ret = -ENXIO;
197181
198182 vma->vm_page_prot = dma_pgprot(dev, vma->vm_page_prot, attrs);
@@ -203,19 +187,8 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, · 4 unmodified lines
203187 if (off >= count || user_count > count - off)
204188 return -ENXIO;
205189
206− if (!dev_is_dma_coherent(dev)) {
207− if (!IS_ENABLED(CONFIG_ARCH_HAS_DMA_COHERENT_TO_PFN))
208− return -ENXIO;
209−
210− /* If the PFN is not valid, we do not have a struct page */
211− pfn = arch_dma_coherent_to_pfn(dev, cpu_addr, dma_addr);
212− if (!pfn_valid(pfn))
213− return -ENXIO;
214− } else {
215− pfn = page_to_pfn(virt_to_page(cpu_addr));
216− }
217−
218− return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff,
190+ return remap_pfn_range(vma, vma->vm_start,
191+ page_to_pfn(virt_to_page(cpu_addr)) + vma->vm_pgoff,
219192 user_count << PAGE_SHIFT, vma->vm_page_prot);
220193 #else
221194 return -ENXIO;
@@ -233,12 +206,8 @@ bool dma_can_mmap(struct device *dev) · 11 unmodified lines
233206 {
234207 const struct dma_map_ops *ops = get_dma_ops(dev);
235208
236− if (dma_is_direct(ops)) {
237− return IS_ENABLED(CONFIG_MMU) &&
238− (dev_is_dma_coherent(dev) ||
239− IS_ENABLED(CONFIG_ARCH_HAS_DMA_COHERENT_TO_PFN));
240− }
241−
209+ if (dma_is_direct(ops))
210+ return dma_direct_can_mmap(dev);
242211 return ops->mmap != NULL;
243212 }
244213 EXPORT_SYMBOL_GPL(dma_can_mmap);
@@ -263,7 +232,7 @@ int dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, · 18 unmodified lines
263232 const struct dma_map_ops *ops = get_dma_ops(dev);
264233
265234 if (dma_is_direct(ops))
266− return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size,
235+ return dma_direct_mmap(dev, vma, cpu_addr, dma_addr, size,
267236 attrs);
268237 if (!ops->mmap)
269238 return -ENXIO;
kernel/dma/remap.c+0−6
@@ -259,10 +259,4 @@ void arch_dma_free(struct device *dev, size_t size, void *vaddr, · 258 unmodified lines
259259 dma_free_contiguous(dev, page, size);
260260 }
261261 }
262−
263−long arch_dma_coherent_to_pfn(struct device *dev, void *cpu_addr,
264− dma_addr_t dma_addr)
265−{
266− return __phys_to_pfn(dma_to_phys(dev, dma_addr));
267−}
268262 #endif /* CONFIG_DMA_DIRECT_REMAP */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t