* [PATCH] kexec memory ranges dynamic allocation @ 2008-10-14 15:11 Maxim Uvarov 2008-10-15 3:18 ` Simon Horman 2008-10-17 16:12 ` Chandru 0 siblings, 2 replies; 10+ messages in thread From: Maxim Uvarov @ 2008-10-14 15:11 UTC (permalink / raw) To: kexec; +Cc: horms [-- Attachment #1.1: Type: text/plain, Size: 282 bytes --] Hello all, As you all know it is not easy to count exact value of memory ranges from device tree on powerpc. It very depends on how dts file was written. What do you think about really dynamic allocation buffers for this buffers? Patch is attached. -- Best regards, Maxim Uvarov [-- Attachment #1.2: Type: text/html, Size: 346 bytes --] [-- Attachment #2: git_kexec_powerpc.patch --] [-- Type: application/octet-stream, Size: 4923 bytes --] diff --git a/kexec/arch/ppc64/kexec-ppc64.c b/kexec/arch/ppc64/kexec-ppc64.c index 069a9fc..5dd5dd2 100644 --- a/kexec/arch/ppc64/kexec-ppc64.c +++ b/kexec/arch/ppc64/kexec-ppc64.c @@ -96,96 +96,47 @@ 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"); - if ((file = fopen(fname, "r")) == NULL) { - perror(fname); - return -1; - } + size_t memory_range_len; + struct memory_range *tmp; - 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; - /* Get number of lmbs from ibm,dynamic-memory */ - strcpy(fname, device_tree); - strcat(fname, "ibm,dynamic-reconfiguration-memory/ibm,dynamic-memory"); - 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_len); + if (!memory_range) + goto err; - return 0; -} + base_memory_range = (struct memory_range *) realloc(memory_range, memory_range_len); + if (!base_memory_range) + goto err; -/* - * Count the memory nodes under /proc/device-tree and populate the - * max_memory_ranges variable. This variable replaces MAX_MEMORY_RANGES - * 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); + 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); + if (!(usablemem_rgns.ranges)) + goto err; - while ((dentry = readdir(dir)) != NULL) { - if (!strncmp(dentry->d_name, - "ibm,dynamic-reconfiguration-memory", 35)){ - 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-allocation failure\n"); + 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 +251,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 +347,8 @@ static int get_devtree_details(unsigned long kexec_flags) 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 +423,8 @@ static int get_devtree_details(unsigned long kexec_flags) 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. */ if (reuse_initrd) { @@ -545,6 +500,8 @@ static int get_devtree_details(unsigned long kexec_flags) 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); } /* rtas */ @@ -740,9 +697,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)) [-- Attachment #3: Type: text/plain, Size: 143 bytes --] _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH] kexec memory ranges dynamic allocation 2008-10-14 15:11 [PATCH] kexec memory ranges dynamic allocation Maxim Uvarov @ 2008-10-15 3:18 ` Simon Horman 2008-10-15 6:28 ` Maxim Uvarov 2008-10-15 8:46 ` Maxim Uvarov 2008-10-17 16:12 ` Chandru 1 sibling, 2 replies; 10+ messages in thread From: Simon Horman @ 2008-10-15 3:18 UTC (permalink / raw) To: Maxim Uvarov; +Cc: ppcdev, kexec On Tue, Oct 14, 2008 at 07:11:19PM +0400, Maxim Uvarov wrote: > Hello all, > > As you all know it is not easy to count exact value of memory ranges from > device tree on powerpc. > It very depends on how dts file was written. What do you think about really > dynamic allocation buffers > for this buffers? Conceptually I have no objections to the change, though I would like to get some review from ppc people. (linuxppc-dev@ozlabs.org CCed) > Patch is attached. This patch doesn't seem to compile for me. # powerpc64-unknown-linux-gnu-gcc --version powerpc64-unknown-linux-gnu-gcc (GCC) 4.1.1 Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. #make [snip] kexec/arch/ppc64/kexec-ppc64.c:100: warning: function declaration isn't a prototype kexec/arch/ppc64/kexec-ppc64.c: In function 'realloc_memory_ranges': kexec/arch/ppc64/kexec-ppc64.c:107: warning: passing argument 1 of 'realloc' makes pointer from integer without a cast kexec/arch/ppc64/kexec-ppc64.c:107: error: too few arguments to function 'realloc' kexec/arch/ppc64/kexec-ppc64.c:102: warning: unused variable 'tmp' -- Simon Horman VA Linux Systems Japan K.K., Sydney, Australia Satellite Office H: www.vergenet.net/~horms/ W: www.valinux.co.jp/en _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] kexec memory ranges dynamic allocation 2008-10-15 3:18 ` Simon Horman @ 2008-10-15 6:28 ` Maxim Uvarov 2008-10-15 8:46 ` Maxim Uvarov 1 sibling, 0 replies; 10+ messages in thread From: Maxim Uvarov @ 2008-10-15 6:28 UTC (permalink / raw) To: Simon Horman; +Cc: ppcdev, kexec [-- Attachment #1.1: Type: text/plain, Size: 1677 bytes --] 2008/10/15 Simon Horman <horms@verge.net.au> > On Tue, Oct 14, 2008 at 07:11:19PM +0400, Maxim Uvarov wrote: > > Hello all, > > > > As you all know it is not easy to count exact value of memory ranges from > > device tree on powerpc. > > It very depends on how dts file was written. What do you think about > really > > dynamic allocation buffers > > for this buffers? > > Conceptually I have no objections to the change, > though I would like to get some review from ppc people. > (linuxppc-dev@ozlabs.org CCed) > > > Patch is attached. > > This patch doesn't seem to compile for me. > > # powerpc64-unknown-linux-gnu-gcc --version > powerpc64-unknown-linux-gnu-gcc (GCC) 4.1.1 > Copyright (C) 2006 Free Software Foundation, Inc. > This is free software; see the source for copying conditions. There is NO > warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. > > #make > [snip] > kexec/arch/ppc64/kexec-ppc64.c:100: warning: function declaration isn't a > prototype > kexec/arch/ppc64/kexec-ppc64.c: In function 'realloc_memory_ranges': > kexec/arch/ppc64/kexec-ppc64.c:107: warning: passing argument 1 of > 'realloc' makes pointer from integer without a cast > kexec/arch/ppc64/kexec-ppc64.c:107: error: too few arguments to function > 'realloc' > kexec/arch/ppc64/kexec-ppc64.c:102: warning: unused variable 'tmp' > Sorry I edited manually formated patch before sending and lost first argument to realloc. I will resend it. > > -- > 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 [-- Attachment #1.2: Type: text/html, Size: 2529 bytes --] [-- Attachment #2: Type: text/plain, Size: 143 bytes --] _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] kexec memory ranges dynamic allocation 2008-10-15 3:18 ` Simon Horman 2008-10-15 6:28 ` Maxim Uvarov @ 2008-10-15 8:46 ` Maxim Uvarov 2008-10-31 2:29 ` Simon Horman 1 sibling, 1 reply; 10+ messages in thread From: Maxim Uvarov @ 2008-10-15 8:46 UTC (permalink / raw) To: Simon Horman; +Cc: ppcdev, kexec [-- Attachment #1.1: Type: text/plain, Size: 1714 bytes --] Patch corrected. ( git_kexec_powerpc_v2.patch is attached.) I tested it on ppc64 pasemi electra board. Both kexec -l and kexec -p works. Maxim. 2008/10/15 Simon Horman <horms@verge.net.au> > On Tue, Oct 14, 2008 at 07:11:19PM +0400, Maxim Uvarov wrote: > > Hello all, > > > > As you all know it is not easy to count exact value of memory ranges from > > device tree on powerpc. > > It very depends on how dts file was written. What do you think about > really > > dynamic allocation buffers > > for this buffers? > > Conceptually I have no objections to the change, > though I would like to get some review from ppc people. > (linuxppc-dev@ozlabs.org CCed) > > > Patch is attached. > > This patch doesn't seem to compile for me. > > # powerpc64-unknown-linux-gnu-gcc --version > powerpc64-unknown-linux-gnu-gcc (GCC) 4.1.1 > Copyright (C) 2006 Free Software Foundation, Inc. > This is free software; see the source for copying conditions. There is NO > warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. > > #make > [snip] > kexec/arch/ppc64/kexec-ppc64.c:100: warning: function declaration isn't a > prototype > kexec/arch/ppc64/kexec-ppc64.c: In function 'realloc_memory_ranges': > kexec/arch/ppc64/kexec-ppc64.c:107: warning: passing argument 1 of > 'realloc' makes pointer from integer without a cast > kexec/arch/ppc64/kexec-ppc64.c:107: error: too few arguments to function > 'realloc' > kexec/arch/ppc64/kexec-ppc64.c:102: warning: unused variable 'tmp' > > -- > 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 [-- Attachment #1.2: Type: text/html, Size: 2393 bytes --] [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: git_kexec_powerpc_v2.patch --] [-- Type: text/x-patch; name=git_kexec_powerpc_v2.patch, Size: 4909 bytes --] diff --git a/kexec/arch/ppc64/kexec-ppc64.c b/kexec/arch/ppc64/kexec-ppc64.c 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"); - 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; - /* Get number of lmbs from ibm,dynamic-memory */ - strcpy(fname, device_tree); - strcat(fname, "ibm,dynamic-reconfiguration-memory/ibm,dynamic-memory"); - 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); + if (!memory_range) + goto err; - return 0; -} + base_memory_range = (struct memory_range *) realloc(memory_range, memory_range_len); + if (!base_memory_range) + goto err; -/* - * Count the memory nodes under /proc/device-tree and populate the - * max_memory_ranges variable. This variable replaces MAX_MEMORY_RANGES - * 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); + 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); + if (!(usablemem_rgns.ranges)) + goto err; - while ((dentry = readdir(dir)) != NULL) { - if (!strncmp(dentry->d_name, - "ibm,dynamic-reconfiguration-memory", 35)){ - 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-allocation failure\n"); + 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 long kexec_flags) 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 long kexec_flags) 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. */ if (reuse_initrd) { @@ -545,6 +499,8 @@ static int get_devtree_details(unsigned long kexec_flags) 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); } /* 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)) [-- Attachment #3: Type: text/plain, Size: 143 bytes --] _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH] kexec memory ranges dynamic allocation 2008-10-15 8:46 ` Maxim Uvarov @ 2008-10-31 2:29 ` Simon Horman 2008-10-31 6:53 ` Maxim Uvarov 0 siblings, 1 reply; 10+ messages in thread From: Simon Horman @ 2008-10-31 2:29 UTC (permalink / raw) To: Maxim Uvarov; +Cc: ppcdev, Chandru, kexec Hi, Could someone please comment on the satus of this patch? On Wed, Oct 15, 2008 at 12:46:24PM +0400, Maxim Uvarov wrote: > Patch corrected. ( git_kexec_powerpc_v2.patch is attached.) > > I tested it on ppc64 pasemi electra board. Both kexec -l and kexec -p works. > > Maxim. > > > > 2008/10/15 Simon Horman <horms@verge.net.au> > > > On Tue, Oct 14, 2008 at 07:11:19PM +0400, Maxim Uvarov wrote: > > > Hello all, > > > > > > As you all know it is not easy to count exact value of memory ranges from > > > device tree on powerpc. > > > It very depends on how dts file was written. What do you think about > > really > > > dynamic allocation buffers > > > for this buffers? > > > > Conceptually I have no objections to the change, > > though I would like to get some review from ppc people. > > (linuxppc-dev@ozlabs.org CCed) > > > > > Patch is attached. > > > > This patch doesn't seem to compile for me. > > > > # powerpc64-unknown-linux-gnu-gcc --version > > powerpc64-unknown-linux-gnu-gcc (GCC) 4.1.1 > > Copyright (C) 2006 Free Software Foundation, Inc. > > This is free software; see the source for copying conditions. There is NO > > warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. > > > > #make > > [snip] > > kexec/arch/ppc64/kexec-ppc64.c:100: warning: function declaration isn't a > > prototype > > kexec/arch/ppc64/kexec-ppc64.c: In function 'realloc_memory_ranges': > > kexec/arch/ppc64/kexec-ppc64.c:107: warning: passing argument 1 of > > 'realloc' makes pointer from integer without a cast > > kexec/arch/ppc64/kexec-ppc64.c:107: error: too few arguments to function > > 'realloc' > > kexec/arch/ppc64/kexec-ppc64.c:102: warning: unused variable 'tmp' > > > > -- > > 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 > diff --git a/kexec/arch/ppc64/kexec-ppc64.c b/kexec/arch/ppc64/kexec-ppc64.c > 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"); > - 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; > > - /* Get number of lmbs from ibm,dynamic-memory */ > - strcpy(fname, device_tree); > - strcat(fname, "ibm,dynamic-reconfiguration-memory/ibm,dynamic-memory"); > - 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); > + if (!memory_range) > + goto err; > > - return 0; > -} > + base_memory_range = (struct memory_range *) realloc(memory_range, memory_range_len); > + if (!base_memory_range) > + goto err; > > -/* > - * Count the memory nodes under /proc/device-tree and populate the > - * max_memory_ranges variable. This variable replaces MAX_MEMORY_RANGES > - * 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); > + 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); > + if (!(usablemem_rgns.ranges)) > + goto err; > > - while ((dentry = readdir(dir)) != NULL) { > - if (!strncmp(dentry->d_name, > - "ibm,dynamic-reconfiguration-memory", 35)){ > - 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-allocation failure\n"); > + 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 long kexec_flags) > 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 long kexec_flags) > 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. */ > if (reuse_initrd) { > @@ -545,6 +499,8 @@ static int get_devtree_details(unsigned long kexec_flags) > 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); > } /* 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/ W: www.valinux.co.jp/en _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] kexec memory ranges dynamic allocation 2008-10-31 2:29 ` Simon Horman @ 2008-10-31 6:53 ` Maxim Uvarov 2008-11-01 3:16 ` Simon Horman 0 siblings, 1 reply; 10+ messages in thread From: Maxim Uvarov @ 2008-10-31 6:53 UTC (permalink / raw) To: Simon Horman; +Cc: ppcdev, Chandru, kexec [-- Attachment #1.1: Type: text/plain, Size: 9486 bytes --] 2008/10/31 Simon Horman <horms@verge.net.au> > 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 is a little bit difficult to say what was wrong exactly. > > On Wed, Oct 15, 2008 at 12:46:24PM +0400, Maxim Uvarov wrote: > > Patch corrected. ( git_kexec_powerpc_v2.patch is attached.) > > > > I tested it on ppc64 pasemi electra board. Both kexec -l and kexec -p > works. > > > > Maxim. > > > > > > > > 2008/10/15 Simon Horman <horms@verge.net.au> > > > > > On Tue, Oct 14, 2008 at 07:11:19PM +0400, Maxim Uvarov wrote: > > > > Hello all, > > > > > > > > As you all know it is not easy to count exact value of memory ranges > from > > > > device tree on powerpc. > > > > It very depends on how dts file was written. What do you think about > > > really > > > > dynamic allocation buffers > > > > for this buffers? > > > > > > Conceptually I have no objections to the change, > > > though I would like to get some review from ppc people. > > > (linuxppc-dev@ozlabs.org CCed) > > > > > > > Patch is attached. > > > > > > This patch doesn't seem to compile for me. > > > > > > # powerpc64-unknown-linux-gnu-gcc --version > > > powerpc64-unknown-linux-gnu-gcc (GCC) 4.1.1 > > > Copyright (C) 2006 Free Software Foundation, Inc. > > > This is free software; see the source for copying conditions. There is > NO > > > warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR > PURPOSE. > > > > > > #make > > > [snip] > > > kexec/arch/ppc64/kexec-ppc64.c:100: warning: function declaration isn't > a > > > prototype > > > kexec/arch/ppc64/kexec-ppc64.c: In function 'realloc_memory_ranges': > > > kexec/arch/ppc64/kexec-ppc64.c:107: warning: passing argument 1 of > > > 'realloc' makes pointer from integer without a cast > > > kexec/arch/ppc64/kexec-ppc64.c:107: error: too few arguments to > function > > > 'realloc' > > > kexec/arch/ppc64/kexec-ppc64.c:102: warning: unused variable 'tmp' > > > > > > -- > > > 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/> > > > W: www.valinux.co.jp/en > > > > > > > > > > > > -- > > Best regards, > > Maxim Uvarov > > > diff --git a/kexec/arch/ppc64/kexec-ppc64.c > b/kexec/arch/ppc64/kexec-ppc64.c > > 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"); > > - 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; > > > > - /* Get number of lmbs from ibm,dynamic-memory */ > > - strcpy(fname, device_tree); > > - strcat(fname, > "ibm,dynamic-reconfiguration-memory/ibm,dynamic-memory"); > > - 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); > > + if (!memory_range) > > + goto err; > > > > - return 0; > > -} > > + base_memory_range = (struct memory_range *) realloc(memory_range, > memory_range_len); > > + if (!base_memory_range) > > + goto err; > > > > -/* > > - * Count the memory nodes under /proc/device-tree and populate the > > - * max_memory_ranges variable. This variable replaces MAX_MEMORY_RANGES > > - * 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); > > + 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); > > + if (!(usablemem_rgns.ranges)) > > + goto err; > > > > - while ((dentry = readdir(dir)) != NULL) { > > - if (!strncmp(dentry->d_name, > > - "ibm,dynamic-reconfiguration-memory", 35)){ > > - 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-allocation failure\n"); > > + 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 long > kexec_flags) > > 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 long > kexec_flags) > > 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. */ > > if (reuse_initrd) { > > @@ -545,6 +499,8 @@ static int get_devtree_details(unsigned long > kexec_flags) > > 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); > > } /* 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/> > W: www.valinux.co.jp/en > > -- Best regards, Maxim Uvarov [-- Attachment #1.2: Type: text/html, Size: 15985 bytes --] [-- Attachment #2: Type: text/plain, Size: 143 bytes --] _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] kexec memory ranges dynamic allocation 2008-10-31 6:53 ` Maxim Uvarov @ 2008-11-01 3:16 ` Simon Horman 2008-11-01 8:43 ` Maxim Uvarov 0 siblings, 1 reply; 10+ messages in thread From: Simon Horman @ 2008-11-01 3:16 UTC (permalink / raw) To: Maxim Uvarov; +Cc: ppcdev, Chandru, kexec On Fri, Oct 31, 2008 at 09:53:23AM +0300, Maxim Uvarov wrote: > 2008/10/31 Simon Horman <horms@verge.net.au> > > > 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 is a > 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. Thanks > > On Wed, Oct 15, 2008 at 12:46:24PM +0400, Maxim Uvarov wrote: > > > Patch corrected. ( git_kexec_powerpc_v2.patch is attached.) > > > > > > I tested it on ppc64 pasemi electra board. Both kexec -l and kexec -p > > works. > > > > > > Maxim. > > > > > diff --git a/kexec/arch/ppc64/kexec-ppc64.c > > b/kexec/arch/ppc64/kexec-ppc64.c > > > 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"); > > > - 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; > > > > > > - /* Get number of lmbs from ibm,dynamic-memory */ > > > - strcpy(fname, device_tree); > > > - strcat(fname, > > "ibm,dynamic-reconfiguration-memory/ibm,dynamic-memory"); > > > - 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); > > > + if (!memory_range) > > > + goto err; > > > > > > - return 0; > > > -} > > > + base_memory_range = (struct memory_range *) realloc(memory_range, > > memory_range_len); > > > + if (!base_memory_range) > > > + goto err; > > > > > > -/* > > > - * Count the memory nodes under /proc/device-tree and populate the > > > - * max_memory_ranges variable. This variable replaces MAX_MEMORY_RANGES > > > - * 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); > > > + 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); > > > + if (!(usablemem_rgns.ranges)) > > > + goto err; > > > > > > - while ((dentry = readdir(dir)) != NULL) { > > > - if (!strncmp(dentry->d_name, > > > - "ibm,dynamic-reconfiguration-memory", 35)){ > > > - 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-allocation failure\n"); > > > + 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 long > > kexec_flags) > > > 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 long > > kexec_flags) > > > 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. */ > > > if (reuse_initrd) { > > > @@ -545,6 +499,8 @@ static int get_devtree_details(unsigned long > > kexec_flags) > > > 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); > > > } /* 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/> > > 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/ W: www.valinux.co.jp/en _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] kexec memory ranges dynamic allocation 2008-11-01 3:16 ` Simon Horman @ 2008-11-01 8:43 ` Maxim Uvarov 2008-11-02 23:41 ` Simon Horman 0 siblings, 1 reply; 10+ messages in thread From: Maxim Uvarov @ 2008-11-01 8:43 UTC (permalink / raw) To: Simon Horman; +Cc: ppcdev, Chandru, kexec [-- Attachment #1.1: Type: text/plain, Size: 9484 bytes --] 2008/11/1 Simon Horman <horms@verge.net.au> > On Fri, Oct 31, 2008 at 09:53:23AM +0300, Maxim Uvarov wrote: > > 2008/10/31 Simon Horman <horms@verge.net.au> > > > > > 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 is > a > > 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 <muvarov@gmail.com> > > > > Thanks > > > > On Wed, Oct 15, 2008 at 12:46:24PM +0400, Maxim Uvarov wrote: > > > > Patch corrected. ( git_kexec_powerpc_v2.patch is attached.) > > > > > > > > I tested it on ppc64 pasemi electra board. Both kexec -l and kexec -p > > > works. > > > > > > > > Maxim. > > > > > > > diff --git a/kexec/arch/ppc64/kexec-ppc64.c > > > b/kexec/arch/ppc64/kexec-ppc64.c > > > > 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"); > > > > - 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; > > > > > > > > - /* Get number of lmbs from ibm,dynamic-memory */ > > > > - strcpy(fname, device_tree); > > > > - strcat(fname, > > > "ibm,dynamic-reconfiguration-memory/ibm,dynamic-memory"); > > > > - 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); > > > > + if (!memory_range) > > > > + goto err; > > > > > > > > - return 0; > > > > -} > > > > + base_memory_range = (struct memory_range *) > realloc(memory_range, > > > memory_range_len); > > > > + if (!base_memory_range) > > > > + goto err; > > > > > > > > -/* > > > > - * Count the memory nodes under /proc/device-tree and populate the > > > > - * max_memory_ranges variable. This variable replaces > MAX_MEMORY_RANGES > > > > - * 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); > > > > + 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); > > > > + if (!(usablemem_rgns.ranges)) > > > > + goto err; > > > > > > > > - while ((dentry = readdir(dir)) != NULL) { > > > > - if (!strncmp(dentry->d_name, > > > > - "ibm,dynamic-reconfiguration-memory", > 35)){ > > > > - 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-allocation > failure\n"); > > > > + 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 long > > > kexec_flags) > > > > 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 long > > > kexec_flags) > > > > 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. > */ > > > > if (reuse_initrd) { > > > > @@ -545,6 +499,8 @@ static int get_devtree_details(unsigned long > > > kexec_flags) > > > > 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); > > > > } /* 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/> > > > 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 [-- Attachment #1.2: Type: text/html, Size: 16915 bytes --] [-- Attachment #2: Type: text/plain, Size: 143 bytes --] _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] kexec memory ranges dynamic allocation 2008-11-01 8:43 ` Maxim Uvarov @ 2008-11-02 23:41 ` Simon Horman 0 siblings, 0 replies; 10+ messages in thread From: Simon Horman @ 2008-11-02 23:41 UTC (permalink / raw) To: Maxim Uvarov; +Cc: ppcdev, Chandru, kexec On Sat, Nov 01, 2008 at 11:43:15AM +0300, Maxim Uvarov wrote: > 2008/11/1 Simon Horman <horms@verge.net.au> > > > On Fri, Oct 31, 2008 at 09:53:23AM +0300, Maxim Uvarov wrote: > > > 2008/10/31 Simon Horman <horms@verge.net.au> > > > > > > > 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 is > > a > > > 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 <muvarov@gmail.com> Thanks, applied. -- Simon Horman VA Linux Systems Japan K.K., Sydney, Australia Satellite Office H: www.vergenet.net/~horms/ W: www.valinux.co.jp/en _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] kexec memory ranges dynamic allocation 2008-10-14 15:11 [PATCH] kexec memory ranges dynamic allocation Maxim Uvarov 2008-10-15 3:18 ` Simon Horman @ 2008-10-17 16:12 ` Chandru 1 sibling, 0 replies; 10+ messages in thread From: Chandru @ 2008-10-17 16:12 UTC (permalink / raw) To: Maxim Uvarov; +Cc: horms, kexec Maxim Uvarov wrote: > Hello all, > > As you all know it is not easy to count exact value of memory ranges > from device tree on powerpc. > It very depends on how dts file was written. What do you think about > really dynamic allocation buffers > for this buffers? Patch is attached. > > -- > Best regards, > Maxim Uvarov Maxim, The changes seem to be better in allocating memory ranges dynamically. From the patch, it looks like there are couple of other places in get_devtree_details() to make a call to realloc_memory_ranges(). Also the patch removes the initialization of lmb_size and num_of_lmbs which are required for the recent dynamic-reconf-memory changes to kexec-tools. Else these values could also be read from /proc/device-tree wherever necessary . I applied the patch on a ppc64 machine and got the following # ./build/sbin/kexec -p /boot/vmlinux-kdump --append="root=/dev/sda3 elevator=deadline sysrq=1 reset_devices " --initrd=/boot/initrd-kdump get memory ranges:2 Could not find a free area of memory of 82b2b8 bytes... Base address: ffffffff is not page aligned Without the patch , kexec loads the crashkernel in to memory. Trying to see whats wrong... Chandru _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2008-11-02 23:41 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-10-14 15:11 [PATCH] kexec memory ranges dynamic allocation Maxim Uvarov 2008-10-15 3:18 ` Simon Horman 2008-10-15 6:28 ` Maxim Uvarov 2008-10-15 8:46 ` Maxim Uvarov 2008-10-31 2:29 ` Simon Horman 2008-10-31 6:53 ` Maxim Uvarov 2008-11-01 3:16 ` Simon Horman 2008-11-01 8:43 ` Maxim Uvarov 2008-11-02 23:41 ` Simon Horman 2008-10-17 16:12 ` Chandru
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox