Commit 22e4a348 authored by Yajun Deng's avatar Yajun Deng Committed by Christoph Hellwig
Browse files

dma-contiguous: support per-numa CMA for all architectures



In the commit b7176c26 ("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: default avatarYajun Deng <yajun.deng@linux.dev>
Tested-by: default avatarYicong Yang <yangyicong@hisilicon.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 3d6f126b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
+0 −2
Original line number Diff line number Diff line
@@ -434,8 +434,6 @@ void __init bootmem_init(void)
	arm64_hugetlb_cma_reserve();
#endif

	dma_pernuma_cma_reserve();

	kvm_hyp_reserve();

	/*
+0 −6
Original line number Diff line number Diff line
@@ -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);
+3 −3
Original line number Diff line number Diff line
@@ -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.
+7 −1
Original line number Diff line number Diff line
@@ -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;

@@ -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

/**
@@ -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) {