lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date: Wed, 12 Jun 2024 10:38:31 +0800
From: "zhai.he" <zhai.he@....com>
To: akpm@...ux-foundation.org
Cc: sboyd@...nel.org,
	linux-mm@...ck.org,
	linux-kernel@...r.kernel.org,
	stable@...r.kernel.org,
	zhipeng.wang_1@....com,
	jindong.yue@....com
Subject: [PATCH] Supports to use the default CMA when the device-specified CMA memory is not enough.

From: He Zhai <zhai.he@....com>

In the current code logic, if the device-specified CMA memory
allocation fails, memory will not be allocated from the default CMA area.
This patch will use the default cma region when the device's
specified CMA is not enough.

Signed-off-by: He Zhai <zhai.he@....com>
---
 kernel/dma/contiguous.c | 11 +++++++++--
 mm/cma.c                |  2 +-
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c
index 055da410ac71..e45cfb24500f 100644
--- a/kernel/dma/contiguous.c
+++ b/kernel/dma/contiguous.c
@@ -357,8 +357,13 @@ struct page *dma_alloc_contiguous(struct device *dev, size_t size, gfp_t gfp)
 	/* CMA can be used only in the context which permits sleeping */
 	if (!gfpflags_allow_blocking(gfp))
 		return NULL;
-	if (dev->cma_area)
-		return cma_alloc_aligned(dev->cma_area, size, gfp);
+	if (dev->cma_area) {
+		struct page *page = NULL;
+
+		page = cma_alloc_aligned(dev->cma_area, size, gfp);
+		if (page)
+			return page;
+	}
 	if (size <= PAGE_SIZE)
 		return NULL;
 
@@ -406,6 +411,8 @@ void dma_free_contiguous(struct device *dev, struct page *page, size_t size)
 	if (dev->cma_area) {
 		if (cma_release(dev->cma_area, page, count))
 			return;
+		if (cma_release(dma_contiguous_default_area, page, count))
+			return;
 	} else {
 		/*
 		 * otherwise, page is from either per-numa cma or default cma
diff --git a/mm/cma.c b/mm/cma.c
index 3e9724716bad..f225b3f65bd2 100644
--- a/mm/cma.c
+++ b/mm/cma.c
@@ -495,7 +495,7 @@ struct page *cma_alloc(struct cma *cma, unsigned long count,
 	}
 
 	if (ret && !no_warn) {
-		pr_err_ratelimited("%s: %s: alloc failed, req-size: %lu pages, ret: %d\n",
+		pr_debug("%s: %s: alloc failed, req-size: %lu pages, ret: %d, try to use default cma\n",
 				   __func__, cma->name, count, ret);
 		cma_debug_show_areas(cma);
 	}
-- 
2.34.1


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