From: Oscar Salvador <osalvador@suse.de>
To: David Hildenbrand <david@redhat.com>
Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org,
Andrew Morton <akpm@linux-foundation.org>,
Thomas Gleixner <tglx@linutronix.de>,
"Peter Zijlstra (Intel)" <peterz@infradead.org>,
Mike Rapoport <rppt@kernel.org>, Michal Hocko <mhocko@kernel.org>,
Wei Yang <richard.weiyang@linux.alibaba.com>,
David Rientjes <rientjes@google.com>,
linux-api@vger.kernel.org
Subject: Re: [PATCH v3] mm/page_alloc: count CMA pages per zone and print them in /proc/zoneinfo
Date: Fri, 29 Jan 2021 12:46:58 +0100 [thread overview]
Message-ID: <20210129114624.GA25391@linux> (raw)
In-Reply-To: <20210129113451.22085-1-david@redhat.com>
On Fri, Jan 29, 2021 at 12:34:51PM +0100, David Hildenbrand wrote:
> Let's count the number of CMA pages per zone and print them in
> /proc/zoneinfo.
>
> Having access to the total number of CMA pages per zone is helpful for
> debugging purposes to know where exactly the CMA pages ended up, and to
> figure out how many pages of a zone might behave differently, even after
> some of these pages might already have been allocated.
>
> As one example, CMA pages part of a kernel zone cannot be used for
> ordinary kernel allocations but instead behave more like ZONE_MOVABLE.
>
> For now, we are only able to get the global nr+free cma pages from
> /proc/meminfo and the free cma pages per zone from /proc/zoneinfo.
>
> Example after this patch when booting a 6 GiB QEMU VM with
> "hugetlb_cma=2G":
> # cat /proc/zoneinfo | grep cma
> cma 0
> nr_free_cma 0
> cma 0
> nr_free_cma 0
> cma 524288
> nr_free_cma 493016
> cma 0
> cma 0
> # cat /proc/meminfo | grep Cma
> CmaTotal: 2097152 kB
> CmaFree: 1972064 kB
>
> Note: We print even without CONFIG_CMA, just like "nr_free_cma"; this way,
> one can be sure when spotting "cma 0", that there are definetly no
> CMA pages located in a zone.
>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org>
> Cc: Mike Rapoport <rppt@kernel.org>
> Cc: Oscar Salvador <osalvador@suse.de>
> Cc: Michal Hocko <mhocko@kernel.org>
> Cc: Wei Yang <richard.weiyang@linux.alibaba.com>
> Cc: David Rientjes <rientjes@google.com>
> Cc: linux-api@vger.kernel.org
> Signed-off-by: David Hildenbrand <david@redhat.com>
Looks good to me, I guess it is better to print it unconditionally
so the layout does not change.
Reviewed-by: Oscar Salvador <osalvador@suse.de>
thanks
> ---
>
> The third time is the charm.
>
> v2 -> v3:
> - Print even without CONFIG_CMA. Use zone_cma_pages().
> - Adjust patch description
> - Dropped Oscar's RB due to the changes
>
> v1 -> v2:
> - Print/track only with CONFIG_CMA
> - Extend patch description
>
> ---
> include/linux/mmzone.h | 15 +++++++++++++++
> mm/page_alloc.c | 1 +
> mm/vmstat.c | 6 ++++--
> 3 files changed, 20 insertions(+), 2 deletions(-)
>
> diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
> index ae588b2f87ef..caafd5e37080 100644
> --- a/include/linux/mmzone.h
> +++ b/include/linux/mmzone.h
> @@ -503,6 +503,9 @@ struct zone {
> * bootmem allocator):
> * managed_pages = present_pages - reserved_pages;
> *
> + * cma pages is present pages that are assigned for CMA use
> + * (MIGRATE_CMA).
> + *
> * So present_pages may be used by memory hotplug or memory power
> * management logic to figure out unmanaged pages by checking
> * (present_pages - managed_pages). And managed_pages should be used
> @@ -527,6 +530,9 @@ struct zone {
> atomic_long_t managed_pages;
> unsigned long spanned_pages;
> unsigned long present_pages;
> +#ifdef CONFIG_CMA
> + unsigned long cma_pages;
> +#endif
>
> const char *name;
>
> @@ -624,6 +630,15 @@ static inline unsigned long zone_managed_pages(struct zone *zone)
> return (unsigned long)atomic_long_read(&zone->managed_pages);
> }
>
> +static inline unsigned long zone_cma_pages(struct zone *zone)
> +{
> +#ifdef CONFIG_CMA
> + return zone->cma_pages;
> +#else
> + return 0;
> +#endif
> +}
> +
> static inline unsigned long zone_end_pfn(const struct zone *zone)
> {
> return zone->zone_start_pfn + zone->spanned_pages;
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index b031a5ae0bd5..9a82375bbcb2 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -2168,6 +2168,7 @@ void __init init_cma_reserved_pageblock(struct page *page)
> }
>
> adjust_managed_page_count(page, pageblock_nr_pages);
> + page_zone(page)->cma_pages += pageblock_nr_pages;
> }
> #endif
>
> diff --git a/mm/vmstat.c b/mm/vmstat.c
> index 7758486097f9..b2537852d498 100644
> --- a/mm/vmstat.c
> +++ b/mm/vmstat.c
> @@ -1642,14 +1642,16 @@ static void zoneinfo_show_print(struct seq_file *m, pg_data_t *pgdat,
> "\n high %lu"
> "\n spanned %lu"
> "\n present %lu"
> - "\n managed %lu",
> + "\n managed %lu"
> + "\n cma %lu",
> zone_page_state(zone, NR_FREE_PAGES),
> min_wmark_pages(zone),
> low_wmark_pages(zone),
> high_wmark_pages(zone),
> zone->spanned_pages,
> zone->present_pages,
> - zone_managed_pages(zone));
> + zone_managed_pages(zone),
> + zone_cma_pages(zone));
>
> seq_printf(m,
> "\n protection: (%ld",
> --
> 2.29.2
>
>
--
Oscar Salvador
SUSE L3
next prev parent reply other threads:[~2021-01-29 12:08 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-27 10:18 [PATCH v1 0/2] mm/cma: better error handling and count pages per zone David Hildenbrand
2021-01-27 10:18 ` [PATCH v1 1/2] mm/cma: expose all pages to the buddy if activation of an area fails David Hildenbrand
2021-01-27 15:58 ` Zi Yan
2021-01-28 9:59 ` Oscar Salvador
2021-01-27 10:18 ` [PATCH v1 2/2] mm/page_alloc: count CMA pages per zone and print them in /proc/zoneinfo David Hildenbrand
2021-01-28 10:22 ` Oscar Salvador
2021-01-28 10:43 ` David Hildenbrand
2021-01-28 13:44 ` Oscar Salvador
2021-01-28 13:46 ` Oscar Salvador
2021-01-28 14:01 ` David Hildenbrand
2021-01-28 16:45 ` [PATCH v2] " David Hildenbrand
2021-01-28 21:42 ` Oscar Salvador
2021-01-28 21:54 ` David Rientjes
2021-01-28 22:03 ` David Hildenbrand
2021-01-28 22:28 ` David Rientjes
2021-01-28 22:30 ` David Hildenbrand
2021-01-29 11:34 ` [PATCH v3] " David Hildenbrand
2021-01-29 11:46 ` Oscar Salvador [this message]
2021-01-29 11:51 ` David Hildenbrand
2021-01-30 8:48 ` David Rientjes
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210129114624.GA25391@linux \
--to=osalvador@suse.de \
--cc=akpm@linux-foundation.org \
--cc=david@redhat.com \
--cc=linux-api@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@kernel.org \
--cc=peterz@infradead.org \
--cc=richard.weiyang@linux.alibaba.com \
--cc=rientjes@google.com \
--cc=rppt@kernel.org \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.