Can't exclude unnecessary pages for 2.6.31 Kernel

CAI Qian caiqian at redhat.com
Fri Oct 2 08:42:19 EDT 2009


From: CAI Qian <caiqian at redhat.com>
Subject: Re: Can't exclude unnecessary pages for 2.6.31 Kernel
Date: Fri, 02 Oct 2009 19:26:44 +0800 (CST)

> Cced the crash utility maintainer.
> 
> BZ filed -- https://bugzilla.redhat.com/show_bug.cgi?id=526749
> 
>> It does make -d 16 works without errors. However, the crash utility
>> failed to read it (the log attached), but the full VMCore is working
>> fine there.
>> 
>> crash: page excluded: kernel virtual address: ffffffff819f1764 type:
>>        "tss_struct ist array"

Not sure if it is related, but kmem -z fails with the full VMCore.

crash> kmem -z

kmem: invalid (optional) structure member offsets: zone_pages_min or
      zone_struct_pages_min FILE: memory.c
      LINE: 12217 FUNCTION: dump_zone_stats()

[/usr/bin/crash] error trace: 44bb25 => 4701fc => 46efa6 => 4d4c57

  4d4c57: OFFSET_option+167
  46efa6: (undetermined)
  4701fc: cmd_kmem+3212
  44bb25: exec_command+613

kmem: invalid (optional) structure member offsets: zone_pages_min or
      zone_struct_pages_min
      FILE: memory.c LINE: 12217 FUNCTION: dump_zone_stats()

