diff --git a/mm/cma.c b/mm/cma.c index 7d745237fd01..6f81a895d44f 100644 --- a/mm/cma.c +++ b/mm/cma.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include "cma.h" @@ -96,6 +97,29 @@ static void cma_clear_bitmap(struct cma *cma, unsigned long pfn, mutex_unlock(&cma->lock); } +static int cma_showmem_notifier(struct notifier_block *nb, + unsigned long action, void *data) +{ + int i; + unsigned long used; + struct cma *cma; + + for (i = 0; i < cma_area_count; i++) { + cma = &cma_areas[i]; + used = bitmap_weight(cma->bitmap, + (int)cma_bitmap_maxno(cma)); + used <<= cma->order_per_bit; + pr_info("cma-%d pages: => %lu used of %lu total pages\n", + i, used, cma->count); + } + + return 0; +} + +static struct notifier_block cma_nb = { + .notifier_call = cma_showmem_notifier, +}; + static int __init cma_activate_area(struct cma *cma) { int bitmap_size = BITS_TO_LONGS(cma_bitmap_maxno(cma)) * sizeof(long); @@ -158,6 +182,8 @@ static int __init cma_init_reserved_areas(void) return ret; } + show_mem_notifier_register(&cma_nb); + return 0; } core_initcall(cma_init_reserved_areas);