[PATCH] makedumpfile: s390x: Auto-detect the correct MAX_PHYSMEM_BITS used in vmcore being analyzed.

Michael Holzheu holzheu at linux.vnet.ibm.com
Tue Dec 20 08:21:31 EST 2011


Hello,

The s390 kernel patch is queued for the next merge window therefore will
go upstream. My recommendation is to include the makedumpfile patch
already now if it passes the review.

Best Regards

Michael

On Tue, 2011-12-20 at 16:06 +0530, Mahesh J Salgaonkar 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=8980036860565a6d2a4f95bb097927e832fa3d1a
> 
> 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
> 





More information about the kexec mailing list