Re: [PATCH] kexec memory ranges dynamic allocation
From: Maxim Uvarov <hidden>
Date: 2008-11-01 08:43:17
Also in:
kexec
2008/11/1 Simon Horman [off-list ref]
On Fri, Oct 31, 2008 at 09:53:23AM +0300, Maxim Uvarov wrote:quoted
2008/10/31 Simon Horman [off-list ref]quoted
Hi, Could someone please comment on the satus of this patch?Hello, Simon I can not reproduce error which you wrote before on my target. So it isaquoted
little bit difficult to say what was wrong exactly.Hi, the version of the patch below (which I think is the latest) compiles fine for me. I wanted to confirm that you and Chandru are happy for it to be merged. If so, could you please provide a short descripton for the change-log and a Signed-off-by line.
Patch looks good. Description is: Do not count max_memory_range for allocation. Increase allocation buffers when it is needed. This actually allows us to avoid a lot of troubles with various device-tree files. Signed-off-by: Maxim Uvarov <redacted>
Thanksquoted
quoted
On Wed, Oct 15, 2008 at 12:46:24PM +0400, Maxim Uvarov wrote:quoted
Patch corrected. ( git_kexec_powerpc_v2.patch is attached.) I tested it on ppc64 pasemi electra board. Both kexec -l and kexec -pworks.quoted
Maxim.quoted
diff --git a/kexec/arch/ppc64/kexec-ppc64.cb/kexec/arch/ppc64/kexec-ppc64.cquoted
index 069a9fc..0ad40fa 100644--- a/kexec/arch/ppc64/kexec-ppc64.c +++ b/kexec/arch/ppc64/kexec-ppc64.c@@ -96,96 +96,46 @@ err1: } -static int count_dyn_reconf_memory_ranges(void) +static int realloc_memory_ranges() { - char device_tree[] = "/proc/device-tree/"; - char fname[128]; - char buf[32]; - FILE *file; - - strcpy(fname, device_tree); - strcat(fname,"ibm,dynamic-reconfiguration-memory/ibm,lmb-size");quoted
quoted
quoted
- if ((file = fopen(fname, "r")) == NULL) { - perror(fname); - return -1; - } + size_t memory_range_len; - if (fread(buf, 1, 8, file) < 0) { - perror(fname); - fclose(file); - return -1; - } - - lmb_size = ((uint64_t *)buf)[0]; - fclose(file); + max_memory_ranges++; + memory_range_len = sizeof(struct memory_range) *max_memory_ranges;quoted
quoted
quoted
- /* Get number of lmbs from ibm,dynamic-memory */ - strcpy(fname, device_tree); - strcat(fname,"ibm,dynamic-reconfiguration-memory/ibm,dynamic-memory");quoted
- if ((file = fopen(fname, "r")) == NULL) { - perror(fname); - return -1; - } - /* - * first 4 bytes provide number of entries(lmbs) - */ - if (fread(buf, 1, 4, file) < 0) { - perror(fname); - fclose(file); - return -1; - } - num_of_lmbs = ((unsigned int *)buf)[0]; - max_memory_ranges += num_of_lmbs; - fclose(file); + memory_range = (struct memory_range *) realloc(memory_range,memory_range_len);quoted
+ if (!memory_range) + goto err; - return 0; -} + base_memory_range = (struct memory_range *)realloc(memory_range,quoted
quoted
memory_range_len);quoted
+ if (!base_memory_range) + goto err; -/* - * Count the memory nodes under /proc/device-tree and populate the - * max_memory_ranges variable. This variable replacesMAX_MEMORY_RANGESquoted
quoted
quoted
- * macro used earlier. - */ -static int count_memory_ranges(void) -{ - char device_tree[256] = "/proc/device-tree/"; - struct dirent *dentry; - DIR *dir; + exclude_range = (struct memory_range *) realloc(exclude_range,memory_range_len);quoted
+ if (!exclude_range) + goto err; - if ((dir = opendir(device_tree)) == NULL) { - perror(device_tree); - return -1; - } + usablemem_rgns.ranges = (struct memory_range *) + realloc(usablemem_rgns.ranges,memory_range_len);quoted
+ if (!(usablemem_rgns.ranges)) + goto err; - while ((dentry = readdir(dir)) != NULL) { - if (!strncmp(dentry->d_name, - "ibm,dynamic-reconfiguration-memory",35)){quoted
quoted
quoted
- if (count_dyn_reconf_memory_ranges() != 0) - return -1; - continue; - } + return 0; - if (strncmp(dentry->d_name, "memory@", 7) && - strcmp(dentry->d_name, "memory") && - strncmp(dentry->d_name, "pci@", 4)) - continue; - max_memory_ranges++; - } - /* need to add extra region for retained initrd */ - if (reuse_initrd) { - max_memory_ranges++; - } +err: + fprintf(stderr, "memory range structure re-allocationfailure\n");quoted
quoted
quoted
+ return -1; +} - closedir(dir); - return 0; -} static void add_base_memory_range(uint64_t start, uint64_t end) { base_memory_range[nr_memory_ranges].start = start; base_memory_range[nr_memory_ranges].end = end; base_memory_range[nr_memory_ranges].type = RANGE_RAM; nr_memory_ranges++; + if (nr_memory_ranges >= max_memory_ranges) + realloc_memory_ranges(); dbgprintf("%016llx-%016llx : %x\n", base_memory_range[nr_memory_ranges-1].start,@@ -300,8 +250,8 @@ static int get_base_ranges(void) return -1; } if (nr_memory_ranges >= max_memory_ranges) { - fclose(file); - break; + if (realloc_memory_ranges() < 0) + break; } start = ((uint64_t *)buf)[0]; end = start + ((uint64_t *)buf)[1];@@ -396,6 +346,8 @@ static int get_devtree_details(unsigned longkexec_flags)quoted
exclude_range[i].start = 0x0UL; exclude_range[i].end = kernel_end; i++; + if (i >= max_memory_ranges) + realloc_memory_ranges(); if (kexec_flags & KEXEC_ON_CRASH) { memset(fname, 0, sizeof(fname));@@ -470,6 +422,8 @@ static int get_devtree_details(unsigned longkexec_flags)quoted
exclude_range[i].start = htab_base; exclude_range[i].end = htab_base + htab_size; i++; + if (i >= max_memory_ranges) + realloc_memory_ranges(); /* reserve the initrd_start and end locations.*/quoted
quoted
quoted
if (reuse_initrd) {@@ -545,6 +499,8 @@ static int get_devtree_details(unsigned longkexec_flags)quoted
exclude_range[i].start = rtas_base; exclude_range[i].end = rtas_base + rtas_size; i++; + if (i >= max_memory_ranges) + realloc_memory_ranges(); if (kexec_flags & KEXEC_ON_CRASH) add_usable_mem_rgns(rtas_base,rtas_size);quoted
quoted
quoted
} /* rtas */@@ -740,9 +696,10 @@ out: /* Return a list of valid memory ranges */ int get_memory_ranges(struct memory_range **range, int *ranges, unsigned long kexec_flags) -{ - if (count_memory_ranges()) - return -1; +{ + /* allocate memory_range dynamically */ + max_memory_ranges = 1; + if (alloc_memory_ranges()) return -1; if (setup_memory_ranges(kexec_flags))-- Simon Horman VA Linux Systems Japan K.K., Sydney, Australia Satellite Office H: www.vergenet.net/~horms/ <http://www.vergenet.net/%7Ehorms/> <http://www.vergenet.net/%7Ehorms/>quoted
quoted
W: www.valinux.co.jp/en-- Best regards, Maxim Uvarov-- Simon Horman VA Linux Systems Japan K.K., Sydney, Australia Satellite Office H: www.vergenet.net/~horms/ <http://www.vergenet.net/%7Ehorms/> W: www.valinux.co.jp/en
-- Best regards, Maxim Uvarov