Hi Nishimura-san, Thank you for the patch. Daisuke Nishimura wrote: > In !SPARSEMEM_EX case, the symbol mem_section points a array of struct mem_section, > doesn't point a array of pointer to mem_section[], so I think the check: > > if (!is_kvaddr(mem_sec[SECTION_NR_TO_ROOT(nr)])) > return NOT_KV_ADDR; > > in nr_to_section() is not a valid check in this case. > > To make the matters worse, if CONFIG_CGROUP_MEM_RES_CTLR is enabled, the end of > struct mem_section is padded with 0. > > So, reading mem_section by "rd" of crash will look like: > > crash> rd mem_section 128 > c08b71e0: c9002003 c9001200 f7000000 00000000 . .............. > c08b71f0: c9002003 c9001260 f6980000 00000000 . ..`........... > c08b7200: c9002003 c90012c0 f6300000 00000000 . ........0..... > c08b7210: c9002003 c9001320 f5c80000 00000000 . .. ........... > ... I see. In !SPARSEMEM_EX case, nr_to_section() checked invalid area (pageblock_flags, page_cgroup, and pad) as section_mem_map. linux-2.6.33/include/linux/mmzone.h: struct mem_section { unsigned long section_mem_map; unsigned long *pageblock_flags; #ifdef CONFIG_CGROUP_MEM_RES_CTLR struct page_cgroup *page_cgroup; unsigned long pad; #endif }; > This means nr_to_section() will return 0 when "nr" is 3,7,11,... because it meets > the condition(mem_sec[SECTION_NR_TO_ROOT(nr)] == mem_sec[nr] == 0 == !is_kvaddr). > > As a result, mem_map for section 3,7,11,... cannot be handled properly. > > This patch is a fix for this problem. nr_to_section() will check "addr" by > is_kvaddr() later anyway, so this patch just removes the problematic check. > > Signed-off-by: Masayuki Igawa <igawa at mxs.nes.nec.co.jp> > Signed-off-by: Daisuke Nishimura <nishimura at mxp.nes.nec.co.jp> > --- > diff --git a/makedumpfile.c b/makedumpfile.c > index 855c718..73fa94f 100644 > --- a/makedumpfile.c > +++ b/makedumpfile.c > @@ -3547,9 +3547,6 @@ nr_to_section(unsigned long nr, unsigned long *mem_sec) > { > unsigned long addr; > > - if (!is_kvaddr(mem_sec[SECTION_NR_TO_ROOT(nr)])) > - return NOT_KV_ADDR; > - > if (is_sparsemem_extreme()) > addr = mem_sec[SECTION_NR_TO_ROOT(nr)] + > (nr & SECTION_ROOT_MASK()) * SIZE(mem_section); The patch is good, and it has been merged to git tree of makedumpfile: http://makedumpfile.git.sourceforge.net/git/gitweb.cgi?p=makedumpfile/makedumpfile;a=commit;h=27b71566ec11128c5b061a350e467546f2d26be6 Thanks Ken'ichi Ohmichi