----- Original Message -----
> Hi Dave,
>
> On Thu, 2011-12-22 at 09:19 -0500, Dave Anderson wrote:
> >
> > ----- Original Message -----
> > >
> > > Unfortunately Mahesh is currently not online. We still have some time
> > > because Martin's kernel patch that introduces the change will go into
> > > Linux version 3.3.
> > >
> > > So perhaps you make your crash release without this patch.
> > >
> > > Michael
> >
> > Tell you what -- I'm going to make a hybrid patch, using Mahesh's
> > more understandable-yet-longer function, but with your verify_pfn()
> > and STRUCT_SIZE_INIT("mem_section") movement, along with a default
> > setting of 42 and a non-fatal WARNING message if things fail.
> > I'll verify it on RHEL5 and RHEL6.
> >
> > If you want to change it later, that will be fine, too.
>
> Ok, I will have a look at your next crash release in the new year.
>
> Thanks!
>
> Michael
I've attached what I'm going with -- freshly tested on RHEL5 and RHEL6.
And interestingly enough -- even RHEL5 is still FLATMEM.
Thanks guys,
Dave
--- defs.h 15 Dec 2011 20:26:11 -0000 1.490
+++ defs.h 21 Dec 2011 15:50:00 -0000
@@ -2969,7 +2969,8 @@
#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 */
--- kernel.c 17 Dec 2011 15:52:30 -0000 1.265
+++ kernel.c 22 Dec 2011 14:23:06 -0000
@@ -579,6 +579,8 @@
kt->flags |= ARCH_OPENVZ;
}
+ STRUCT_SIZE_INIT(mem_section, "mem_section");
+
BUG_bytes_init();
kt->flags &= ~PRE_KERNEL_INIT;
--- memory.c 16 Nov 2011 21:08:16 -0000 1.261
+++ memory.c 22 Dec 2011 14:26:20 -0000
@@ -13601,7 +13601,7 @@
for (i = machdep->max_physmem_bits; i < machdep->bits; i++)
mask |= ((physaddr_t)1 << i);
- if (mask & BTOP(pfn))
+ if (mask & PTOB(pfn))
return FALSE;
return TRUE;
@@ -14203,7 +14203,6 @@
MEMBER_OFFSET_INIT(mem_section_section_mem_map, "mem_section",
"section_mem_map");
- STRUCT_SIZE_INIT(mem_section, "mem_section");
if (!MAX_PHYSMEM_BITS())
error(FATAL,
--- s390x.c 10 Nov 2011 14:37:15 -0000 1.57
+++ s390x.c 22 Dec 2011 14:39:46 -0000
@@ -114,6 +114,7 @@
static struct line_number_hook s390x_line_number_hooks[];
static int s390x_is_uvaddr(ulong, struct task_context *);
static int s390x_get_kvaddr_ranges(struct vaddr_range *);
+static int set_s390x_max_physmem_bits(void);
/*
* Read a unsigned long value from address
@@ -150,6 +151,51 @@
}
}
+/*
+ * MAX_PHYSMEM_BITS is 42 on older kernels, and 46 on newer kernels.
+ */
+static int
+set_s390x_max_physmem_bits(void)
+{
+ int array_len, dimension;
+
+ machdep->max_physmem_bits = _MAX_PHYSMEM_BITS_OLD;
+
+ if (!kernel_symbol_exists("mem_section"))
+ return TRUE;
+
+ if (!(array_len = get_array_length("mem_section", &dimension, 0)))
+ return FALSE;
+
+ /*
+ * !CONFIG_SPARSEMEM_EXTREME
+ */
+ if (dimension) {
+ machdep->max_physmem_bits = _MAX_PHYSMEM_BITS_OLD;
+ if (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()))
+ return TRUE;
+
+ return FALSE;
+ }
+
+ /*
+ * CONFIG_SPARSEMEM_EXTREME
+ */
+ machdep->max_physmem_bits = _MAX_PHYSMEM_BITS_OLD;
+ if (array_len == (NR_MEM_SECTIONS() / _SECTIONS_PER_ROOT_EXTREME()))
+ return TRUE;
+
+ machdep->max_physmem_bits = _MAX_PHYSMEM_BITS_NEW;
+ if (array_len == (NR_MEM_SECTIONS() / _SECTIONS_PER_ROOT_EXTREME()))
+ return TRUE;
+
+ return FALSE;
+}
+
static struct s390x_cpu *s390x_cpu_vec;
static int s390x_cpu_cnt;
/*
@@ -350,7 +396,8 @@
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(WARNING, "cannot determine MAX_PHYSMEM_BITS\n");
s390x_offsets_init();
break;
_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec