From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754607AbdABGqZ (ORCPT ); Mon, 2 Jan 2017 01:46:25 -0500 Received: from mail-lf0-f51.google.com ([209.85.215.51]:33472 "EHLO mail-lf0-f51.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750905AbdABGqX (ORCPT ); Mon, 2 Jan 2017 01:46:23 -0500 From: Michal Nazarewicz To: Jaewon Kim , Michal Hocko Cc: gregkh@linuxfoundation.org, akpm@linux-foundation.org, labbott@redhat.com, m.szyprowski@samsung.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, jaewon31.kim@gmail.com Subject: Re: [PATCH] mm: cma: print allocation failure reason and bitmap status In-Reply-To: <5869E849.1040605@samsung.com> Organization: http://mina86.com/ References: <1482978482-14007-1-git-send-email-jaewon31.kim@samsung.com> <20161229091449.GG29208@dhcp22.suse.cz> <58660BBE.1040807@samsung.com> <20161230094411.GD13301@dhcp22.suse.cz> <5869E849.1040605@samsung.com> User-Agent: Notmuch/0.19+53~g2e63a09 (http://notmuchmail.org) Emacs/26.0.50.2 (x86_64-unknown-linux-gnu) Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAJFBMVEWbfGlUPDDHgE57V0jUupKjgIObY0PLrom9mH4dFRK4gmjPs41MxjOgAAACP0lEQVQ4T23Sv2vbQBQHcBk1xE6WyALX107VUEgmn6+ouUwpEQQ6uRjttkWP4CkBg2M0BQLBdPFZYPsyFYo7qEtKDQ7on+t7+nF2Ux8ahD587717OmNYrOvycHsZ+o2r051wHTHysAvGb8ygvgu4QWT0sCmkgZCIEnlV2X8BtyraazFGDuxhmKSQJMlwHQ7v5MHSNxmz78rfElwAa3ieVD9e+hBhjaPDDG6NgFo2f4wBMNIo5YmRtF0RyDgFjJjlMIWbnuM4x9MMfABGTlN4qgIQB4A1DEyA1BHWtfeWNUMwiVJKoqh97KrkOO+qzgluVYLvFCUKAX73nONeBr7BGMdM6Sg0kuep03VywLaIzRiVr+GAzKlpQIsAFnWAG2e6DT5WmWDiudZMIc6hYrMOmeMQK9WX0B+/RfjzL9DI7Y9/Iayn29Ci0r2i4f9gMimMSZLCDMalgQGU5hnUtqAN0OGvEmO1Wnl0C0wWSCEHnuHBqmygxdxA8oWXwbipoc1EoNR9DqOpBpOJrnr0criQab9ZT4LL+wI+K7GBQH30CrhUruilgP9DRTrhVWZCiAyILP+wiuLeCKGTD6r/nc8LOJcAwR6IBTUs+7CASw3QFZ0MdA2PI3zNziH4ZKVhXCRMBjeZ1DWMekKwDCASwExy+NQ86TaykaDAFHO4aP48y4fIcDM5yOG8GcTLbOyp8A8azjJI93JFd1EA6yN8sSxMQJWoABqniRZVykYgRXErzrdqExAoUrRb0xfRp8p2A/4XmfilTtkDZ4cAAAAASUVORK5CYII= X-Face: -TR8(rDTHy/(xl?SfWd1|3:TTgDIatE^t'vop%*gVg[kn$t{EpK(P"VQ=~T2#ysNmJKN$"yTRLB4YQs$4{[.]Fc1)*O]3+XO^oXM>Q#b^ix,O)Zbn)q[y06$`e3?C)`CwR9y5riE=fv^X@x$y?D:XO6L&x4f-}}I4=VRNwiA^t1-ZrVK^07.Pi/57c_du'& X-PGP: 50751FF4 X-PGP-FP: AC1F 5F5C D418 88F8 CC84 5858 2060 4012 5075 1FF4 X-Hashcash: 1:20:170102:jaewon31.kim@gmail.com::CfTCburQl37fVlWI:0000000000000000000000000000000000000000bbY X-Hashcash: 1:20:170102:labbott@redhat.com::03o02SNPAxu1bW+0:000000000000000000000000000000000000000000013t0 X-Hashcash: 1:20:170102:akpm@linux-foundation.org::oyYsKVkX01WoobFZ:0000000000000000000000000000000000001XmQ X-Hashcash: 1:20:170102:linux-kernel@vger.kernel.org::ciz8JWQ88YonGIuR:0000000000000000000000000000000002FAs X-Hashcash: 1:20:170102:jaewon31.kim@samsung.com::+umIbfpBnoEeNZvV:00000000000000000000000000000000000003IdZ X-Hashcash: 1:20:170102:m.szyprowski@samsung.com::y2CDWe+idGje5sGN:00000000000000000000000000000000000003byV X-Hashcash: 1:20:170102:linux-mm@kvack.org::lUGS5TY2pa+xVtBf:0000000000000000000000000000000000000000000FX3J X-Hashcash: 1:20:170102:mhocko@kernel.org::MExlBLYHLbdbpFCW:00000000000000000000000000000000000000000000Gw3g X-Hashcash: 1:20:170102:gregkh@linuxfoundation.org::GcW0Xf7QGPzYeOms:00000000000000000000000000000000000I6yp Date: Mon, 02 Jan 2017 07:46:16 +0100 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by mail.home.local id v026kU4Z023796 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. > > 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 > Acked-by: Michal Nazarewicz > --- > 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) Make it ‘cma_debug_show_areas’. All other functions have ‘cma’ as prefix so that’s more consistent. > +{ > + 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; > } > -- > -- Best regards ミハウ “𝓶𝓲𝓷𝓪86” ナザレヴイツ «If at first you don’t succeed, give up skydiving»