[Crash-utility] [PATCH] CONFIG_SPARSEMEM for s390(x)

Michael Holzheu holzheu at linux.vnet.ibm.com
Fri Sep 5 13:00:49 UTC 2008


Hi Dave,

Am Donnerstag, den 04.09.2008, 11:19 -0400 schrieb Dave Anderson:

[snip]

> My guess is that it might have something to do with the zero-based kernel
> virtual address space on s390/s390x.
> 
> I also guess that the trail would have been:
> 
>   cmd_kmem
>    dump_memory_nodes
>     dump_mem_sections
>      section_mem_map_addr
>        read_mem_section
> 
> where read_mem_section() can legitimately return if the addr
> passed is not kernel virtual address of a mem_section structure:
> 
>    char *
>    read_mem_section(ulong addr)
>    {
>            if (!IS_KVADDR(addr))
>                    return 0;
> 
>            readmem(addr, KVADDR, vt->mem_section, SIZE(mem_section),
>                    "memory section", FAULT_ON_ERROR);
> 
>            return vt->mem_section;
>    }
> 
> But the s390/s390x implementation of IS_KVADDR() accepts a kernel
> virtual address of zero.  It tries to read it and craps out.
> 

Right. Looks like we should check for NULL pointer instead of using
IS_KVADDR(). Since the mem_sec array is static, it is initialized with
zeroes. When I change the check, everything works fine.

What about the following patch...

---
diff -Naurp crash-4.0-7.1/defs.h crash-4.0-7.1-sparse-mem-s390/defs.h
--- crash-4.0-7.1/defs.h	2008-08-19 17:10:51.000000000 +0200
+++ crash-4.0-7.1-sparse-mem-s390/defs.h	2008-09-04 18:24:10.000000000 +0200
@@ -2636,6 +2636,9 @@ struct efi_memory_desc_t {
 
 #define TIF_SIGPENDING (2)
 
+#define _SECTION_SIZE_BITS	25
+#define _MAX_PHYSMEM_BITS	31
+
 #endif  /* S390 */
 
 #ifdef S390X
@@ -2658,6 +2661,9 @@ struct efi_memory_desc_t {
 
 #define TIF_SIGPENDING (2)
 
+#define _SECTION_SIZE_BITS	28
+#define _MAX_PHYSMEM_BITS	42
+
 #endif  /* S390X */
 
 #ifdef PLATFORM
diff -Naurp crash-4.0-7.1/memory.c crash-4.0-7.1-sparse-mem-s390/memory.c
--- crash-4.0-7.1/memory.c	2008-08-19 17:10:51.000000000 +0200
+++ crash-4.0-7.1-sparse-mem-s390/memory.c	2008-09-05 14:48:10.000000000 +0200
@@ -12653,7 +12653,7 @@ sparse_mem_init(void)
 char *
 read_mem_section(ulong addr)
 {
-	if (!IS_KVADDR(addr))
+	if (addr == 0)
 		return 0;
 	
 	readmem(addr, KVADDR, vt->mem_section, SIZE(mem_section),
@@ -12668,7 +12668,7 @@ nr_to_section(ulong nr)
 	ulong addr;
 	ulong *mem_sec = vt->mem_sec;
 
-	if (!IS_KVADDR(mem_sec[SECTION_NR_TO_ROOT(nr)]))
+	if (mem_sec[SECTION_NR_TO_ROOT(nr)] == 0)
 		return 0;
 
 	if (IS_SPARSEMEM_EX())
diff -Naurp crash-4.0-7.1/s390.c crash-4.0-7.1-sparse-mem-s390/s390.c
--- crash-4.0-7.1/s390.c	2008-08-19 17:10:51.000000000 +0200
+++ crash-4.0-7.1-sparse-mem-s390/s390.c	2008-09-05 14:49:25.000000000 +0200
@@ -130,6 +130,8 @@ s390_init(int when)
 		machdep->dump_irq = s390_dump_irq;
 		if (!machdep->hz)
 			machdep->hz = HZ;
+		machdep->section_size_bits = _SECTION_SIZE_BITS;
+		machdep->max_physmem_bits = _MAX_PHYSMEM_BITS;
 		break;
 
 	case POST_INIT:
diff -Naurp crash-4.0-7.1/s390x.c crash-4.0-7.1-sparse-mem-s390/s390x.c
--- crash-4.0-7.1/s390x.c	2008-08-19 17:10:51.000000000 +0200
+++ crash-4.0-7.1-sparse-mem-s390/s390x.c	2008-09-04 18:24:24.000000000 +0200
@@ -128,6 +128,8 @@ s390x_init(int when)
 		machdep->dump_irq = s390x_dump_irq;
 		if (!machdep->hz)
 			machdep->hz = HZ;
+		machdep->section_size_bits = _SECTION_SIZE_BITS;
+		machdep->max_physmem_bits = _MAX_PHYSMEM_BITS;
 		break;
 
 	case POST_INIT:





More information about the Crash-utility mailing list