aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/dma/direct.c
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2020-09-22 06:43:17 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2020-09-22 06:43:17 -0400
commitbf3c0e5e7102f5787d693379d9d384b813fe890b (patch)
treeaa48fc57dee9ecdf99918affa38d1b06be41419a /kernel/dma/direct.c
parent32251b07d532174d66941488c112ec046f646157 (diff)
parent976bc5e2aceedef13e0ba1f0e6e372a22164aa0c (diff)
downloadkernel_replicant_linux-bf3c0e5e7102f5787d693379d9d384b813fe890b.tar.gz
kernel_replicant_linux-bf3c0e5e7102f5787d693379d9d384b813fe890b.tar.bz2
kernel_replicant_linux-bf3c0e5e7102f5787d693379d9d384b813fe890b.zip
Merge branch 'x86-seves-for-paolo' of https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip into HEAD
Diffstat (limited to 'kernel/dma/direct.c')
-rw-r--r--kernel/dma/direct.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/kernel/dma/direct.c b/kernel/dma/direct.c
index bb0041e99659..db6ef07aec3b 100644
--- a/kernel/dma/direct.c
+++ b/kernel/dma/direct.c
@@ -43,7 +43,7 @@ u64 dma_direct_get_required_mask(struct device *dev)
return (1ULL << (fls64(max_dma) - 1)) * 2 - 1;
}
-gfp_t dma_direct_optimal_gfp_mask(struct device *dev, u64 dma_mask,
+static gfp_t dma_direct_optimal_gfp_mask(struct device *dev, u64 dma_mask,
u64 *phys_limit)
{
u64 dma_limit = min_not_zero(dma_mask, dev->bus_dma_limit);
@@ -68,7 +68,7 @@ gfp_t dma_direct_optimal_gfp_mask(struct device *dev, u64 dma_mask,
return 0;
}
-bool dma_coherent_ok(struct device *dev, phys_addr_t phys, size_t size)
+static bool dma_coherent_ok(struct device *dev, phys_addr_t phys, size_t size)
{
return phys_to_dma_direct(dev, phys) + size - 1 <=
min_not_zero(dev->coherent_dma_mask, dev->bus_dma_limit);
@@ -161,8 +161,13 @@ void *dma_direct_alloc_pages(struct device *dev, size_t size,
size = PAGE_ALIGN(size);
if (dma_should_alloc_from_pool(dev, gfp, attrs)) {
- ret = dma_alloc_from_pool(dev, size, &page, gfp);
- if (!ret)
+ u64 phys_mask;
+
+ gfp |= dma_direct_optimal_gfp_mask(dev, dev->coherent_dma_mask,
+ &phys_mask);
+ page = dma_alloc_from_pool(dev, size, &ret, gfp,
+ dma_coherent_ok);
+ if (!page)
return NULL;
goto done;
}