Hi Mahesh, Thank you for the patch. I will review it. However I have never dumped 1 terabyte or more data using makedumpfile. Has anyone ever dumped it successfully? Thanks. tachibana On 2011/12/20 16:06:01 +0530, Mahesh J Salgaonkar <mahesh at linux.vnet.ibm.com> wrote: > Hi Tachibana, > > As part of the s390 patch to add support for > 4TB system memory (present in > linux-next tree), the newer s390 kernel will bump the MAX_PHYSMEM_BITS from > 42 to 46. Once that patch makes into umpstream kernel, this change will need > to go into makedumpfile. For now, I am posting this patch for a review. > > Reference: http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git;a=commit;h=8980036860565a6d2a4f95bb097927e832 fa3d1a > > Thanks, > -Mahesh. > > > 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 auto-detects 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> > --- > arch/s390x.c | 27 ++++++++++++++++++++++++++- > makedumpfile.h | 3 ++- > 2 files changed, 28 insertions(+), 2 deletions(-) > > diff --git a/arch/s390x.c b/arch/s390x.c > index 9237eaa..c73220a 100644 > --- a/arch/s390x.c > +++ b/arch/s390x.c > @@ -60,6 +60,28 @@ > #define pte_offset(x) (pte_index(x) * sizeof(unsigned long)) > > int > +set_s390x_max_physmem_bits(void) > +{ > + long array_len = ARRAY_LENGTH(mem_section); > + /* > + * The older s390x kernels uses _MAX_PHYSMEM_BITS as 42 and the > + * newer kernels uses 46 bits. > + */ > + > + info->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; > + > + info->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; > +} > + > +int > get_machdep_info_s390x(void) > { > unsigned long vmalloc_start; > @@ -70,7 +92,10 @@ get_machdep_info_s390x(void) > flag_ignore_r_char = 1; > > info->section_size_bits = _SECTION_SIZE_BITS; > - info->max_physmem_bits = _MAX_PHYSMEM_BITS; > + if (!set_s390x_max_physmem_bits()) { > + ERRMSG("Can't detect max_physmem_bits.\n"); > + return FALSE; > + } > info->page_offset = __PAGE_OFFSET; > > if (SYMBOL(_stext) == NOT_FOUND_SYMBOL) { > diff --git a/makedumpfile.h b/makedumpfile.h > index b3de521..a95d132 100644 > --- a/makedumpfile.h > +++ b/makedumpfile.h > @@ -531,7 +531,8 @@ do { \ > #define KERNELBASE (0) > #define KVBASE KERNELBASE > #define _SECTION_SIZE_BITS (28) > -#define _MAX_PHYSMEM_BITS (42) > +#define _MAX_PHYSMEM_BITS_OLD (42) > +#define _MAX_PHYSMEM_BITS_NEW (46) > > /* Bits in the segment/region table address-space-control-element */ > #define _ASCE_TYPE_MASK 0x0c >