From: CAI Qian <caiqian@xxxxxxxxxx> 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; >> } >> >>