mirror of
https://github.com/lkl/linux.git
synced 2025-12-19 08:03:01 +09:00
dma-contiguous: support per-numa CMA for all architectures
In the commit b7176c261c ("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>
This commit is contained in:
committed by
Christoph Hellwig
parent
3d6f126b15
commit
22e4a348f8
@@ -696,7 +696,7 @@
|
|||||||
kernel/dma/contiguous.c
|
kernel/dma/contiguous.c
|
||||||
|
|
||||||
cma_pernuma=nn[MG]
|
cma_pernuma=nn[MG]
|
||||||
[ARM64,KNL,CMA]
|
[KNL,CMA]
|
||||||
Sets the size of kernel per-numa memory area for
|
Sets the size of kernel per-numa memory area for
|
||||||
contiguous memory allocations. A value of 0 disables
|
contiguous memory allocations. A value of 0 disables
|
||||||
per-numa CMA altogether. And If this option is not
|
per-numa CMA altogether. And If this option is not
|
||||||
|
|||||||
@@ -434,8 +434,6 @@ void __init bootmem_init(void)
|
|||||||
arm64_hugetlb_cma_reserve();
|
arm64_hugetlb_cma_reserve();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
dma_pernuma_cma_reserve();
|
|
||||||
|
|
||||||
kvm_hyp_reserve();
|
kvm_hyp_reserve();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -169,12 +169,6 @@ static inline void dma_free_contiguous(struct device *dev, struct page *page,
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_DMA_CMA*/
|
#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
|
#ifdef CONFIG_DMA_DECLARE_COHERENT
|
||||||
int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr,
|
int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr,
|
||||||
dma_addr_t device_addr, size_t size);
|
dma_addr_t device_addr, size_t size);
|
||||||
|
|||||||
@@ -147,10 +147,10 @@ if DMA_CMA
|
|||||||
|
|
||||||
config DMA_PERNUMA_CMA
|
config DMA_PERNUMA_CMA
|
||||||
bool "Enable separate DMA Contiguous Memory Area for each NUMA Node"
|
bool "Enable separate DMA Contiguous Memory Area for each NUMA Node"
|
||||||
default NUMA && ARM64
|
default NUMA
|
||||||
help
|
help
|
||||||
Enable this option to get pernuma CMA areas so that devices like
|
Enable this option to get pernuma CMA areas so that NUMA devices
|
||||||
ARM64 SMMU can get local memory by DMA coherent APIs.
|
can get local memory by DMA coherent APIs.
|
||||||
|
|
||||||
You can set the size of pernuma CMA by specifying "cma_pernuma=size"
|
You can set the size of pernuma CMA by specifying "cma_pernuma=size"
|
||||||
on the kernel's command line.
|
on the kernel's command line.
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ static inline __maybe_unused phys_addr_t cma_early_percent_memory(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_DMA_PERNUMA_CMA
|
#ifdef CONFIG_DMA_PERNUMA_CMA
|
||||||
void __init dma_pernuma_cma_reserve(void)
|
static void __init dma_pernuma_cma_reserve(void)
|
||||||
{
|
{
|
||||||
int nid;
|
int nid;
|
||||||
|
|
||||||
@@ -153,6 +153,10 @@ void __init dma_pernuma_cma_reserve(void)
|
|||||||
(unsigned long long)pernuma_size_bytes / SZ_1M, nid);
|
(unsigned long long)pernuma_size_bytes / SZ_1M, nid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
static inline void __init dma_pernuma_cma_reserve(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -171,6 +175,8 @@ void __init dma_contiguous_reserve(phys_addr_t limit)
|
|||||||
phys_addr_t selected_limit = limit;
|
phys_addr_t selected_limit = limit;
|
||||||
bool fixed = false;
|
bool fixed = false;
|
||||||
|
|
||||||
|
dma_pernuma_cma_reserve();
|
||||||
|
|
||||||
pr_debug("%s(limit %08lx)\n", __func__, (unsigned long)limit);
|
pr_debug("%s(limit %08lx)\n", __func__, (unsigned long)limit);
|
||||||
|
|
||||||
if (size_cmdline != -1) {
|
if (size_cmdline != -1) {
|
||||||
|
|||||||
Reference in New Issue
Block a user