All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <5869E849.1040605@samsung.com>

diff --git a/a/1.txt b/N1/1.txt
index 2c35625..6acee13 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,6 +1,6 @@
 
 
-On 2017e?? 01i?? 02i? 1/4  06:59, Michal Nazarewicz wrote:
+On 2017년 01월 02일 06:59, Michal Nazarewicz wrote:
 > On Fri, Dec 30 2016, Michal Hocko wrote:
 >> On Fri 30-12-16 16:24:46, Jaewon Kim wrote:
 >> [...]
@@ -56,7 +56,7 @@ Acked-by: Michal Nazarewicz <mina86@mina86.com>
 >>>      trace_cma_alloc(pfn, page, count, align);
 >>>  
 >>>      pr_debug("%s(): returned %p\n", __func__, page);
-> This line should be moved after the a??if (ret != 0)a?? block, i.e. just
+> This line should be moved after the ‘if (ret != 0)’ block, i.e. just
 > before return.
 Thank you Michal Nazarewicz
 I moved the pr_debug right before return
@@ -116,7 +116,7 @@ Thank you I will take this way.
 > #ifdef CONFIG_CMA_DEBUG
 > static void cma_debug_show_areas()
 > {
-> 	a?|
+> 	…
 > }
 > #else
 > static inline void cma_debug_show_areas() { }
@@ -136,3 +136,93 @@ Thank you I will take this way. FYI struct cma address should be passed as a arg
 Thank you all of you.
 Let me reattach my full patch to be clear.
 Let me know if I resend this as a new mail thread.
+
+>From 03bf46bac222587f66fe9935a7879da30ff42cff 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..9e037541 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 debug_show_cma_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 debug_show_cma_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);
++        debug_show_cma_areas(cma);
++    }
++
+     pr_debug("%s(): returned %p\n", __func__, page);
+     return page;
+ }
+--
diff --git a/a/content_digest b/N1/content_digest
index 0e80b68..be17604 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -21,7 +21,7 @@
  "b\0"
  "\n"
  "\n"
- "On 2017e?? 01i?? 02i? 1/4  06:59, Michal Nazarewicz wrote:\n"
+ "On 2017\353\205\204 01\354\233\224 02\354\235\274 06:59, Michal Nazarewicz wrote:\n"
  "> On Fri, Dec 30 2016, Michal Hocko wrote:\n"
  ">> On Fri 30-12-16 16:24:46, Jaewon Kim wrote:\n"
  ">> [...]\n"
@@ -77,7 +77,7 @@
  ">>>      trace_cma_alloc(pfn, page, count, align);\n"
  ">>>  \n"
  ">>>      pr_debug(\"%s(): returned %p\\n\", __func__, page);\n"
- "> This line should be moved after the a??if (ret != 0)a?? block, i.e. just\n"
+ "> This line should be moved after the \342\200\230if (ret != 0)\342\200\231 block, i.e. just\n"
  "> before return.\n"
  "Thank you Michal Nazarewicz\n"
  "I moved the pr_debug right before return\n"
@@ -137,7 +137,7 @@
  "> #ifdef CONFIG_CMA_DEBUG\n"
  "> static void cma_debug_show_areas()\n"
  "> {\n"
- "> \ta?|\n"
+ "> \t\342\200\246\n"
  "> }\n"
  "> #else\n"
  "> static inline void cma_debug_show_areas() { }\n"
@@ -156,6 +156,96 @@
  "\n"
  "Thank you all of you.\n"
  "Let me reattach my full patch to be clear.\n"
- Let me know if I resend this as a new mail thread.
+ "Let me know if I resend this as a new mail thread.\n"
+ "\n"
+ ">From 03bf46bac222587f66fe9935a7879da30ff42cff 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..9e037541 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 debug_show_cma_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 debug_show_cma_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"
+ "+        debug_show_cma_areas(cma);\n"
+ "+    }\n"
+ "+\n"
+ "     pr_debug(\"%s(): returned %p\\n\", __func__, page);\n"
+ "     return page;\n"
+ " }\n"
+ --
 
-7eb63350b56fef90c1ceaab8467714fac90709fe8373bd288da61ceaf3b4c887
+1ffa637a7b7fd4b816bbb3685c861683add22a40ab96305fde24ba0cfd2d5d3e

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.