Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752095AbaL3C0a (ORCPT ); Mon, 29 Dec 2014 21:26:30 -0500 Received: from lgeamrelo04.lge.com ([156.147.1.127]:58433 "EHLO lgeamrelo04.lge.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751829AbaL3C02 (ORCPT ); Mon, 29 Dec 2014 21:26:28 -0500 X-Original-SENDERIP: 10.177.220.158 X-Original-MAILFROM: iamjoonsoo.kim@lge.com Date: Tue, 30 Dec 2014 11:26:26 +0900 From: Joonsoo Kim To: "Stefan I. Strogin" Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Dmitry Safonov , Andrew Morton , Marek Szyprowski , Michal Nazarewicz , aneesh.kumar@linux.vnet.ibm.com, Laurent Pinchart , Pintu Kumar , Weijie Yang , Laura Abbott , SeongJae Park , Hui Zhu , Minchan Kim , Dyasly Sergey , Vyacheslav Tyrtov Subject: Re: [PATCH 3/3] cma: add functions to get region pages counters Message-ID: <20141230022625.GA4588@js1304-P5Q-DELUXE> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Dec 26, 2014 at 05:39:04PM +0300, Stefan I. Strogin wrote: > From: Dmitry Safonov > > Here are two functions that provide interface to compute/get used size > and size of biggest free chunk in cma region. > Added that information in cmainfo. > > Signed-off-by: Dmitry Safonov > --- > include/linux/cma.h | 2 ++ > mm/cma.c | 34 ++++++++++++++++++++++++++++++++++ > 2 files changed, 36 insertions(+) > > diff --git a/include/linux/cma.h b/include/linux/cma.h > index 9384ba6..855e6f2 100644 > --- a/include/linux/cma.h > +++ b/include/linux/cma.h > @@ -18,6 +18,8 @@ struct cma; > extern unsigned long totalcma_pages; > extern phys_addr_t cma_get_base(struct cma *cma); > extern unsigned long cma_get_size(struct cma *cma); > +extern unsigned long cma_get_used(struct cma *cma); > +extern unsigned long cma_get_maxchunk(struct cma *cma); > > extern int __init cma_declare_contiguous(phys_addr_t base, > phys_addr_t size, phys_addr_t limit, > diff --git a/mm/cma.c b/mm/cma.c > index ffaea26..5e560ed 100644 > --- a/mm/cma.c > +++ b/mm/cma.c > @@ -78,6 +78,36 @@ unsigned long cma_get_size(struct cma *cma) > return cma->count << PAGE_SHIFT; > } > > +unsigned long cma_get_used(struct cma *cma) > +{ > + unsigned long ret = 0; > + > + mutex_lock(&cma->lock); > + /* pages counter is smaller than sizeof(int) */ > + ret = bitmap_weight(cma->bitmap, (int)cma->count); > + mutex_unlock(&cma->lock); > + > + return ret << (PAGE_SHIFT + cma->order_per_bit); > +} > + > +unsigned long cma_get_maxchunk(struct cma *cma) > +{ > + unsigned long maxchunk = 0; > + unsigned long start, end = 0; > + > + mutex_lock(&cma->lock); > + for (;;) { > + start = find_next_zero_bit(cma->bitmap, cma->count, end); > + if (start >= cma->count) > + break; > + end = find_next_bit(cma->bitmap, cma->count, start); > + maxchunk = max(end - start, maxchunk); > + } > + mutex_unlock(&cma->lock); > + > + return maxchunk << (PAGE_SHIFT + cma->order_per_bit); > +} > + > static unsigned long cma_bitmap_aligned_mask(struct cma *cma, int align_order) > { > if (align_order <= cma->order_per_bit) > @@ -591,6 +621,10 @@ static int s_show(struct seq_file *m, void *p) > struct cma_buffer *cmabuf; > struct stack_trace trace; > > + seq_printf(m, "CMARegion stat: %8lu kB total, %8lu kB used, %8lu kB max contiguous chunk\n\n", > + cma_get_size(cma) >> 10, > + cma_get_used(cma) >> 10, > + cma_get_maxchunk(cma) >> 10); > mutex_lock(&cma->list_lock); > > list_for_each_entry(cmabuf, &cma->buffers_list, list) { Hello, How about changing printing format like as meminfo or zoneinfo? CMARegion # Total: XXX Used: YYY MaxContig: ZZZ It would help to parse information. And, how about adding how many pages are used now as system pages? You can implement it by iterating range of CMA region and checking Buddy flag. UsedBySystem = Total - UsedByCMA - freepageinCMARegion Thanks. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/