makedumpfile fails on SGI machine

Ken'ichi Ohmichi oomichi at mxs.nes.nec.co.jp
Wed Aug 27 05:00:18 EDT 2008


Hi Bernhard,

Bernhard Walle wrote:
>>> * Ken'ichi Ohmichi [2008-08-05 21:07]:
>>>> BTW, I'd like to know some conditions of this problem.
>>>> So please let me know the makedumpfile commandline which you run.
>>>>  Ex. # makedumpfile -d 31 -x vmlinux /proc/vmcore dumpfile
>>>   # makedumpfile -d 3 -D vmcore.sles11 vmcore.sles11.filtered
>>>
>>>> I doubt that makedumpfile cannot distinguish the pgtable correctly.
>>>> I created the debugging patch. Please run makedumpfile-1.2.7 applied
>>>> with it by '-D' option, and report the output.
>>>> According to your kernel .config file, the output should contain
>>>> "PAGETABLE_4L : ON".
>>> See the attachment.
>> Thanks for the log.
>> makedumpfile can distinguish the pgtable correctly.
>>
>> Can the crash utility translate the virtual address 0xa0007fff8f900000
>> to physical address ? Please run the following subcommand on the crash
>> utility.
>>
>> crash> vtop 0xa0007fff8f900000
> 
> crash> vtop 0xa0007fff8f900000  
> VIRTUAL           PHYSICAL        
> a0007fff8f900000  (not mapped)
> 
> PAGE DIRECTORY: a000000100914000
>    PGD: a000000100914000 => 30030bc000
>    PUD: e0000030030bfff8 => 30030c0000
>    PMD: e0000030030c3e38 => 30030c4000
>    PTE: e0000030030c7200 => 0
> 
> 
> But I guess that's normal with virtual memory maps:
> 
> $ zgrep VIRTUAL_M /proc/config.gz 
> CONFIG_VIRTUAL_MEM_MAP=y

Thank you for your help.

I found an ia64 discontigmem kernel problem that the 'pgdat_list.node_mem_map'
has an unexpected value, and I created the attached patch for avoiding the
problem. If applying this patch, makedumpfile takes mem_map's information
from a symbol 'vmem_map' instead of 'pgdat_list.node_mem_map'.
It is for makedumpfile-1.2.8.  Could you please test it ?

Note:
 This solution needs a symbol 'vmem_map', but vmcoreinfo data in /proc/vmcore
 does not contain it. So "-x" option is necessary for running makedumpfile
 like the following.

 # makedumpfile -c -d31 -x vmlinux /proc/vmcore dumpfile


Thanks
Ken'ichi Ohmichi

diff -puN backup/v1.2.8/makedumpfile.c makedumpfile/makedumpfile.c
--- backup/v1.2.8/makedumpfile.c	2008-08-12 12:17:24.000000000 +0900
+++ makedumpfile/makedumpfile.c	2008-08-28 02:07:47.000000000 +0900
@@ -1819,6 +1819,7 @@ get_symbol_info()
 	 * Get symbol info.
 	 */
 	SYMBOL_INIT(mem_map, "mem_map");
+	SYMBOL_INIT(vmem_map, "vmem_map");
 	SYMBOL_INIT(mem_section, "mem_section");
 	SYMBOL_INIT(pkmap_count, "pkmap_count");
 	SYMBOL_INIT_NEXT(pkmap_count_next, "pkmap_count");
@@ -2110,6 +2111,7 @@ generate_vmcoreinfo()
 	 * write the symbol of 1st kernel
 	 */
 	WRITE_SYMBOL("mem_map", mem_map);
+	WRITE_SYMBOL("vmem_map", vmem_map);
 	WRITE_SYMBOL("mem_section", mem_section);
 	WRITE_SYMBOL("pkmap_count", pkmap_count);
 	WRITE_SYMBOL("pkmap_count_next", pkmap_count_next);
@@ -2350,6 +2352,7 @@ read_vmcoreinfo()
 		return FALSE;
 
 	READ_SYMBOL("mem_map", mem_map);
+	READ_SYMBOL("vmem_map", vmem_map);
 	READ_SYMBOL("mem_section", mem_section);
 	READ_SYMBOL("pkmap_count", pkmap_count);
 	READ_SYMBOL("pkmap_count_next", pkmap_count_next);
@@ -2912,6 +2915,7 @@ get_mm_discontigmem()
 {
 	int i, j, id_mm, node, num_mem_map, separate_mm = FALSE;
 	unsigned long pgdat, mem_map, pfn_start, pfn_end, node_spanned_pages;
+	unsigned long vmem_map;
 	struct mem_map_data temp_mmd;
 
 	num_mem_map = get_num_mm_discontigmem();
@@ -2924,6 +2928,13 @@ get_mm_discontigmem()
 		separate_mm = TRUE;
 	}
 
+	if (SYMBOL(vmem_map) != NOT_FOUND_SYMBOL) {
+		if (!readmem(VADDR, SYMBOL(vmem_map), &vmem_map, sizeof vmem_map)) {
+			ERRMSG("Can't get vmem_map.\n");
+			return FALSE;
+		}
+	}
+
 	/*
 	 * Get the first node_id.
 	 */
@@ -2937,11 +2948,6 @@ get_mm_discontigmem()
 	}
 	id_mm = 0;
 	for (i = 0; i < vt.numnodes; i++) {
-		if (!readmem(VADDR, pgdat + OFFSET(pglist_data.node_mem_map),
-		    &mem_map, sizeof mem_map)) {
-			ERRMSG("Can't get mem_map.\n");
-			return FALSE;
-		}
 		if (!readmem(VADDR, pgdat + OFFSET(pglist_data.node_start_pfn),
 		    &pfn_start, sizeof pfn_start)) {
 			ERRMSG("Can't get node_start_pfn.\n");
@@ -2954,6 +2960,15 @@ get_mm_discontigmem()
 		}
 		pfn_end = pfn_start + node_spanned_pages;
 
+		if (SYMBOL(vmem_map) == NOT_FOUND_SYMBOL) {
+			if (!readmem(VADDR, pgdat + OFFSET(pglist_data.node_mem_map),
+			    &mem_map, sizeof mem_map)) {
+				ERRMSG("Can't get mem_map.\n");
+				return FALSE;
+			}
+		} else
+			mem_map = vmem_map + SIZE(page) * pfn_start;
+
 		if (separate_mm) {
 			/*
 			 * For some ia64 NUMA systems.
diff -puN backup/v1.2.8/makedumpfile.h makedumpfile/makedumpfile.h
--- backup/v1.2.8/makedumpfile.h	2008-08-12 12:17:24.000000000 +0900
+++ makedumpfile/makedumpfile.h	2008-08-28 02:06:40.000000000 +0900
@@ -814,6 +814,7 @@ extern struct vm_table		vt;
 
 struct symbol_table {
 	unsigned long long	mem_map;
+	unsigned long long	vmem_map;
 	unsigned long long	mem_section;
 	unsigned long long	pkmap_count;
 	unsigned long long	pkmap_count_next;



More information about the kexec mailing list