[Crash-utility] kmem command problem (bug ofdump_mem_map_SPARSEMEM?)

Takao Indoh indou.takao at jp.fujitsu.com
Wed Feb 7 01:21:00 UTC 2007


On Tue, 06 Feb 2007 17:18:04 -0500, Dave Anderson wrote:

>Dave Anderson wrote:
>
>> Takao Indoh wrote:
>>
>> >
>> > However, page_to_phys returns 0x100000000. I think page_to_phys does not
>> > support sparsemem system.
>> >
>> >
>>
>> Yeah -- the is_page_ptr() function needs to be enhanced
>> to support SPARSEMEM kernels...
>>
>> I made a bunch of updates to the original SPARSEMEM patch
>> in 4.0-3.3, but missed this one.
>>
>> Dave
>
>In addition to the previous patch to dump_mem_map_SPARSEMEM(),
>this update to is_page_ptr() should do the trick:
>
>is_page_ptr(ulong addr, physaddr_t *phys)
>{
>        int n;
>        ulong ppstart, ppend;
>        struct node_table *nt;
>        ulong pgnum, node_size;
>+       ulong nr, sec_addr;
>+       ulong nr_mem_sections;
>+       ulong coded_mem_map, mem_map, end_mem_map;
>+       physaddr_t section_paddr;
>+
>+       if (IS_SPARSEMEM()) {
>+               nr_mem_sections = NR_MEM_SECTIONS();
>+               for (nr = 0; nr <= nr_mem_sections ; nr++) {
>+                       if ((sec_addr = valid_section_nr(nr))) {
>+                               coded_mem_map = section_mem_map_addr
>(sec_addr);
>+                               mem_map = sparse_decode_mem_map
>(coded_mem_map, nr);
>+                               end_mem_map = mem_map + (PAGES_PER_SECTION() 
>* SIZE(page));
>+
>+                               if ((addr >= mem_map) && (addr < 
>end_mem_map)) {
>+                                       if ((addr - mem_map) % SIZE(page))
>+                                               return FALSE;
>+                                       if (phys) {
>+                                               section_paddr = PTOB
>(section_nr_to_pfn(nr));
>+                                               pgnum = (addr - mem_map) / 
>SIZE(page);
>+                                               *phys = section_paddr + 
>(pgnum * PAGESIZE());
>+                                       }
>+                                       return TRUE;
>+                               }
>+                       }
>+               }
>+               return FALSE;
>+       }
>
>        for (n = 0; n < vt->numnodes; n++) {
>                nt = &vt->node_table[n];
>
>Thanks,
>  Dave

I applied this patch and confirmed this problem was fixed. Thanks!


crash> kmem -p e000000105090000
      PAGE        PHYSICAL      MAPPING       INDEX CNT FLAGS
e000000105090000 180000000      -------       -----   0 600200080000


Takao Indoh





More information about the Crash-utility mailing list