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.