[PATCH] kexec/kdump: RMO region does not exist in drconf memory
Chandru
chandru at in.ibm.com
Tue Mar 2 05:39:49 EST 2010
The RMO region can only exist in '/memory at 0' node in the device tree.
While adding support for '/ibm,dynamic-reconfiguration-memory' in
kexec-tools, I incorrectly extended the code of '/memory@' nodes to
drconf memory with the assumption that what applies to '/memory@'
nodes would also apply to drconf memory. This is incorrect and
hence removing the code from kexec-tools now.
With this code in place, kexec on kexec fails. The first kexec
works because '/memory at 0' node is read after drconf memory and
that correctly sets rmo_base and rmo_top from '/memory at 0' node.
While in the kexec'ed kernel, '/ibm,dynamic-reconfiguration-memory'
is read after '/memory at xxx' nodes and this incorrectly sets both
rmo_base and rmo_top from drconf memory.
Sorry for introducing this bug.
Signed-off-by: Chandru Siddalingappa <chandru at linux.vnet.ibm.com>
---
--- kexec-tools/kexec/arch/ppc64/kexec-ppc64.c.orig 2010-03-02 08:11:16.000000000 +0000
+++ kexec-tools/kexec/arch/ppc64/kexec-ppc64.c 2010-03-02 08:13:37.000000000 +0000
@@ -342,9 +342,7 @@ static int get_devtree_details(unsigned
strncmp(dentry->d_name, "memory@", 7) &&
strcmp(dentry->d_name, "memory") &&
strncmp(dentry->d_name, "pci@", 4) &&
- strncmp(dentry->d_name, "rtas", 4) &&
- strncmp(dentry->d_name,
- "ibm,dynamic-reconfiguration-memory", 35))
+ strncmp(dentry->d_name, "rtas", 4))
continue;
strcpy(fname, device_tree);
strcat(fname, dentry->d_name);
@@ -550,29 +548,6 @@ static int get_devtree_details(unsigned
closedir(cdir);
} /* memory */
- if (!strncmp(dentry->d_name,
- "ibm,dynamic-reconfiguration-memory", 35)) {
- unsigned int k;
- strcat(fname, "/ibm,dynamic-memory");
- if ((file = fopen(fname, "r")) == NULL) {
- perror(fname);
- goto error_opencdir;
- }
- fseek(file, 4, SEEK_SET);
- for (k = 0; k < num_of_lmbs; k++) {
- if ((n = fread(buf, 1, 24, file)) < 0) {
- perror(fname);
- goto error_openfile;
- }
- rmo_base = ((uint64_t *)buf)[0];
- rmo_top = rmo_base + lmb_size;
- if (rmo_top > 0x30000000UL)
- rmo_top = 0x30000000UL;
- }
- fclose(file);
- closedir(cdir);
- } /* ibm,dynamic-reconfiguration-memory */
-
if (strncmp(dentry->d_name, "pci@", 4) == 0) {
strcat(fname, "/linux,tce-base");
if ((file = fopen(fname, "r")) == NULL) {
More information about the kexec
mailing list