Skip to content

Commit

Permalink
dma-contiguous: support per-numa CMA for all architectures
Browse files Browse the repository at this point in the history
In the commit b7176c2 ("dma-contiguous: provide the ability to
reserve per-numa CMA"), Barry adds DMA_PERNUMA_CMA for ARM64.

But this feature is architecture independent, so support per-numa CMA
for all architectures, and enable it by default if NUMA.

Signed-off-by: Yajun Deng <yajun.deng@linux.dev>
Tested-by: Yicong Yang <yangyicong@hisilicon.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
  • Loading branch information
Yajun Deng authored and Christoph Hellwig committed Jul 31, 2023
1 parent 3d6f126 commit 22e4a34
Show file tree
Hide file tree
Showing 5 changed files with 11 additions and 13 deletions.
2 changes: 1 addition & 1 deletion Documentation/admin-guide/kernel-parameters.txt
Original file line number Diff line number Diff line change
Expand Up @@ -696,7 +696,7 @@
kernel/dma/contiguous.c

cma_pernuma=nn[MG]
[ARM64,KNL,CMA]
[KNL,CMA]
Sets the size of kernel per-numa memory area for
contiguous memory allocations. A value of 0 disables
per-numa CMA altogether. And If this option is not
Expand Down
2 changes: 0 additions & 2 deletions arch/arm64/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -434,8 +434,6 @@ void __init bootmem_init(void)
arm64_hugetlb_cma_reserve();
#endif

dma_pernuma_cma_reserve();

kvm_hyp_reserve();

/*
Expand Down
6 changes: 0 additions & 6 deletions include/linux/dma-map-ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -169,12 +169,6 @@ static inline void dma_free_contiguous(struct device *dev, struct page *page,
}
#endif /* CONFIG_DMA_CMA*/

#ifdef CONFIG_DMA_PERNUMA_CMA
void dma_pernuma_cma_reserve(void);
#else
static inline void dma_pernuma_cma_reserve(void) { }
#endif /* CONFIG_DMA_PERNUMA_CMA */

#ifdef CONFIG_DMA_DECLARE_COHERENT
int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr,
dma_addr_t device_addr, size_t size);
Expand Down
6 changes: 3 additions & 3 deletions kernel/dma/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -147,10 +147,10 @@ if DMA_CMA

config DMA_PERNUMA_CMA
bool "Enable separate DMA Contiguous Memory Area for each NUMA Node"
default NUMA && ARM64
default NUMA
help
Enable this option to get pernuma CMA areas so that devices like
ARM64 SMMU can get local memory by DMA coherent APIs.
Enable this option to get pernuma CMA areas so that NUMA devices
can get local memory by DMA coherent APIs.

You can set the size of pernuma CMA by specifying "cma_pernuma=size"
on the kernel's command line.
Expand Down
8 changes: 7 additions & 1 deletion kernel/dma/contiguous.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ static inline __maybe_unused phys_addr_t cma_early_percent_memory(void)
#endif

#ifdef CONFIG_DMA_PERNUMA_CMA
void __init dma_pernuma_cma_reserve(void)
static void __init dma_pernuma_cma_reserve(void)
{
int nid;

Expand All @@ -153,6 +153,10 @@ void __init dma_pernuma_cma_reserve(void)
(unsigned long long)pernuma_size_bytes / SZ_1M, nid);
}
}
#else
static inline void __init dma_pernuma_cma_reserve(void)
{
}
#endif

/**
Expand All @@ -171,6 +175,8 @@ void __init dma_contiguous_reserve(phys_addr_t limit)
phys_addr_t selected_limit = limit;
bool fixed = false;

dma_pernuma_cma_reserve();

pr_debug("%s(limit %08lx)\n", __func__, (unsigned long)limit);

if (size_cmdline != -1) {
Expand Down

0 comments on commit 22e4a34

Please sign in to comment.