From: He Zhai zhai.he@nxp.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@nxp.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); }
Hi,
Thanks for your patch.
FYI: kernel test robot notices the stable kernel rule is not satisfied.
The check is based on https://www.kernel.org/doc/html/latest/process/stable-kernel-rules.html#opti...
Rule: add the tag "Cc: stable@vger.kernel.org" in the sign-off area to have the patch automatically included in the stable tree. Subject: [PATCH] Supports to use the default CMA when the device-specified CMA memory is not enough. Link: https://lore.kernel.org/stable/20240612023831.810332-1-zhai.he%40nxp.com
On Wed, Jun 12, 2024 at 10:38:31AM +0800, zhai.he wrote:
From: He Zhai zhai.he@nxp.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@nxp.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))
} else { /*return;
- 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);
Why did you change the error level here?
And when you use pr_debug(), you NEVER need to use __func__, as it is already included automatically in the message output. So now you have it twice :)
thanks,
greg k-h
Thanks Greg for your review. The reason I changed the error level is because these logs will be printed when memory allocation from the specified device CMA fails, but if the allocation fails, it will be allocated from the default cma area. It can easily mislead developers' judgment, so I changed it to debug level. I will not use "__func__" in the next version of this patch.
-----Original Message----- From: Greg KH gregkh@linuxfoundation.org Sent: Wednesday, June 12, 2024 3:20 PM To: Zhai He zhai.he@nxp.com Cc: akpm@linux-foundation.org; sboyd@kernel.org; linux-mm@kvack.org; linux-kernel@vger.kernel.org; stable@vger.kernel.org; Zhipeng Wang zhipeng.wang_1@nxp.com; Jindong Yue jindong.yue@nxp.com Subject: [EXT] Re: [PATCH] Supports to use the default CMA when the device-specified CMA memory is not enough.
Caution: This is an external email. Please take care when clicking links or opening attachments. When in doubt, report the message using the 'Report this email' button
On Wed, Jun 12, 2024 at 10:38:31AM +0800, zhai.he wrote:
From: He Zhai zhai.he@nxp.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@nxp.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);
Why did you change the error level here?
And when you use pr_debug(), you NEVER need to use __func__, as it is already included automatically in the message output. So now you have it twice :)
thanks,
greg k-h
A: http://en.wikipedia.org/wiki/Top_post Q: Were do I find info about this thing called top-posting? A: Because it messes up the order in which people normally read text. Q: Why is top-posting such a bad thing? A: Top-posting. Q: What is the most annoying thing in e-mail?
A: No. Q: Should I include quotations after my reply?
http://daringfireball.net/2007/07/on_top
On Wed, Jun 12, 2024 at 07:34:56AM +0000, Zhai He wrote:
Thanks Greg for your review. The reason I changed the error level is because these logs will be printed when memory allocation from the specified device CMA fails, but if the allocation fails, it will be allocated from the default cma area. It can easily mislead developers' judgment, so I changed it to debug level.
Then you need to explain this in the changelog text :(
thanks,
greg k-h
linux-stable-mirror@lists.linaro.org