mm: cma: add functions to get region pages counters
Subsystems (2)
PATCH 1/1 mm: cma: add functions to get region pages counters
From: Dmitry Safonov <[email protected]>
Here are two functions that provide interface to compute/get used size and size of biggest free chunk in cma region. Add that information to debugfs.
---
Took out from the patch set "mm: cma: add some debug information for CMA" v4
(http://thread.gmane.org/gmane.linux.kernel.mm/129903) because of probable uselessness of the most part of the set.
include/linux/cma.h | 2 ++ mm/cma.c | 30 ++++++++++++++++++++++++++++++ mm/cma_debug.c | 24 ++++++++++++++++++++++++ 3 files changed, 56 insertions(+)
include/linux/cma.h +2 -0
@@ -18,6 +18,8 @@ struct cma;extern unsigned long totalcma_pages;extern phys_addr_t cma_get_base (const struct cma *cma);extern unsigned long cma_get_size (const 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,
mm/cma.c +30 -0
@@ -53,6 +53,36 @@ unsigned long cma_get_size(const 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 << 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 << cma->order_per_bit; +} +static unsigned long cma_bitmap_aligned_mask (const struct cma *cma,int align_order) {
mm/cma_debug.c +24 -0
@@ -33,6 +33,28 @@ static int cma_debugfs_get(void *data, u64 *val)DEFINE_SIMPLE_ATTRIBUTE (cma_debugfs_fops, cma_debugfs_get,NULL ,"%llu\n" ); +static int cma_used_get (void *data,u64 *val) +{ +struct cma *cma = data; + + *val =cma_get_used (cma); + +return 0 ; +} + +DEFINE_SIMPLE_ATTRIBUTE (cma_used_fops, cma_used_get,NULL ,"%llu\n" ); + +static int cma_maxchunk_get (void *data,u64 *val) +{ +struct cma *cma = data; + + *val =cma_get_maxchunk (cma); + +return 0 ; +} + +DEFINE_SIMPLE_ATTRIBUTE (cma_maxchunk_fops, cma_maxchunk_get,NULL ,"%llu\n" ); +static void cma_add_to_cma_mem_list (struct cma *cma,struct cma_mem *mem) {spin_lock (&cma->mem_head_lock);
@@ -149,6 +171,8 @@ static void cma_debugfs_add_one(struct cma *cma, int idx) &cma->count, &cma_debugfs_fops);debugfs_create_file ("order_per_bit" ,S_IRUGO , tmp, &cma->order_per_bit, &cma_debugfs_fops); +debugfs_create_file ("used" ,S_IRUGO , tmp, cma, &cma_used_fops); +debugfs_create_file ("maxchunk" ,S_IRUGO , tmp, cma, &cma_maxchunk_fops); u32s =DIV_ROUND_UP (cma_bitmap_maxno (cma),BITS_PER_BYTE *sizeof (u32));debugfs_create_u32_array ("bitmap" ,S_IRUGO , tmp, (u32 *)cma->bitmap, u32s);
Signature · 7 lines
2.1.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Andrew Morton
maintainerQuoted 32 lines · On Fri, 03 Apr 2015 15:42:40 +0300 Stefan Strogin <[email protected]>…
From: Dmitry Safonov <[email protected]>
Here are two functions that provide interface to compute/get used size and size of biggest free chunk in cma region. Add that information to debugfs.
...
mm/cma.c +19
-0@@ -53,6 +53,36 @@ unsigned long cma_get_size(const 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 << 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 (;;) {
mm/cma.c unsigned long cma_get_size(const struct cma *cma) · line 84
Quoted 10 lines
mm/cma.c +10
-0+ 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 << cma->order_per_bit; +}
This will cause unused code to be included in cma.o when CONFIG_CMA_DEBUGFS=n. Please review the below patch which moves it all into cma_debug.c
Quoted 4 lines
mm/cma_debug.c +0
-0@@ -33,6 +33,28 @@ static int cma_debugfs_get(void *data, u64 *val)
mm/cma_debug.c static int cma_debugfs_get(void *data, u64 *val) · line 43
Quoted 10 lines
mm/cma_debug.c +8
-0DEFINE_SIMPLE_ATTRIBUTE (cma_debugfs_fops, cma_debugfs_get,NULL ,"%llu\n" ); +static int cma_used_get (void *data,u64 *val) +{ +struct cma *cma = data; + + *val =cma_get_used (cma); + +return 0 ; +}
We have cma_used_get() and cma_get_used(). Confusing! Can we think of better names for one or both of them?
From: Andrew Morton <[email protected]>
Subject: mm-cma-add-functions-to-get-region-pages-counters-fix
move debug code from cma.c into cma_debug.c so it doesn't get included in CONFIG_CMA_DEBUGFS=n builds
---
include/linux/cma.h | 2 -- mm/cma.c | 30 ------------------------------ mm/cma_debug.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 32 deletions(-)
include/linux/cma.h renamed from include/linux/cma.h~mm-cma-add-functions-to-get-region-pages-counters-fix +0 -2
@@ -18,8 +18,6 @@ struct cma;extern unsigned long totalcma_pages;extern phys_addr_t cma_get_base (const struct cma *cma);extern unsigned long cma_get_size (const 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,
mm/cma.c renamed from mm/cma.c~mm-cma-add-functions-to-get-region-pages-counters-fix +0 -30
@@ -53,36 +53,6 @@ unsigned long cma_get_size(const structreturn 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 << 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 << cma->order_per_bit; -} -static unsigned long cma_bitmap_aligned_mask (const struct cma *cma,int align_order) {
mm/cma_debug.c renamed from mm/cma_debug.c~mm-cma-add-functions-to-get-region-pages-counters-fix +31 -0
@@ -22,6 +22,37 @@ struct cma_mem {static struct dentry *cma_debugfs_root; +static 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 << cma->order_per_bit; +} + +static 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 << cma->order_per_bit; +} + +static int cma_debugfs_get (void *data,u64 *val) {unsigned long *p = data;
_
Hello Andrew,
Quoted 40 lines · Andrew Morton
Quoted 38 lines · On Fri, 03 Apr 2015 15:42:40 +0300 Stefan Strogin <[email protected]>…
From: Dmitry Safonov <[email protected]>
Here are two functions that provide interface to compute/get used size and size of biggest free chunk in cma region. Add that information to debugfs.
...
mm/cma.c +25
-0@@ -53,6 +53,36 @@ unsigned long cma_get_size(const 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 << 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); + }
Quoted 9 lines
mm/cma.c unsigned long cma_get_size(const struct cma *cma) · line 84
Quoted 4 lines
mm/cma.c +4
-0+mutex_unlock (&cma->lock); + +return maxchunk << cma->order_per_bit; +}This will cause unused code to be included in cma.o when
CONFIG_CMA_DEBUGFS=n. Please review the below patch which moves it all intocma_debug.c
Thank you very much for the reply and for the patches.
Quoted 6 lines
Quoted 6 lines
mm/cma_debug.c +0
-0@@ -33,6 +33,28 @@ static int cma_debugfs_get(void *data, u64 *val)DEFINE_SIMPLE_ATTRIBUTE (cma_debugfs_fops, cma_debugfs_get,NULL ,"%llu\n" );
Quoted 12 lines
mm/cma_debug.c struct cma_mem { · line 35
Quoted 8 lines
mm/cma_debug.c +8
-0+static int cma_used_get (void *data,u64 *val) +{ +struct cma *cma = data; + + *val =cma_get_used (cma); + +return 0 ; +}We have
cma_used_get()andcma_get_used(). Confusing! Can we think of better names for one or both of them?
Oh. Excuse me for the bad code.
Wouldn't it be better to merge cma_get_used() and cma_get_maxchunk() into cma_*_get() as they aren't used anywhere else? Please see the following patch.
PATCH 1/1 mm-cma-add-functions-to-get-region-pages-counters-fix-2
Move the code from cma_get_used() and cma_get_maxchunk() to cma_used_get() and cma_maxchunk_get(), because cma_get_*() aren't used anywhere else, and because of their confusing similar names.
--- mm/cma_debug.c | 51 ++++++++++++++++++--------------------------------- 1 file changed, 18 insertions(+), 33 deletions(-)
mm/cma_debug.c +18 -33
@@ -22,37 +22,6 @@ struct cma_mem {static struct dentry *cma_debugfs_root; -static 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 << cma->order_per_bit; -} - -static 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 << cma->order_per_bit; -} - -static int cma_debugfs_get (void *data,u64 *val) {unsigned long *p = data;
@@ -66,8 +35,13 @@ DEFINE_SIMPLE_ATTRIBUTE(cma_debugfs_fops, cma_debugfs_get, NULL, "%llu\n");static int cma_used_get (void *data,u64 *val) {struct cma *cma = data; +unsigned long used; - *val =cma_get_used (cma); +mutex_lock (&cma->lock); +/* pages counter is smaller than sizeof(int) */ + used =bitmap_weight (cma->bitmap, (int )cma->count); +mutex_unlock (&cma->lock); + *val = used << cma->order_per_bit;return 0 ; }
@@ -76,8 +50,19 @@ DEFINE_SIMPLE_ATTRIBUTE(cma_used_fops, cma_used_get, NULL, "%llu\n");static int cma_maxchunk_get (void *data,u64 *val) {struct cma *cma = data; +unsigned long maxchunk =0 ; +unsigned long start, end =0 ; - *val =cma_get_maxchunk (cma); +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); + *val = maxchunk << cma->order_per_bit;return 0 ; }
Signature · 7 lines
2.1.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>