> 
> Thanks!
> CAI Qian
> 
> From: "Ken'ichi Ohmichi" <oomichi at mxs.nes.nec.co.jp>
> Subject: Re: Can't exclude unnecessary pages for 2.6.31 Kernel
> Date: Fri, 02 Oct 2009 09:16:50 +0900
> 
>> 
>> Hi CAI,
>> 
>> Thank you for testing and your report.
>> 
>> CAI Qian wrote:
>>> Met 2 issues with 2.6.31 kernel.
>>> 
>>> (1) makedumpfile needs to be updated to support 2.6.31 kernel. This looks like 
>>>     an easy fix. In makedumpfile.h,
>>> 
>>>     #define LATEST_VERSION          (0x0206001d)    /* linux-2.6.29 */
>> 
>> The next makedumpfile will support 2.6.31 kernel, and the above will be fixed.
>> 
>> 
>>> (2) makedumpfile -d 16 failed.
>>> 
>>> # makedumpfile -D -d 16
>>>   /var/crash/127.0.0.1-2009-10-01-06\:22\:33/vmcore vmcore
>>> 
>>> LOAD (0)
>>>   phys_start : 1000000
>>>   phys_end   : 2683000
>>>   virt_start : ffffffff81000000
>>>   virt_end   : ffffffff82683000
>>> LOAD (1)
>>>   phys_start : 0
>>>   phys_end   : a0000
>>>   virt_start : ffff810000000000
>>>   virt_end   : ffff8100000a0000
>>> LOAD (2)
>>>   phys_start : 100000
>>>   phys_end   : 3000000
>>>   virt_start : ffff810000100000
>>>   virt_end   : ffff810003000000
>>> LOAD (3)
>>>   phys_start : b000000
>>>   phys_end   : 3ff70000
>>>   virt_start : ffff81000b000000
>>>   virt_end   : ffff81003ff70000
>>> Linux kdump
>>> page_size    : 4096
>>> 
>>> max_mapnr    : 3ff70
>>> The kernel version is not supported.
>>> The created dumpfile may be incomplete.
>>> 
>>> num of NODEs : 1
>>> 
>>> 
>>> Memory type  : SPARSEMEM
>>> 
>>> mem_map (0)
>>>   mem_map    : ffff880002664000
>>>   pfn_start  : 0
>>>   pfn_end    : 8000
>>> mem_map (1)
>>>   mem_map    : 0
>>>   pfn_start  : 8000
>>>   pfn_end    : 10000
>>> mem_map (2)
>>>   mem_map    : 0
>>>   pfn_start  : 10000
>>>   pfn_end    : 18000
>>> mem_map (3)
>>>   mem_map    : 0
>>>   pfn_start  : 18000
>>>   pfn_end    : 20000
>>> mem_map (4)
>>>   mem_map    : 0
>>>   pfn_start  : 20000
>>>   pfn_end    : 28000
>>> mem_map (5)
>>>   mem_map    : 0
>>>   pfn_start  : 28000
>>>   pfn_end    : 30000
>>> mem_map (6)
>>>   mem_map    : 0
>>>   pfn_start  : 30000
>>>   pfn_end    : 38000
>>> mem_map (7)
>>>   mem_map    : 0
>>>   pfn_start  : 38000
>>>   pfn_end    : 3ff70
>>> Excluding unnecessary pages        : [100 %] page_to_pfn: Can't convert
>>> the address of page descriptor (ffffea000004e000) to pfn.
>>> 
>>> create_2nd_bitmap: Can't exclude unnecessary pages.
>>> 
>>> makedumpfile Failed.
>> 
>> The cause is that the virtual memory map of x86_64 has been changed to
>> the following since linux-2.6.31.
>> 
>>  15250 --- a/Documentation/x86/x86_64/mm.txt
>>  15251 +++ b/Documentation/x86/x86_64/mm.txt
>>  15252 @@ -6,10 +6,11 @@ Virtual memory map with 4 level page tables:
>>  15253  0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm
>>  15254  hole caused by [48:63] sign extension
>>  15255  ffff800000000000 - ffff80ffffffffff (=40 bits) guard hole
>>  15256 -ffff880000000000 - ffffc0ffffffffff (=57 TB) direct mapping of all phys. memory
>>  15257 -ffffc10000000000 - ffffc1ffffffffff (=40 bits) hole
>>  15258 -ffffc20000000000 - ffffe1ffffffffff (=45 bits) vmalloc/ioremap space
>>  15259 -ffffe20000000000 - ffffe2ffffffffff (=40 bits) virtual memory map (1TB)
>>  15260 +ffff880000000000 - ffffc7ffffffffff (=64 TB) direct mapping of all phys. memory
>>  15261 +ffffc80000000000 - ffffc8ffffffffff (=40 bits) hole
>>  15262 +ffffc90000000000 - ffffe8ffffffffff (=45 bits) vmalloc/ioremap space
>>  15263 +ffffe90000000000 - ffffe9ffffffffff (=40 bits) hole
>>  15264 +ffffea0000000000 - ffffeaffffffffff (=40 bits) virtual memory map (1TB)
>> 
>> I created the patch for catching this change.
>> Could you try the attached patch ?
>> 
>> 
>> Thanks
>> Ken'ichi Ohmichi
>> 
>> ---
>> [PATCH] Add x86_64 linux-2.6.31 support.
>> 
>> Virtual memory map of x86_64 has been changed to the following
>> since linux-2.6.31.
>> 
>>  15250 --- a/Documentation/x86/x86_64/mm.txt
>>  15251 +++ b/Documentation/x86/x86_64/mm.txt
>>  15252 @@ -6,10 +6,11 @@ Virtual memory map with 4 level page tables:
>>  15253  0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm
>>  15254  hole caused by [48:63] sign extension
>>  15255  ffff800000000000 - ffff80ffffffffff (=40 bits) guard hole
>>  15256 -ffff880000000000 - ffffc0ffffffffff (=57 TB) direct mapping of all phys. memory
>>  15257 -ffffc10000000000 - ffffc1ffffffffff (=40 bits) hole
>>  15258 -ffffc20000000000 - ffffe1ffffffffff (=45 bits) vmalloc/ioremap space
>>  15259 -ffffe20000000000 - ffffe2ffffffffff (=40 bits) virtual memory map (1TB)
>>  15260 +ffff880000000000 - ffffc7ffffffffff (=64 TB) direct mapping of all phys. memory
>>  15261 +ffffc80000000000 - ffffc8ffffffffff (=40 bits) hole
>>  15262 +ffffc90000000000 - ffffe8ffffffffff (=45 bits) vmalloc/ioremap space
>>  15263 +ffffe90000000000 - ffffe9ffffffffff (=40 bits) hole
>>  15264 +ffffea0000000000 - ffffeaffffffffff (=40 bits) virtual memory map (1TB)
>> 
>> This patch catches up this change.
>> 
>> 
>> Signed-off-by: Ken'ichi Ohmichi <oomichi at mxs.nes.nec.co.jp>
>> ---
>> diff -rpuN a/makedumpfile.h b/makedumpfile.h
>> --- a/makedumpfile.h	2009-04-20 15:26:23.000000000 +0900
>> +++ b/makedumpfile.h	2009-10-02 09:44:44.000000000 +0900
>> @@ -450,6 +450,7 @@ do { \
>>  #define LATEST_VERSION		(0x0206001d)	/* linux-2.6.29 */
>>  #define VERSION_LINUX_2_6_26	(0x0206001a)	/* linux-2.6.26 */
>>  #define VERSION_LINUX_2_6_27	(0x0206001b)	/* linux-2.6.27 */
>> +#define VERSION_LINUX_2_6_31	(0x0206001f)	/* linux-2.6.31 */
>>  
>>  /*
>>   * vmcoreinfo in /proc/vmcore
>> @@ -502,6 +503,10 @@ do { \
>>   * The value of dependence on machine
>>   */
>>  #define PAGE_OFFSET		(info->page_offset)
>> +#define VMALLOC_START		(info->vmalloc_start)
>> +#define VMALLOC_END		(info->vmalloc_end)
>> +#define VMEMMAP_START		(info->vmemmap_start)
>> +#define VMEMMAP_END		(info->vmemmap_end)
>>  
>>  #ifdef __x86__
>>  #define __PAGE_OFFSET		(0xc0000000)
>> @@ -535,12 +540,18 @@ do { \
>>  #endif /* x86 */
>>  
>>  #ifdef __x86_64__
>> -#define __PAGE_OFFSET_ORIG	(0xffff810000000000) /* linux-2.6.26, or former */
>> -#define __PAGE_OFFSET_2_6_27	(0xffff880000000000) /* linux-2.6.27, or later */
>> -#define VMALLOC_START		(0xffffc20000000000)
>> -#define VMALLOC_END		(0xffffe1ffffffffff)
>> -#define VMEMMAP_START		(0xffffe20000000000)
>> -#define VMEMMAP_END		(0xffffe2ffffffffff)
>> +#define __PAGE_OFFSET_ORIG	(0xffff810000000000) /* 2.6.26, or former */
>> +#define __PAGE_OFFSET_2_6_27	(0xffff880000000000) /* 2.6.27, or later  */
>> +
>> +#define VMALLOC_START_ORIG	(0xffffc20000000000) /* 2.6.30, or former */
>> +#define VMALLOC_START_2_6_31	(0xffffc90000000000) /* 2.6.31, or later  */
>> +#define VMALLOC_END_ORIG	(0xffffe1ffffffffff) /* 2.6.30, or former */
>> +#define VMALLOC_END_2_6_31	(0xffffe8ffffffffff) /* 2.6.31, or later  */
>> +
>> +#define VMEMMAP_START_ORIG	(0xffffe20000000000) /* 2.6.30, or former */
>> +#define VMEMMAP_START_2_6_31	(0xffffea0000000000) /* 2.6.31, or later  */
>> +#define VMEMMAP_END_ORIG	(0xffffe2ffffffffff) /* 2.6.30, or former */
>> +#define VMEMMAP_END_2_6_31	(0xffffeaffffffffff) /* 2.6.31, or later  */
>>  
>>  #define __START_KERNEL_map	(0xffffffff80000000)
>>  #define MODULES_VADDR		(0xffffffff88000000)
>> @@ -549,6 +560,7 @@ do { \
>>  #define _SECTION_SIZE_BITS	(27)
>>  #define _MAX_PHYSMEM_BITS_ORIG		(40)
>>  #define _MAX_PHYSMEM_BITS_2_6_26	(44)
>> +#define _MAX_PHYSMEM_BITS_2_6_31	(46)
>>  
>>  /*
>>   * 4 Levels paging
>> @@ -786,6 +798,9 @@ struct DumpInfo {
>>  	unsigned long	phys_base;
>>  	unsigned long   kernel_start;
>>  	unsigned long   vmalloc_start;
>> +	unsigned long   vmalloc_end;
>> +	unsigned long	vmemmap_start;
>> +	unsigned long	vmemmap_end;
>>  
>>  	/*
>>  	 * diskdimp info:
>> diff -rpuN a/x86_64.c b/x86_64.c
>> --- a/x86_64.c	2008-10-10 10:13:19.000000000 +0900
>> +++ b/x86_64.c	2009-10-02 09:45:39.000000000 +0900
>> @@ -70,14 +70,28 @@ get_versiondep_info_x86_64(void)
>>  	 */
>>  	if (info->kernel_version < VERSION_LINUX_2_6_26)
>>  		info->max_physmem_bits  = _MAX_PHYSMEM_BITS_ORIG;
>> -	else
>> +	else if (info->kernel_version < VERSION_LINUX_2_6_31)
>>  		info->max_physmem_bits  = _MAX_PHYSMEM_BITS_2_6_26;
>> +	else
>> +		info->max_physmem_bits  = _MAX_PHYSMEM_BITS_2_6_31;
>>  
>>  	if (info->kernel_version < VERSION_LINUX_2_6_27)
>>  		info->page_offset = __PAGE_OFFSET_ORIG;
>>  	else
>>  		info->page_offset = __PAGE_OFFSET_2_6_27;
>>  
>> +	if (info->kernel_version < VERSION_LINUX_2_6_31) {
>> +		info->vmalloc_start = VMALLOC_START_ORIG;
>> +		info->vmalloc_end   = VMALLOC_END_ORIG;
>> +		info->vmemmap_start = VMEMMAP_START_ORIG;
>> +		info->vmemmap_end   = VMEMMAP_END_ORIG;
>> +	} else {
>> +		info->vmalloc_start = VMALLOC_START_2_6_31;
>> +		info->vmalloc_end   = VMALLOC_END_2_6_31;
>> +		info->vmemmap_start = VMEMMAP_START_2_6_31;
>> +		info->vmemmap_end   = VMEMMAP_END_2_6_31;
>> +	}
>> +
>>  	return TRUE;
>>  }
>> 
>> 



More information about the kexec mailing list