makedumpfile: question about memory hole

Atsushi Kumagai kumagai-atsushi at mxc.nes.nec.co.jp
Mon Mar 18 21:41:37 EDT 2013


Hello HATAYAMA-san,

On Fri, 15 Mar 2013 09:31:46 +0900 (JST)
HATAYAMA Daisuke <d.hatayama at jp.fujitsu.com> wrote:

> Hello Kumagai-san,
> 
> I have a question about memory hole.
> 
> For example, create_1st_bitmap() calculates memory holes in the part
> below:
> 
> int
> create_1st_bitmap(void)
> {
> ...
>         /*
>          * If page is on memory hole, set bit on the 1st-bitmap.
>          */
>         pfn_bitmap1 = 0;
>         for (i = 0; get_pt_load(i, &phys_start, &phys_end, NULL, NULL); i++) {
> 
>                 print_progress(PROGRESS_HOLES, i, num_pt_loads);
> 
>                 pfn_start = paddr_to_pfn(phys_start);
>                 pfn_end   = paddr_to_pfn(phys_end);
> 
>                 if (!is_in_segs(pfn_to_paddr(pfn_start)))
>                         pfn_start++;
>                 for (pfn = pfn_start; pfn < pfn_end; pfn++) {
>                         set_bit_on_1st_bitmap(pfn);
>                         pfn_bitmap1++;
>                 }
>         }
>         pfn_memhole = info->max_mapnr - pfn_bitmap1;
> 
> What I don't understand well is that the part here:
> 
>                 pfn_start = paddr_to_pfn(phys_start);
>                 pfn_end   = paddr_to_pfn(phys_end);
> 
>                 if (!is_in_segs(pfn_to_paddr(pfn_start)))
>                         pfn_start++;
> 
> phys_start and pfn_to_paddr(pfn_start) should belong to the same page
> frame, so I suspect the pfn_start should be included in vmcore.
> 
> Looking into kexec-tool side, I don't see additional modification made
> to phys_start after it's parsed from /proc/iomem or counterpart on EFI
> interface. Is there any assumption about memory holes behind kernel?

Here is a PT_LOAD segment of ia64 machine which I actually use:

  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
[...]
  LOAD           0x000000015fd0b490 0xe0000040ffda5000 0x00000040ffda5000
                 0x000000000005a000 0x000000000005a000  RWE    0

In this case, pfn_to_paddr(pfn_start) is aligned to 0x40ffda4000 
because the page size is 16KiB, and this address is out of PT_LOAD
segment.

         phys_start
         = 0x40ffda5000                        
            |------------- PT_LOAD ----------------
     ----+----------+----------+----------+--------
         |   pfn:N  |  pfn:N+1 | pfn:N+2  |  ...
     ----+----------+----------+----------+--------
         |
   pfn_to_paddr(pfn:N)
   = 0x40ffda4000

The statement you said is for care the case that phys_start isn't aligned
with the page size.

BTW, I'll add a comment to explain this intention into here.


Thanks
Atsushi Kumagai



More information about the kexec mailing list