All of lore.kernel.org
 help / color / mirror / Atom feed
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.