[PATCH makedumpfile 4/9] Introduce a stat for pages retained by extension
Tao Liu
ltao at redhat.com
Wed Aug 12 19:15:03 PDT 2026
Hi Stephen,
On Mon, Jul 13, 2026 at 05:45:37PM -0700, Stephen Brennan wrote:
> Extensions can mark pages to be excluded, but those pages may already be
> excluded due to the dump level. We have a statistic to count pages
> excluded by extensions. It counts only pages which were excluded because
> no other criteria excluded them.
>
> Extensions can mark pages to be retained, but there is no statistic to
> count them. Adding a counter to the code as-is would not give us the
> value that we care about. Just as above, pages marked for inclusion may
> have been included anyway due to the dump-level configuration. The most
> useful statistic is the one that tells us how many pages were included
> by the extension, which would not have been included otherwise.
>
> Introduce a statistic that counts this amount. To do so, we have to
> skip the short-circuit evaluation when PG_INCLUDE is returned. This
> seems like a worthwhile trade-off, since the dump-level checks are all
> reasonably efficient.
>
> Signed-off-by: Stephen Brennan <stephen.s.brennan at oracle.com>
> ---
> makedumpfile.c | 13 +++++++++++--
> 1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/makedumpfile.c b/makedumpfile.c
> index a4c9bbf..cf6a38f 100644
> --- a/makedumpfile.c
> +++ b/makedumpfile.c
> @@ -106,6 +106,7 @@ mdf_pfn_t pfn_elf_excluded;
> mdf_pfn_t pfn_extension;
>
> mdf_pfn_t num_dumped;
> +mdf_pfn_t num_extension_retained;
>
> int retcd = FAILED; /* return code */
>
> @@ -6638,8 +6639,6 @@ check_order:
> * makedumpfile extensions
> */
> filter_pg = run_extension_callback(pfn, pcache, &i);
> - if (filter_pg == PG_INCLUDE)
> - continue;
>
> /*
> * Exclude the free page managed by a buddy
> @@ -6722,6 +6721,13 @@ check_order:
> else
> continue;
>
> + if (filter_pg == PG_INCLUDE) {
> + /* Account pages which would have been excluded, but were
> + * retained by an extension. */
> + num_extension_retained += nr_pages;
> + continue;
Maybe I'm wrong, from the code we are trying to retain nr_pages, don't
we need to do
pfn += nr_pages
to update the pfn of the next for-loop?
> + }
> +
> /*
> * Execute exclusion
> */
> @@ -8265,6 +8271,7 @@ write_elf_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_page)
> if (info->flag_cyclic) {
> pfn_zero = pfn_cache = pfn_cache_private = 0;
> pfn_user = pfn_free = pfn_hwpoison = pfn_offline = pfn_extension = 0;
> + num_extension_retained = 0;
> pfn_memhole = info->max_mapnr;
> }
>
> @@ -9610,6 +9617,7 @@ write_kdump_pages_and_bitmap_cyclic(struct cache_data *cd_header, struct cache_d
> */
> pfn_zero = pfn_cache = pfn_cache_private = 0;
> pfn_user = pfn_free = pfn_hwpoison = pfn_offline = pfn_extension = 0;
> + num_extension_retained = 0;
> pfn_memhole = info->max_mapnr;
>
> /*
> @@ -10575,6 +10583,7 @@ print_report(void)
> REPORT_MSG(" Hwpoison pages : 0x%016llx\n", pfn_hwpoison);
> REPORT_MSG(" Offline pages : 0x%016llx\n", pfn_offline);
> REPORT_MSG(" Extension filter pages : 0x%016llx\n", pfn_extension);
> + REPORT_MSG(" Retained by extension : 0x%016llx\n", num_extension_retained);
> REPORT_MSG(" Remaining pages : 0x%016llx\n",
> pfn_original - pfn_excluded);
>
I suggest to reorder the "print_report" as follows:
Original pages :
Excluded pages :
Pages filled with zero :
Non-private cache pages :
Private cache pages :
User process data pages :
Free pages :
Hwpoison pages :
Offline pages :
Extension filter pages :
Remaining pages :
Extension retain pages :
IMHO, this is clearer to represent "Original pages" == "Excluded pages" + "Remaining pages";
and "Extension retained pages" is a subset of "Remaining pages".
Thanks,
Tao Liu
> --
> 2.47.3
>
More information about the kexec
mailing list