Skip to content

Commit 9ae2a14

Browse files
committed
Merge tag 'dma-mapping-5.18' of git://git.infradead.org/users/hch/dma-mapping
Pull dma-mapping updates from Christoph Hellwig: - do not zero buffer in set_memory_decrypted (Kirill A. Shutemov) - fix return value of dma-debug __setup handlers (Randy Dunlap) - swiotlb cleanups (Robin Murphy) - remove most remaining users of the pci-dma-compat.h API (Christophe JAILLET) - share the ABI header for the DMA map_benchmark with userspace (Tian Tao) - update the maintainer for DMA MAPPING BENCHMARK (Xiang Chen) - remove CONFIG_DMA_REMAP (me) * tag 'dma-mapping-5.18' of git://git.infradead.org/users/hch/dma-mapping: dma-mapping: benchmark: extract a common header file for map_benchmark definition dma-debug: fix return value of __setup handlers dma-mapping: remove CONFIG_DMA_REMAP media: v4l2-pci-skeleton: Remove usage of the deprecated "pci-dma-compat.h" API rapidio/tsi721: Remove usage of the deprecated "pci-dma-compat.h" API sparc: Remove usage of the deprecated "pci-dma-compat.h" API agp/intel: Remove usage of the deprecated "pci-dma-compat.h" API alpha: Remove usage of the deprecated "pci-dma-compat.h" API MAINTAINERS: update maintainer list of DMA MAPPING BENCHMARK swiotlb: simplify array allocation swiotlb: tidy up includes swiotlb: simplify debugfs setup swiotlb: do not zero buffer in set_memory_decrypted()
2 parents 37fcacb + 8ddde07 commit 9ae2a14

File tree

18 files changed

+105
-160
lines changed

18 files changed

+105
-160
lines changed

MAINTAINERS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5880,7 +5880,7 @@ F: include/linux/dma-map-ops.h
58805880
F: kernel/dma/
58815881

58825882
DMA MAPPING BENCHMARK
5883-
M: Barry Song <song.bao.hua@hisilicon.com>
5883+
M: Xiang Chen <chenxiang66@hisilicon.com>
58845884
58855885
F: kernel/dma/map_benchmark.c
58865886
F: tools/testing/selftests/dma/

arch/alpha/include/asm/floppy.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,18 @@ alpha_fd_dma_setup(char *addr, unsigned long size, int mode, int io)
4343
static int prev_dir;
4444
int dir;
4545

46-
dir = (mode != DMA_MODE_READ) ? PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE;
46+
dir = (mode != DMA_MODE_READ) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
4747

4848
if (bus_addr
4949
&& (addr != prev_addr || size != prev_size || dir != prev_dir)) {
5050
/* different from last time -- unmap prev */
51-
pci_unmap_single(isa_bridge, bus_addr, prev_size, prev_dir);
51+
dma_unmap_single(&isa_bridge->dev, bus_addr, prev_size,
52+
prev_dir);
5253
bus_addr = 0;
5354
}
5455

5556
if (!bus_addr) /* need to map it */
56-
bus_addr = pci_map_single(isa_bridge, addr, size, dir);
57+
bus_addr = dma_map_single(&isa_bridge->dev, addr, size, dir);
5758

5859
/* remember this one as prev */
5960
prev_addr = addr;

