[PATCH] makedumpfile: Enable --mem-usage for s390x

bhe at redhat.com bhe at redhat.com
Tue Oct 14 00:28:52 PDT 2014


On 10/14/14 at 07:19am, Atsushi Kumagai wrote:
> >> I think the Michael's first idea below is better since it implements
> >> is_real_addr() only for --mem-usage as a common function for all
> >> architectures, it's explicit design.
> >>
> >> >@@ -854,7 +854,7 @@ int get_kcore_dump_loads(void)
> >> >
> >> > 	for (i = 0; i < num_pt_loads; ++i) {
> >> > 		struct pt_load_segment *p = &pt_loads[i];
> >> >-		if (is_vmalloc_addr(p->virt_start))
> >> >+		if (!is_real_addr(p->virt_start))
> >> > 			continue;
> >> > 		loads++;
> >> > 	}
> >>
> >> However, this code will not work since the argument of is_real_addr()
> >> must be physical address. Even unluckily, /proc/kcore's PT_LOAD looks
> >> useless for VtoP converting because PhysAddr is always 0:
> >>
> >> Program Headers:
> >>   Type           Offset             VirtAddr           PhysAddr
> >>                  FileSiz            MemSiz              Flags  Align
> >>   NOTE           0x00000000000002a8 0x0000000000000000 0x0000000000000000
> >>                  0x0000000000000a84 0x0000000000000000         0
> >>   LOAD           0x00007fffff601000 0xffffffffff600000 0x0000000000000000
> >>                  0x0000000000001000 0x0000000000001000  RWE    1000
> >>   LOAD           0x00007fff81001000 0xffffffff81000000 0x0000000000000000
> >>                  0x0000000000a1b000 0x0000000000a1b000  RWE    1000
> >>   LOAD           0x0000490000001000 0xffffc90000000000 0x0000000000000000
> >>                  0x00001fffffffffff 0x00001fffffffffff  RWE    1000
> >>   LOAD           0x00007fffa0001000 0xffffffffa0000000 0x0000000000000000
> >>                  0x000000005f000000 0x000000005f000000  RWE    1000
> >>   ...
> >>
> >>
> >> So the way using /proc/iomem seems inappropriate, we have to consider other
> >> approaches (but I still don't have any good ideas...)
> >
> >Hello Atsushi,
> >
> >Hmmm ok, sure. For x86 using /proc/iomem does not work because there is no 1:1
> >mapping for the kernel address space. The kernel/real memory is mapped somewhere
> >at the end, right?
> 
> Exactly.
> 
> >For s390 we have a 1:1 mapping for the kernel physical memory that starts with
> >zero. Therefore IMHO we could use /proc/iomem. For example, on my s390x system
> >with 1GB memory and 256MB crashkernel:
> >
> >$ cat /proc/iomem
> >00000000-2fffffff : System RAM
> >  00000000-007ddd4b : Kernel code
> >  007ddd4c-00bfcc5f : Kernel data
> >  00e18000-01c28b1f : Kernel bss
> >30000000-3fffffff : Crash kernel
> >
> >$ objdump -h /proc/kcore
> >...
> >  Type           Offset             VirtAddr           PhysAddr
> >                 FileSiz            MemSiz              Flags  Align
> >  NOTE           0x0000000000000158 0x0000000000000000 0x0000000000000000
> >                 0x00000000000027fc 0x0000000000000000         0
> >  LOAD           0x000003e080003000 0x000003e080000000 0x0000000000000000
> >                 0x0000001f00000000 0x0000001f00000000  RWE    1000
> >  LOAD           0x000003ff80003000 0x000003ff80000000 0x0000000000000000
> >                 0x0000000080000000 0x0000000080000000  RWE    1000
> >  LOAD           0x0000000000003000 0x0000000000000000 0x0000000000000000
> >                 0x0000000030000000 0x0000000030000000  RWE    1000
> >  LOAD           0x000003d100003000 0x000003d100000000 0x0000000000000000
> >                 0x0000000000c00000 0x0000000000c00000  RWE    1000
> >
> >So in that case every /proc/kcore load that is below 0x30000000 must
> >be real memory.
> >
> >Michael
> 
> I understand why your patch works on s390x, so how about this way ?
> 
>  1. Define "is_phys_addr()" for --mem-usage.
>  2. Implement is_phys_addr() using is_iomem_phys_addr() for s390x
>     while x86_64 uses is_vmalloc_addr_x86_64().
>  3. Use is_phys_addr() instead of is_vmalloc_addr() in get_kcore_dump_loads().

Yeah, this is a working way. In fact I can change to use /proc/iomem to
get phys mem region, then filter each program loads of kcore by these
phys mem region. Since phys can be converted to virt by adding
PAGE_OFFSET, for x86_64 and s390x PAGE_OFFSET is specific. But I am not
sure if other ARCH have the same problem, e.g their PAGE_OFFSET is not a
fixed value just as VMALLOC_START in s390x.

Anyway, I think Atsushi's suggestion is good.

Thanks
Baoquan



More information about the kexec mailing list