[PATCH] makedumpfile: s390x: Auto-detect the correct MAX_PHYSMEM_BITS used in vmcore being analyzed.
Mahesh J Salgaonkar
mahesh at linux.vnet.ibm.com
Tue Dec 20 05:36:01 EST 2011
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