the exiting makedumpfile is almost there... :)

Jay Lan jlan at sgi.com
Thu Sep 25 15:22:07 EDT 2008


Ken'ichi Ohmichi wrote:
> Hi Jay,

Hi Ken'ichi San,

The latest patch worked on my 2p A350 IA64 as well as on my 128p 256G
memory A4700 machines! And it still took less than 2 minutes to
complete makedumpfile on the freshly booted A4700 (compared to >6
minutes doing 'cp --sparse=always' :) It would be fun to see how much
time to run makedumpfile on a 1TB system ;)

Congradulation, Ken'ichi! And, thanks a lot!

Now, only if i can cut out huge memory required for kdump kernel
due to cpus we do not need (hey, maxcpus=1!) and due to disk arrays
we do not use! ;)

Cheers,
 - jay

> 
> The last patch contained a bug yet, so please use this patch.
> Sorry for my mistake.
> 
> Ken'ichi Ohmichi wrote:
>> Yes, your test data helps me.
>> Your test informed me that there was the buffer-handling problem
>> referring different page yet, so the last patch is not enough.
>> I created the attached patch for fixing it. Could you test the
>> attached patch again ?  Sorry for many tests.
>>
>> This patch is for makedumpfile-1.2.9.
>>
>>
>> Thanks
>> Ken'ichi Ohmichi
>>
>> diff -puN a/makedumpfile.c b/makedumpfile.c
>> --- a/makedumpfile.c	2008-09-25 15:39:00.000000000 +0900
>> +++ b/makedumpfile.c	2008-09-25 15:39:17.000000000 +0900
>> @@ -4133,6 +4133,7 @@ exclude_unnecessary_pages(void)
>>  	unsigned int mm;
>>  	unsigned long mem_map;
>>  	unsigned long long pfn, paddr, pfn_mm;
>> +	unsigned long long pfn_read_start, pfn_read_end, index_pg;
>>  	unsigned char *page_cache = NULL, *pcache;
>>  	unsigned int _count;
>>  	unsigned long flags, mapping;
>> @@ -4156,6 +4157,12 @@ exclude_unnecessary_pages(void)
>>  		if (mem_map == NOT_MEMMAP_ADDR)
>>  			continue;
>>  
>> +		/*
>> +		 * Refresh the buffer of struct page, when changing mem_map.
>> +		 */
>> +		pfn_read_start = ULONGLONG_MAX;
>> +		pfn_read_end   = 0;
>> +
>>  		for (; pfn < mmd->pfn_end;
>>  		    pfn++, mem_map += SIZE(page),
>>  		    paddr += info->page_size) {
>> @@ -4166,16 +4173,23 @@ exclude_unnecessary_pages(void)
>>  			if (!is_in_segs(paddr))
>>  				continue;
>>  
>> -			if ((pfn % PGMM_CACHED) == 0) {
>> -				if (pfn + PGMM_CACHED < mmd->pfn_end)
>> -					pfn_mm = PGMM_CACHED;
>> +			index_pg = pfn % PGMM_CACHED;
>> +			if (pfn < pfn_read_start || pfn_read_end < pfn) {
>> +				if (roundup(pfn, PGMM_CACHED) < mmd->pfn_end)
>                                     ~~~~~~~~~~~~~~~~~~~~~~~~~ This is a bug.
> The above should be roundup(pfn + 1, PGMM_CACHED).
> 
> 
> Thanks
> Ken'ichi Ohmichi
> 
> ---
> diff -puN a/makedumpfile.c b/makedumpfile.c
> --- a/makedumpfile.c	2008-09-04 16:31:58.000000000 +0900
> +++ b/makedumpfile.c	2008-09-25 20:27:48.000000000 +0900
> @@ -4133,6 +4133,7 @@ exclude_unnecessary_pages(void)
>  	unsigned int mm;
>  	unsigned long mem_map;
>  	unsigned long long pfn, paddr, pfn_mm;
> +	unsigned long long pfn_read_start, pfn_read_end, index_pg;
>  	unsigned char *page_cache = NULL, *pcache;
>  	unsigned int _count;
>  	unsigned long flags, mapping;
> @@ -4156,6 +4157,12 @@ exclude_unnecessary_pages(void)
>  		if (mem_map == NOT_MEMMAP_ADDR)
>  			continue;
>  
> +		/*
> +		 * Refresh the buffer of struct page, when changing mem_map.
> +		 */
> +		pfn_read_start = ULONGLONG_MAX;
> +		pfn_read_end   = 0;
> +
>  		for (; pfn < mmd->pfn_end;
>  		    pfn++, mem_map += SIZE(page),
>  		    paddr += info->page_size) {
> @@ -4166,16 +4173,24 @@ exclude_unnecessary_pages(void)
>  			if (!is_in_segs(paddr))
>  				continue;
>  
> -			if ((pfn % PGMM_CACHED) == 0) {
> -				if (pfn + PGMM_CACHED < mmd->pfn_end)
> -					pfn_mm = PGMM_CACHED;
> +			index_pg = pfn % PGMM_CACHED;
> +			if (pfn < pfn_read_start || pfn_read_end < pfn) {
> +				if (roundup(pfn + 1, PGMM_CACHED) < mmd->pfn_end)
> +					pfn_mm = PGMM_CACHED - index_pg;
>  				else
>  					pfn_mm = mmd->pfn_end - pfn;
> -				if (!readmem(VADDR, mem_map, page_cache,
> -				    SIZE(page) * pfn_mm))
> +
> +				if (!readmem(VADDR, mem_map,
> +				    page_cache + (index_pg * SIZE(page)),
> +				    SIZE(page) * pfn_mm)) {
> +					ERRMSG("Can't read the buffer of struct page.\n");
>  					goto out;
> +				}
> +				pfn_read_start = pfn;
> +				pfn_read_end   = pfn + pfn_mm - 1;
>  			}
> -			pcache  = page_cache + ((pfn%PGMM_CACHED) * SIZE(page));
> +			pcache  = page_cache + (index_pg * SIZE(page));
> +
>  			flags   = ULONG(pcache + OFFSET(page.flags));
>  			_count  = UINT(pcache + OFFSET(page._count));
>  			mapping = ULONG(pcache + OFFSET(page.mapping));
> 




More information about the kexec mailing list