[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