All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <586A0A05.4040708@samsung.com>

diff --git a/a/1.txt b/N1/1.txt
index 3eb6289..eae3d9c 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,6 +1,6 @@
 
 
-On 2017e?? 01i?? 02i? 1/4  15:46, Michal Nazarewicz wrote:
+On 2017년 01월 02일 15:46, Michal Nazarewicz wrote:
 > On Mon, Jan 02 2017, Jaewon Kim wrote:
 >> There are many reasons of CMA allocation failure such as EBUSY, ENOMEM, EINTR.
 >> But we did not know error reason so far. This patch prints the error value.
@@ -36,8 +36,8 @@ On 2017e?? 01i?? 02i? 1/4  15:46, Michal Nazarewicz wrote:
 >>  
 >> +#ifdef CONFIG_CMA_DEBUG
 >> +static void debug_show_cma_areas(struct cma *cma)
-> Make it a??cma_debug_show_areasa??.  All other functions have a??cmaa?? as
-> prefix so thata??s more consistent.
+> Make it ‘cma_debug_show_areas’.  All other functions have ‘cma’ as
+> prefix so that’s more consistent.
 OK no problem.
 >
 >> +{
@@ -93,3 +93,94 @@ OK no problem.
 >>
 
 Added the latest.
+
+>From ec724faf7ace5e690715e23e82f17f27c697b6b1 Mon Sep 17 00:00:00 2001
+From: Jaewon Kim <jaewon31.kim@samsung.com>
+Date: Thu, 29 Dec 2016 11:00:16 +0900
+Subject: [PATCH] mm: cma: print allocation failure reason and bitmap status
+
+There are many reasons of CMA allocation failure such as EBUSY, ENOMEM, EINTR.
+But we did not know error reason so far. This patch prints the error value.
+
+Additionally if CONFIG_CMA_DEBUG is enabled, this patch shows bitmap status to
+know available pages. Actually CMA internally tries on all available regions
+because some regions can be failed because of EBUSY. Bitmap status is useful to
+know in detail on both ENONEM and EBUSY;
+ ENOMEM: not tried at all because of no available region
+         it could be too small total region or could be fragmentation issue
+ EBUSY:  tried some region but all failed
+
+This is an ENOMEM example with this patch.
+[   12.415458]  [2:   Binder:714_1:  744] cma: cma_alloc: alloc failed, req-size: 256 pages, ret: -12
+If CONFIG_CMA_DEBUG is enabled, avabile pages also will be shown as concatenated
+size@position format. So 4@572 means that there are 4 available pages at 572
+position starting from 0 position.
+[   12.415503]  [2:   Binder:714_1:  744] cma: number of available pages: 4@572+7@585+7@601+8@632+38@730+166@1114+127@1921=> 357 free of 2048 total pages
+
+Signed-off-by: Jaewon Kim <jaewon31.kim@samsung.com>
+Acked-by: Michal Nazarewicz <mina86@mina86.com>
+---
+ mm/cma.c | 34 +++++++++++++++++++++++++++++++++-
+ 1 file changed, 33 insertions(+), 1 deletion(-)
+
+diff --git a/mm/cma.c b/mm/cma.c
+index c960459..c393229 100644
+--- a/mm/cma.c
++++ b/mm/cma.c
+@@ -353,6 +353,32 @@ int __init cma_declare_contiguous(phys_addr_t base,
+     return ret;
+ }
+ 
++#ifdef CONFIG_CMA_DEBUG
++static void cma_debug_show_areas(struct cma *cma)
++{
++    unsigned long next_zero_bit, next_set_bit;
++    unsigned long start = 0;
++    unsigned int nr_zero, nr_total = 0;
++
++    mutex_lock(&cma->lock);
++    pr_info("number of available pages: ");
++    for (;;) {
++        next_zero_bit = find_next_zero_bit(cma->bitmap, cma->count, start);
++        if (next_zero_bit >= cma->count)
++            break;
++        next_set_bit = find_next_bit(cma->bitmap, cma->count, next_zero_bit);
++        nr_zero = next_set_bit - next_zero_bit;
++        pr_cont("%s%u@%lu", nr_total ? "+" : "", nr_zero, next_zero_bit);
++        nr_total += nr_zero;
++        start = next_zero_bit + nr_zero;
++    }
++    pr_cont("=> %u free of %lu total pages\n", nr_total, cma->count);
++    mutex_unlock(&cma->lock);
++}
++#else
++static inline void cma_debug_show_areas(struct cma *cma) { }
++#endif
++
+ /**
+  * cma_alloc() - allocate pages from contiguous area
+  * @cma:   Contiguous memory region for which the allocation is performed.
+@@ -369,7 +395,7 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align)
+     unsigned long start = 0;
+     unsigned long bitmap_maxno, bitmap_no, bitmap_count;
+     struct page *page = NULL;
+-    int ret;
++    int ret = -ENOMEM;
+ 
+     if (!cma || !cma->count)
+         return NULL;
+@@ -426,6 +452,12 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align)
+ 
+     trace_cma_alloc(pfn, page, count, align);
+ 
++    if (ret) {
++        pr_info("%s: alloc failed, req-size: %zu pages, ret: %d\n",
++            __func__, count, ret);
++        cma_debug_show_areas(cma);
++    }
++
+     pr_debug("%s(): returned %p\n", __func__, page);
+     return page;
+ }
+-- 
+1.9.1
diff --git a/a/content_digest b/N1/content_digest
index a74e83c..1459090 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -23,7 +23,7 @@
  "b\0"
  "\n"
  "\n"
- "On 2017e?? 01i?? 02i? 1/4  15:46, Michal Nazarewicz wrote:\n"
+ "On 2017\353\205\204 01\354\233\224 02\354\235\274 15:46, Michal Nazarewicz wrote:\n"
  "> On Mon, Jan 02 2017, Jaewon Kim wrote:\n"
  ">> There are many reasons of CMA allocation failure such as EBUSY, ENOMEM, EINTR.\n"
  ">> But we did not know error reason so far. This patch prints the error value.\n"
@@ -59,8 +59,8 @@
  ">>  \n"
  ">> +#ifdef CONFIG_CMA_DEBUG\n"
  ">> +static void debug_show_cma_areas(struct cma *cma)\n"
- "> Make it a??cma_debug_show_areasa??.  All other functions have a??cmaa?? as\n"
- "> prefix so thata??s more consistent.\n"
+ "> Make it \342\200\230cma_debug_show_areas\342\200\231.  All other functions have \342\200\230cma\342\200\231 as\n"
+ "> prefix so that\342\200\231s more consistent.\n"
  "OK no problem.\n"
  ">\n"
  ">> +{\n"
@@ -115,6 +115,97 @@
  ">> -- \n"
  ">>\n"
  "\n"
- Added the latest.
+ "Added the latest.\n"
+ "\n"
+ ">From ec724faf7ace5e690715e23e82f17f27c697b6b1 Mon Sep 17 00:00:00 2001\n"
+ "From: Jaewon Kim <jaewon31.kim@samsung.com>\n"
+ "Date: Thu, 29 Dec 2016 11:00:16 +0900\n"
+ "Subject: [PATCH] mm: cma: print allocation failure reason and bitmap status\n"
+ "\n"
+ "There are many reasons of CMA allocation failure such as EBUSY, ENOMEM, EINTR.\n"
+ "But we did not know error reason so far. This patch prints the error value.\n"
+ "\n"
+ "Additionally if CONFIG_CMA_DEBUG is enabled, this patch shows bitmap status to\n"
+ "know available pages. Actually CMA internally tries on all available regions\n"
+ "because some regions can be failed because of EBUSY. Bitmap status is useful to\n"
+ "know in detail on both ENONEM and EBUSY;\n"
+ " ENOMEM: not tried at all because of no available region\n"
+ "         it could be too small total region or could be fragmentation issue\n"
+ " EBUSY:  tried some region but all failed\n"
+ "\n"
+ "This is an ENOMEM example with this patch.\n"
+ "[   12.415458]  [2:   Binder:714_1:  744] cma: cma_alloc: alloc failed, req-size: 256 pages, ret: -12\n"
+ "If CONFIG_CMA_DEBUG is enabled, avabile pages also will be shown as concatenated\n"
+ "size@position format. So 4@572 means that there are 4 available pages at 572\n"
+ "position starting from 0 position.\n"
+ "[   12.415503]  [2:   Binder:714_1:  744] cma: number of available pages: 4@572+7@585+7@601+8@632+38@730+166@1114+127@1921=> 357 free of 2048 total pages\n"
+ "\n"
+ "Signed-off-by: Jaewon Kim <jaewon31.kim@samsung.com>\n"
+ "Acked-by: Michal Nazarewicz <mina86@mina86.com>\n"
+ "---\n"
+ " mm/cma.c | 34 +++++++++++++++++++++++++++++++++-\n"
+ " 1 file changed, 33 insertions(+), 1 deletion(-)\n"
+ "\n"
+ "diff --git a/mm/cma.c b/mm/cma.c\n"
+ "index c960459..c393229 100644\n"
+ "--- a/mm/cma.c\n"
+ "+++ b/mm/cma.c\n"
+ "@@ -353,6 +353,32 @@ int __init cma_declare_contiguous(phys_addr_t base,\n"
+ "     return ret;\n"
+ " }\n"
+ " \n"
+ "+#ifdef CONFIG_CMA_DEBUG\n"
+ "+static void cma_debug_show_areas(struct cma *cma)\n"
+ "+{\n"
+ "+    unsigned long next_zero_bit, next_set_bit;\n"
+ "+    unsigned long start = 0;\n"
+ "+    unsigned int nr_zero, nr_total = 0;\n"
+ "+\n"
+ "+    mutex_lock(&cma->lock);\n"
+ "+    pr_info(\"number of available pages: \");\n"
+ "+    for (;;) {\n"
+ "+        next_zero_bit = find_next_zero_bit(cma->bitmap, cma->count, start);\n"
+ "+        if (next_zero_bit >= cma->count)\n"
+ "+            break;\n"
+ "+        next_set_bit = find_next_bit(cma->bitmap, cma->count, next_zero_bit);\n"
+ "+        nr_zero = next_set_bit - next_zero_bit;\n"
+ "+        pr_cont(\"%s%u@%lu\", nr_total ? \"+\" : \"\", nr_zero, next_zero_bit);\n"
+ "+        nr_total += nr_zero;\n"
+ "+        start = next_zero_bit + nr_zero;\n"
+ "+    }\n"
+ "+    pr_cont(\"=> %u free of %lu total pages\\n\", nr_total, cma->count);\n"
+ "+    mutex_unlock(&cma->lock);\n"
+ "+}\n"
+ "+#else\n"
+ "+static inline void cma_debug_show_areas(struct cma *cma) { }\n"
+ "+#endif\n"
+ "+\n"
+ " /**\n"
+ "  * cma_alloc() - allocate pages from contiguous area\n"
+ "  * @cma:   Contiguous memory region for which the allocation is performed.\n"
+ "@@ -369,7 +395,7 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align)\n"
+ "     unsigned long start = 0;\n"
+ "     unsigned long bitmap_maxno, bitmap_no, bitmap_count;\n"
+ "     struct page *page = NULL;\n"
+ "-    int ret;\n"
+ "+    int ret = -ENOMEM;\n"
+ " \n"
+ "     if (!cma || !cma->count)\n"
+ "         return NULL;\n"
+ "@@ -426,6 +452,12 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align)\n"
+ " \n"
+ "     trace_cma_alloc(pfn, page, count, align);\n"
+ " \n"
+ "+    if (ret) {\n"
+ "+        pr_info(\"%s: alloc failed, req-size: %zu pages, ret: %d\\n\",\n"
+ "+            __func__, count, ret);\n"
+ "+        cma_debug_show_areas(cma);\n"
+ "+    }\n"
+ "+\n"
+ "     pr_debug(\"%s(): returned %p\\n\", __func__, page);\n"
+ "     return page;\n"
+ " }\n"
+ "-- \n"
+ 1.9.1
 
-ca0e967d9ec1b9bba1c4616625e8f50aca867f810616b4d4d32ee5113df726da
+b7b078bf84c6038903bba5b89bd2a7223a62c0b0af04ccf6626f171c34900c6e

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.