diff for duplicates of <58660BBE.1040807@samsung.com> diff --git a/a/1.txt b/N1/1.txt index 60818b4..416c595 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -1,6 +1,6 @@ Hello Michal Hocko and and Michal Nazarewichz -On 2016e?? 12i?? 29i? 1/4 23:20, Michal Nazarewicz wrote: +On 2016년 12월 29일 23:20, Michal Nazarewicz wrote: > On Thu, Dec 29 2016, Michal Hocko wrote: >> On Thu 29-12-16 11:28:02, Jaewon Kim wrote: >>> There are many reasons of CMA allocation failure such as EBUSY, ENOMEM, EINTR. @@ -54,8 +54,8 @@ The second showing bitmap status is useful to know in detail on both ENONEM and >>> + nr = next_set_bit - bitmap_no; >>> + if (bitmap_no >= cma->count) >>> + break; -> Put this just next to a??bitmap_no = a?|a?? line. No need to call -> find_next_bit if wea??re gonna break anyway. +> Put this just next to ‘bitmap_no = …’ line. No need to call +> find_next_bit if we’re gonna break anyway. thank you I fixed >>> + if (nr_total == 0) >>> + printk("%u", nr); @@ -76,11 +76,11 @@ Thank you I fixed with @%lu > I wonder if this should be wrapped in > > #ifdef CMA_DEBUG -> a?| +> … > #endif > -> On one hand ita??s relatively expensive (even involving mutex locking) on -> the other ita??s in allocation failure path. +> On one hand it’s relatively expensive (even involving mutex locking) on +> the other it’s in allocation failure path. bitmap status, I think, could be in side of CMA_DEBUG with the mutex but the first error log, I hope, to be out of CMA_DEBUG. > @@ -101,3 +101,80 @@ but the first error log, I hope, to be out of CMA_DEBUG. This is fixed patch following your comment. Please review again If it is OK, let me know whether I need to resend this patch as a new mail thread. + + +>From 7577cc94da3af27907aa6eec590d2ef51e4b9d80 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 try 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. +[ 13.250961] [1: Binder:715_1: 846] cma: cma_alloc: alloc failed, req-size: 256 pages, ret: -12 +Avabile pages also will be shown if CONFIG_CMA_DEBUG is enabled +[ 13.251052] [1: Binder:715_1: 846] cma: number of available pages: 4@572+7@585+7@601+8@632+38@730+166@1114+127@1921=>357 pages, total: 2048 pages + +Signed-off-by: Jaewon Kim <jaewon31.kim@samsung.com> +--- + mm/cma.c | 29 ++++++++++++++++++++++++++++- + 1 file changed, 28 insertions(+), 1 deletion(-) + +diff --git a/mm/cma.c b/mm/cma.c +index c960459..1bcd9db 100644 +--- a/mm/cma.c ++++ b/mm/cma.c +@@ -369,7 +369,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; +@@ -427,6 +427,33 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align) + trace_cma_alloc(pfn, page, count, align); + + pr_debug("%s(): returned %p\n", __func__, page); ++ ++ if (ret != 0) ++ pr_info("%s: alloc failed, req-size: %zu pages, ret: %d\n", ++ __func__, count, ret); ++#ifdef CONFIG_CMA_DEBUG ++ if (ret != 0) { ++ unsigned int nr, nr_total = 0; ++ unsigned long next_set_bit; ++ ++ mutex_lock(&cma->lock); ++ pr_info("number of available pages: "); ++ start = 0; ++ for (;;) { ++ bitmap_no = find_next_zero_bit(cma->bitmap, cma->count, start); ++ if (bitmap_no >= cma->count) ++ break; ++ next_set_bit = find_next_bit(cma->bitmap, cma->count, bitmap_no); ++ nr = next_set_bit - bitmap_no; ++ pr_cont("%s%u@%lu", nr_total ? "+" : "", nr, bitmap_no); ++ nr_total += nr; ++ start = bitmap_no + nr; ++ } ++ pr_cont("=>%u pages, total: %lu pages\n", nr_total, cma->count); ++ mutex_unlock(&cma->lock); ++ } ++#endif ++ + return page; + } + +-- +1.9.1 diff --git a/a/content_digest b/N1/content_digest index 75bc506..84ccb1a 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -18,7 +18,7 @@ "b\0" "Hello Michal Hocko and and Michal Nazarewichz\n" "\n" - "On 2016e?? 12i?? 29i? 1/4 23:20, Michal Nazarewicz wrote:\n" + "On 2016\353\205\204 12\354\233\224 29\354\235\274 23:20, Michal Nazarewicz wrote:\n" "> On Thu, Dec 29 2016, Michal Hocko wrote:\n" ">> On Thu 29-12-16 11:28:02, Jaewon Kim wrote:\n" ">>> There are many reasons of CMA allocation failure such as EBUSY, ENOMEM, EINTR.\n" @@ -72,8 +72,8 @@ ">>> +\t\t\tnr = next_set_bit - bitmap_no;\n" ">>> +\t\t\tif (bitmap_no >= cma->count)\n" ">>> +\t\t\t\tbreak;\n" - "> Put this just next to a??bitmap_no = a?|a?? line. No need to call\n" - "> find_next_bit if wea??re gonna break anyway.\n" + "> Put this just next to \342\200\230bitmap_no = \342\200\246\342\200\231 line. No need to call\n" + "> find_next_bit if we\342\200\231re gonna break anyway.\n" "thank you I fixed\n" ">>> +\t\t\tif (nr_total == 0)\n" ">>> +\t\t\t\tprintk(\"%u\", nr);\n" @@ -94,11 +94,11 @@ "> I wonder if this should be wrapped in\n" ">\n" "> #ifdef CMA_DEBUG\n" - "> a?|\n" + "> \342\200\246\n" "> #endif\n" ">\n" - "> On one hand ita??s relatively expensive (even involving mutex locking) on\n" - "> the other ita??s in allocation failure path.\n" + "> On one hand it\342\200\231s relatively expensive (even involving mutex locking) on\n" + "> the other it\342\200\231s in allocation failure path.\n" "bitmap status, I think, could be in side of CMA_DEBUG with the mutex\n" "but the first error log, I hope, to be out of CMA_DEBUG.\n" ">\n" @@ -118,6 +118,83 @@ ">> SUSE Labs\n" "This is fixed patch following your comment.\n" "Please review again\n" - If it is OK, let me know whether I need to resend this patch as a new mail thread. + "If it is OK, let me know whether I need to resend this patch as a new mail thread.\n" + "\n" + "\n" + ">From 7577cc94da3af27907aa6eec590d2ef51e4b9d80 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 try all available regions because\n" + "some regions can be failed because of EBUSY. Bitmap status is useful to know in\n" + "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" + "[ 13.250961] [1: Binder:715_1: 846] cma: cma_alloc: alloc failed, req-size: 256 pages, ret: -12\n" + "Avabile pages also will be shown if CONFIG_CMA_DEBUG is enabled\n" + "[ 13.251052] [1: Binder:715_1: 846] cma: number of available pages: 4@572+7@585+7@601+8@632+38@730+166@1114+127@1921=>357 pages, total: 2048 pages\n" + "\n" + "Signed-off-by: Jaewon Kim <jaewon31.kim@samsung.com>\n" + "---\n" + " mm/cma.c | 29 ++++++++++++++++++++++++++++-\n" + " 1 file changed, 28 insertions(+), 1 deletion(-)\n" + "\n" + "diff --git a/mm/cma.c b/mm/cma.c\n" + "index c960459..1bcd9db 100644\n" + "--- a/mm/cma.c\n" + "+++ b/mm/cma.c\n" + "@@ -369,7 +369,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" + "@@ -427,6 +427,33 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align)\n" + " trace_cma_alloc(pfn, page, count, align);\n" + " \n" + " pr_debug(\"%s(): returned %p\\n\", __func__, page);\n" + "+\n" + "+ if (ret != 0)\n" + "+ pr_info(\"%s: alloc failed, req-size: %zu pages, ret: %d\\n\",\n" + "+ __func__, count, ret);\n" + "+#ifdef CONFIG_CMA_DEBUG\n" + "+ if (ret != 0) {\n" + "+ unsigned int nr, nr_total = 0;\n" + "+ unsigned long next_set_bit;\n" + "+\n" + "+ mutex_lock(&cma->lock);\n" + "+ pr_info(\"number of available pages: \");\n" + "+ start = 0;\n" + "+ for (;;) {\n" + "+ bitmap_no = find_next_zero_bit(cma->bitmap, cma->count, start);\n" + "+ if (bitmap_no >= cma->count)\n" + "+ break;\n" + "+ next_set_bit = find_next_bit(cma->bitmap, cma->count, bitmap_no);\n" + "+ nr = next_set_bit - bitmap_no;\n" + "+ pr_cont(\"%s%u@%lu\", nr_total ? \"+\" : \"\", nr, bitmap_no);\n" + "+ nr_total += nr;\n" + "+ start = bitmap_no + nr;\n" + "+ }\n" + "+ pr_cont(\"=>%u pages, total: %lu pages\\n\", nr_total, cma->count);\n" + "+ mutex_unlock(&cma->lock);\n" + "+ }\n" + "+#endif\n" + "+\n" + " return page;\n" + " }\n" + " \n" + "-- \n" + 1.9.1 -6241f6bc98a62888529711c4eeb5550826a16b761b3ff71c7067ce5fd8dc8a7f +d99302191f604c0538cbf9c0f5c2c89e0f5dd7e1181d2236779dc8e9120936cf
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.