[Crash-utility] [PATCH] Crash-Utility: s390x: Auto-detect the correct MAX_PHYSMEM_BITS used in vmcore being analyzed.
Dave Anderson
anderson at redhat.com
Wed Dec 21 16:22:25 UTC 2011
----- Original Message -----
>
>
> ----- Original Message -----
> > From: Mahesh Salgaonkar <mahesh at linux.vnet.ibm.com>
> >
> > So far s390x kernel was using 42 bits for MAX_PHYSMEM_BITS that use to
> > support maximum of 4TB of memory. In order to support bigger systems,
> > the newer s390x kernel will now use 46 bits for MAX_PHYSMEM_BITS to support
> > maximum of 64TB of memory.
> >
> > This patch enhances crash utility to auto-detect the correct value to use
> > for MAX_PHYSMEM_BITS by examining the mem_section array size from the vmcore
> > being analyzed.
> >
> > Signed-off-by: Mahesh Salgaonkar <mahesh at linux.vnet.ibm.com>
> > ---
> > defs.h | 3 ++-
> > s390x.c | 26 +++++++++++++++++++++++++-
> > 2 files changed, 27 insertions(+), 2 deletions(-)
> >
> > diff --git a/defs.h b/defs.h
> > index 381e8c2..eb992d1 100755
> > --- a/defs.h
> > +++ b/defs.h
> > @@ -2954,7 +2954,8 @@ struct efi_memory_desc_t {
> > #define TIF_SIGPENDING (2)
> >
> > #define _SECTION_SIZE_BITS 28
> > -#define _MAX_PHYSMEM_BITS 42
> > +#define _MAX_PHYSMEM_BITS_OLD 42
> > +#define _MAX_PHYSMEM_BITS_NEW 46
> >
> > #endif /* S390X */
> >
> > diff --git a/s390x.c b/s390x.c
> > index 22e29a9..53bf272 100755
> > --- a/s390x.c
> > +++ b/s390x.c
> > @@ -282,6 +282,29 @@ static void s390x_process_elf_notes(void
> > *note_ptr, unsigned long size_note)
> > }
> > }
> >
> > +static int
> > +set_s390x_max_physmem_bits(void)
> > +{
> > + int array_len = get_array_length("mem_section", NULL, 0);
> > + /*
> > + * The older s390x kernels uses _MAX_PHYSMEM_BITS as 42 and the
> > + * newer kernels uses 46 bits.
> > + */
> > +
> > + STRUCT_SIZE_INIT(mem_section, "mem_section");
> > + machdep->max_physmem_bits = _MAX_PHYSMEM_BITS_OLD;
> > + if ((array_len == (NR_MEM_SECTIONS() / _SECTIONS_PER_ROOT_EXTREME()))
> > + || (array_len == (NR_MEM_SECTIONS() / _SECTIONS_PER_ROOT())))
> > + return TRUE;
> > +
> > + machdep->max_physmem_bits = _MAX_PHYSMEM_BITS_NEW;
> > + if ((array_len == (NR_MEM_SECTIONS() / _SECTIONS_PER_ROOT_EXTREME()))
> > + || (array_len == (NR_MEM_SECTIONS() / _SECTIONS_PER_ROOT())))
> > + return TRUE;
> > +
> > + return FALSE;
> > +}
> > +
> > /*
> > * Do all necessary machine-specific setup here. This is called several
> > * times during initialization.
> > @@ -350,7 +373,8 @@ s390x_init(int when)
> > if (!machdep->hz)
> > machdep->hz = HZ;
> > machdep->section_size_bits = _SECTION_SIZE_BITS;
> > - machdep->max_physmem_bits = _MAX_PHYSMEM_BITS;
> > + if (!set_s390x_max_physmem_bits())
> > + error(FATAL, "Can't detect max_physmem_bits.");
> > s390x_offsets_init();
> > break;
>
> This would seem to be a little extreme. If by chance CONFIG_SPARSEMEM
> is not configured, or for that matter, in old pre-sparsemem kernels,
> "mem_section" doesn't even exist as a symbol. So there should be an
> IS_SPARSEMEM() qualifier to prevent the FATAL session-ending error.
>
> I'm waiting for an s390x reservation as we speak, and I'll change
> (and test) the patch to do something like:
>
> if (IS_SPARSEMEM() && !set_s390x_max_physmem_bits())
> error(FATAL, ...
Actually that won't suffice, because the POST_GDB init call is done
before vm_init(). I'll add a new POST_VM case label to the s390x_init()
switch statement, and move the set_s390x_max_physmem_bits() call there.
Dave
More information about the Crash-utility
mailing list