[PATCH makedumpfile 4/9] Introduce a stat for pages retained by extension

HAGIO KAZUHITO(萩尾 一仁) k-hagio-ab at nec.com
Wed Aug 12 21:54:45 PDT 2026


On 2026/08/13 11:15, Tao Liu wrote:
> 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?

Thank you for your review, Tao.

The current code below does not use nr_pages to skip tail pages to be
retained, so I think this patch's code matches this.

                 /*
                  * Unexcludable page
                  */
                 else
                         continue;

(Retained tail pages will be skipped at compound_head check.  If we
change this behavior, a separate patch would be preferable.)

But on the other hand, if we set nr_pages to 1 when PG_EXCLUDE,
extensions cannot exclude tail pages?

                 else if (filter_pg == PG_EXCLUDE) {
                         nr_pages = 1;
                         pfn_counter = &pfn_extension;

Thanks,
Kazu

> 
>> +		}
>> +
>>   		/*
>>   		 * 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