arch/alpha/kernel/pci_iommu.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ static dma_addr_t alpha_pci_map_page(struct device *dev, struct page *page,
333333
struct pci_dev *pdev = alpha_gendev_to_pci(dev);
334334
int dac_allowed;
335335

336-
BUG_ON(dir == PCI_DMA_NONE);
336+
BUG_ON(dir == DMA_NONE);
337337

338338
dac_allowed = pdev ? pci_dac_dma_supported(pdev, pdev->dma_mask) : 0;
339339
return pci_map_single_1(pdev, (char *)page_address(page) + offset,
@@ -356,7 +356,7 @@ static void alpha_pci_unmap_page(struct device *dev, dma_addr_t dma_addr,
356356
struct pci_iommu_arena *arena;
357357
long dma_ofs, npages;
358358

359-
BUG_ON(dir == PCI_DMA_NONE);
359+
BUG_ON(dir == DMA_NONE);
360360

361361
if (dma_addr >= __direct_map_base
362362
&& dma_addr < __direct_map_base + __direct_map_size) {
@@ -460,7 +460,7 @@ static void alpha_pci_free_coherent(struct device *dev, size_t size,
460460
unsigned long attrs)
461461
{
462462
struct pci_dev *pdev = alpha_gendev_to_pci(dev);
463-
pci_unmap_single(pdev, dma_addr, size, PCI_DMA_BIDIRECTIONAL);
463+
dma_unmap_single(&pdev->dev, dma_addr, size, DMA_BIDIRECTIONAL);
464464
free_pages((unsigned long)cpu_addr, get_order(size));
465465

466466
DBGA2("pci_free_consistent: [%llx,%zx] from %ps\n",
@@ -639,7 +639,7 @@ static int alpha_pci_map_sg(struct device *dev, struct scatterlist *sg,
639639
dma_addr_t max_dma;
640640
int dac_allowed;
641641

642-
BUG_ON(dir == PCI_DMA_NONE);
642+
BUG_ON(dir == DMA_NONE);
643643

644644
dac_allowed = dev ? pci_dac_dma_supported(pdev, pdev->dma_mask) : 0;
645645

@@ -702,7 +702,7 @@ static int alpha_pci_map_sg(struct device *dev, struct scatterlist *sg,
702702
/* Some allocation failed while mapping the scatterlist
703703
entries. Unmap them now. */
704704
if (out > start)
705-
pci_unmap_sg(pdev, start, out - start, dir);
705+
dma_unmap_sg(&pdev->dev, start, out - start, dir);
706706
return -ENOMEM;
707707
}
708708

@@ -722,7 +722,7 @@ static void alpha_pci_unmap_sg(struct device *dev, struct scatterlist *sg,
722722
dma_addr_t max_dma;
723723
dma_addr_t fbeg, fend;
724724

725-
BUG_ON(dir == PCI_DMA_NONE);
725+
BUG_ON(dir == DMA_NONE);
726726

727727
if (! alpha_mv.mv_pci_tbi)
728728
return;

arch/arm/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ config ARM
4949
select DMA_DECLARE_COHERENT
5050
select DMA_GLOBAL_POOL if !MMU
5151
select DMA_OPS
52-
select DMA_REMAP if MMU
52+
select DMA_NONCOHERENT_MMAP if MMU
5353
select EDAC_SUPPORT
5454
select EDAC_ATOMIC_SCRUB
5555
select GENERIC_ALLOCATOR

arch/sparc/kernel/ioport.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ arch_initcall(sparc_register_ioport);
309309
void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size,
310310
enum dma_data_direction dir)
311311
{
312-
if (dir != PCI_DMA_TODEVICE &&
312+
if (dir != DMA_TO_DEVICE &&
313313
sparc_cpu_model == sparc_leon &&
314314
!sparc_leon3_snooping_enabled())
315315
leon_flush_dcache_all();

arch/xtensa/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ config XTENSA
1818
select BUILDTIME_TABLE_SORT
1919
select CLONE_BACKWARDS
2020
select COMMON_CLK
21-
select DMA_REMAP if MMU
21+
select DMA_NONCOHERENT_MMAP if MMU
2222
select GENERIC_ATOMIC64
2323
select GENERIC_IRQ_SHOW
2424
select GENERIC_LIB_CMPDI2

drivers/char/agp/intel-gtt.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ static int intel_gtt_map_memory(struct page **pages,
111111
for_each_sg(st->sgl, sg, num_entries, i)
112112
sg_set_page(sg, pages[i], PAGE_SIZE, 0);
113113

114-
if (!pci_map_sg(intel_private.pcidev,
115-
st->sgl, st->nents, PCI_DMA_BIDIRECTIONAL))
114+
if (!dma_map_sg(&intel_private.pcidev->dev, st->sgl, st->nents,
115+
DMA_BIDIRECTIONAL))
116116
goto err;
117117

118118
return 0;
@@ -127,8 +127,8 @@ static void intel_gtt_unmap_memory(struct scatterlist *sg_list, int num_sg)
127127
struct sg_table st;
128128
DBG("try unmapping %lu pages\n", (unsigned long)mem->page_count);
129129

130-
pci_unmap_sg(intel_private.pcidev, sg_list,
131-
num_sg, PCI_DMA_BIDIRECTIONAL);
130+
dma_unmap_sg(&intel_private.pcidev->dev, sg_list, num_sg,
131+
DMA_BIDIRECTIONAL);
132132

133133
st.sgl = sg_list;
134134
st.orig_nents = st.nents = num_sg;
@@ -303,9 +303,9 @@ static int intel_gtt_setup_scratch_page(void)
303303
set_pages_uc(page, 1);
304304

305305
if (intel_private.needs_dmar) {
306-
dma_addr = pci_map_page(intel_private.pcidev, page, 0,
307-
PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
308-
if (pci_dma_mapping_error(intel_private.pcidev, dma_addr)) {
306+
dma_addr = dma_map_page(&intel_private.pcidev->dev, page, 0,
307+
PAGE_SIZE, DMA_BIDIRECTIONAL);
308+
if (dma_mapping_error(&intel_private.pcidev->dev, dma_addr)) {
309309
__free_page(page);
310310
return -EINVAL;
311311
}
@@ -552,9 +552,9 @@ static void intel_gtt_teardown_scratch_page(void)
552552
{
553553
set_pages_wb(intel_private.scratch_page, 1);
554554
if (intel_private.needs_dmar)
555-
pci_unmap_page(intel_private.pcidev,
556-
intel_private.scratch_page_dma,
557-
PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
555+
dma_unmap_page(&intel_private.pcidev->dev,
556+
intel_private.scratch_page_dma, PAGE_SIZE,
557+
DMA_BIDIRECTIONAL);
558558
__free_page(intel_private.scratch_page);
559559
}
560560

@@ -1412,13 +1412,13 @@ int intel_gmch_probe(struct pci_dev *bridge_pdev, struct pci_dev *gpu_pdev,
14121412

14131413
if (bridge) {
14141414
mask = intel_private.driver->dma_mask_size;
1415-
if (pci_set_dma_mask(intel_private.pcidev, DMA_BIT_MASK(mask)))
1415+
if (dma_set_mask(&intel_private.pcidev->dev, DMA_BIT_MASK(mask)))
14161416
dev_err(&intel_private.pcidev->dev,
14171417
"set gfx device dma mask %d-bit failed!\n",
14181418
mask);
14191419
else
1420-
pci_set_consistent_dma_mask(intel_private.pcidev,
1421-
DMA_BIT_MASK(mask));
1420+
dma_set_coherent_mask(&intel_private.pcidev->dev,
1421+
DMA_BIT_MASK(mask));
14221422
}
14231423

14241424
if (intel_gtt_init() != 0) {

drivers/iommu/dma-iommu.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -856,7 +856,6 @@ static void *iommu_dma_alloc_remap(struct device *dev, size_t size,
856856
return NULL;
857857
}
858858

859-
#ifdef CONFIG_DMA_REMAP
860859
static struct sg_table *iommu_dma_alloc_noncontiguous(struct device *dev,
861860
size_t size, enum dma_data_direction dir, gfp_t gfp,
862861
unsigned long attrs)
@@ -886,7 +885,6 @@ static void iommu_dma_free_noncontiguous(struct device *dev, size_t size,
886885
sg_free_table(&sh->sgt);
887886
kfree(sh);
888887
}
889-
#endif /* CONFIG_DMA_REMAP */
890888

891889
static void iommu_dma_sync_single_for_cpu(struct device *dev,
892890
dma_addr_t dma_handle, size_t size, enum dma_data_direction dir)
@@ -1280,7 +1278,7 @@ static void __iommu_dma_free(struct device *dev, size_t size, void *cpu_addr)
12801278
dma_free_from_pool(dev, cpu_addr, alloc_size))
12811279
return;
12821280

1283-
if (IS_ENABLED(CONFIG_DMA_REMAP) && is_vmalloc_addr(cpu_addr)) {
1281+
if (is_vmalloc_addr(cpu_addr)) {
12841282
/*
12851283
* If it the address is remapped, then it's either non-coherent
12861284
* or highmem CMA, or an iommu_dma_alloc_remap() construction.
@@ -1322,7 +1320,7 @@ static void *iommu_dma_alloc_pages(struct device *dev, size_t size,
13221320
if (!page)
13231321
return NULL;
13241322

1325-
if (IS_ENABLED(CONFIG_DMA_REMAP) && (!coherent || PageHighMem(page))) {
1323+
if (!coherent || PageHighMem(page)) {
13261324
pgprot_t prot = dma_pgprot(dev, PAGE_KERNEL, attrs);
13271325

13281326
cpu_addr = dma_common_contiguous_remap(page, alloc_size,
@@ -1354,7 +1352,7 @@ static void *iommu_dma_alloc(struct device *dev, size_t size,
13541352

13551353
gfp |= __GFP_ZERO;
13561354

1357-
if (IS_ENABLED(CONFIG_DMA_REMAP) && gfpflags_allow_blocking(gfp) &&
1355+
if (gfpflags_allow_blocking(gfp) &&
13581356
!(attrs & DMA_ATTR_FORCE_CONTIGUOUS)) {
13591357
return iommu_dma_alloc_remap(dev, size, handle, gfp,
13601358
dma_pgprot(dev, PAGE_KERNEL, attrs), attrs);
@@ -1395,7 +1393,7 @@ static int iommu_dma_mmap(struct device *dev, struct vm_area_struct *vma,
13951393
if (off >= nr_pages || vma_pages(vma) > nr_pages - off)
13961394
return -ENXIO;
13971395

1398-
if (IS_ENABLED(CONFIG_DMA_REMAP) && is_vmalloc_addr(cpu_addr)) {
1396+
if (is_vmalloc_addr(cpu_addr)) {
13991397
struct page **pages = dma_common_find_pages(cpu_addr);
14001398

14011399
if (pages)
@@ -1417,7 +1415,7 @@ static int iommu_dma_get_sgtable(struct device *dev, struct sg_table *sgt,
14171415
struct page *page;
14181416
int ret;
14191417

1420-
if (IS_ENABLED(CONFIG_DMA_REMAP) && is_vmalloc_addr(cpu_addr)) {
1418+
if (is_vmalloc_addr(cpu_addr)) {
14211419
struct page **pages = dma_common_find_pages(cpu_addr);
14221420

14231421
if (pages) {
@@ -1449,10 +1447,8 @@ static const struct dma_map_ops iommu_dma_ops = {
14491447
.free = iommu_dma_free,
14501448
.alloc_pages = dma_common_alloc_pages,
14511449
.free_pages = dma_common_free_pages,
1452-
#ifdef CONFIG_DMA_REMAP
14531450
.alloc_noncontiguous = iommu_dma_alloc_noncontiguous,
14541451
.free_noncontiguous = iommu_dma_free_noncontiguous,
1455-
#endif
14561452
.mmap = iommu_dma_mmap,
14571453
.get_sgtable = iommu_dma_get_sgtable,
14581454
.map_page = iommu_dma_map_page,

drivers/rapidio/devices/tsi721.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2836,17 +2836,17 @@ static int tsi721_probe(struct pci_dev *pdev,
28362836
}
28372837

28382838
/* Configure DMA attributes. */
2839-
if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
2840-
err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
2839+
if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(64))) {
2840+
err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
28412841
if (err) {
28422842
tsi_err(&pdev->dev, "Unable to set DMA mask");
28432843
goto err_unmap_bars;
28442844
}
28452845

2846-
if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)))
2846+
if (dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)))
28472847
tsi_info(&pdev->dev, "Unable to set consistent DMA mask");
28482848
} else {
2849-
err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
2849+
err = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64));
28502850
if (err)
28512851
tsi_info(&pdev->dev, "Unable to set consistent DMA mask");
28522852
}

include/linux/map_benchmark.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/* SPDX-License-Identifier: GPL-2.0-only */
2+
/*
3+
* Copyright (C) 2022 HiSilicon Limited.
4+
*/
5+
6+
#ifndef _KERNEL_DMA_BENCHMARK_H
7+
#define _KERNEL_DMA_BENCHMARK_H
8+
9+
#define DMA_MAP_BENCHMARK _IOWR('d', 1, struct map_benchmark)
10+
#define DMA_MAP_MAX_THREADS 1024
11+
#define DMA_MAP_MAX_SECONDS 300
12+
#define DMA_MAP_MAX_TRANS_DELAY (10 * NSEC_PER_MSEC)
13+
14+
#define DMA_MAP_BIDIRECTIONAL 0
15+
#define DMA_MAP_TO_DEVICE 1
16+
#define DMA_MAP_FROM_DEVICE 2
17+
18+
struct map_benchmark {
19+
__u64 avg_map_100ns; /* average map latency in 100ns */
20+
__u64 map_stddev; /* standard deviation of map latency */
21+
__u64 avg_unmap_100ns; /* as above */
22+
__u64 unmap_stddev;
23+
__u32 threads; /* how many threads will do map/unmap in parallel */
24+
__u32 seconds; /* how long the test will last */
25+
__s32 node; /* which numa node this benchmark will run on */
26+
__u32 dma_bits; /* DMA addressing capability */
27+
__u32 dma_dir; /* DMA data direction */
28+
__u32 dma_trans_ns; /* time for DMA transmission in ns */
29+
__u32 granule; /* how many PAGE_SIZE will do map/unmap once a time */
30+
};
31+
#endif /* _KERNEL_DMA_BENCHMARK_H */

kernel/dma/Kconfig

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,15 +110,10 @@ config DMA_GLOBAL_POOL
110110
select DMA_DECLARE_COHERENT
111111
bool
112112

113-
config DMA_REMAP
114-
bool
115-
depends on MMU
116-
select DMA_NONCOHERENT_MMAP
117-
118113
config DMA_DIRECT_REMAP
119114
bool
120-
select DMA_REMAP
121115
select DMA_COHERENT_POOL
116+
select DMA_NONCOHERENT_MMAP
122117

123118
config DMA_CMA
124119
bool "DMA Contiguous Memory Allocator"

kernel/dma/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ obj-$(CONFIG_DMA_DECLARE_COHERENT) += coherent.o
88
obj-$(CONFIG_DMA_API_DEBUG) += debug.o
99
obj-$(CONFIG_SWIOTLB) += swiotlb.o
1010
obj-$(CONFIG_DMA_COHERENT_POOL) += pool.o
11-
obj-$(CONFIG_DMA_REMAP) += remap.o
11+
obj-$(CONFIG_MMU) += remap.o
1212
obj-$(CONFIG_DMA_MAP_BENCHMARK) += map_benchmark.o

kernel/dma/debug.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -927,7 +927,7 @@ static __init int dma_debug_cmdline(char *str)
927927
global_disable = true;
928928
}
929929

930-
return 0;
930+
return 1;
931931
}
932932

933933
static __init int dma_debug_entries_cmdline(char *str)
@@ -936,7 +936,7 @@ static __init int dma_debug_entries_cmdline(char *str)
936936
return -EINVAL;
937937
if (!get_option(&str, &nr_prealloc_entries))
938938
nr_prealloc_entries = PREALLOC_DMA_DEBUG_ENTRIES;
939-
return 0;
939+
return 1;
940940
}
941941

942942
__setup("dma_debug=", dma_debug_cmdline);

kernel/dma/direct.c

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -265,17 +265,13 @@ void *dma_direct_alloc(struct device *dev, size_t size,
265265
page = __dma_direct_alloc_pages(dev, size, gfp & ~__GFP_ZERO);
266266
if (!page)
267267
return NULL;
268+
269+
/*
270+
* dma_alloc_contiguous can return highmem pages depending on a
271+
* combination the cma= arguments and per-arch setup. These need to be
272+
* remapped to return a kernel virtual address.
273+
*/
268274
if (PageHighMem(page)) {
269-
/*
270-
* Depending on the cma= arguments and per-arch setup,
271-
* dma_alloc_contiguous could return highmem pages.
272-
* Without remapping there is no way to return them here, so
273-
* log an error and fail.
274-
*/
275-
if (!IS_ENABLED(CONFIG_DMA_REMAP)) {
276-
dev_info(dev, "Rejecting highmem page from CMA.\n");
277-
goto out_free_pages;
278-
}
279275
remap = true;
280276
set_uncached = false;
281277
}
@@ -349,7 +345,7 @@ void dma_direct_free(struct device *dev, size_t size,
349345
dma_free_from_pool(dev, cpu_addr, PAGE_ALIGN(size)))
350346
return;
351347

352-
if (IS_ENABLED(CONFIG_DMA_REMAP) && is_vmalloc_addr(cpu_addr)) {
348+
if (is_vmalloc_addr(cpu_addr)) {
353349
vunmap(cpu_addr);
354350
} else {
355351
if (IS_ENABLED(CONFIG_ARCH_HAS_DMA_CLEAR_UNCACHED))

0 commit comments

Comments
 (0)