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.