linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH] kexec memory ranges dynamic allocation
       [not found] <572af9170810140811v446a6874pd67cb77753a9e32d@mail.gmail.com>
@ 2008-10-15  3:18 ` Simon Horman
  2008-10-15  6:28   ` Maxim Uvarov
  2008-10-15  8:46   ` Maxim Uvarov
  0 siblings, 2 replies; 8+ 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

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] kexec memory ranges dynamic allocation
  2008-10-15  3:18 ` [PATCH] kexec memory ranges dynamic allocation Simon Horman
@ 2008-10-15  6:28   ` Maxim Uvarov
  2008-10-15  8:46   ` Maxim Uvarov
  1 sibling, 0 replies; 8+ messages in thread
From: Maxim Uvarov @ 2008-10-15  6:28 UTC (permalink / raw)
  To: Simon Horman; +Cc: ppcdev, kexec

[-- Attachment #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 #2: Type: text/html, Size: 2529 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] kexec memory ranges dynamic allocation
  2008-10-15  3:18 ` [PATCH] kexec memory ranges dynamic allocation 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; 8+ 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))

^ permalink raw reply related	[flat|nested] 8+ 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; 8+ messages in thread
From: Simon Horman @ 2008-10-31  2:29 UTC (permalink / raw)
  To: Maxim Uvarov; +Cc: ppcdev, 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

^ permalink raw reply	[flat|nested] 8+ 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; 8+ messages in thread
From: Maxim Uvarov @ 2008-10-31  6:53 UTC (permalink / raw)
  To: Simon Horman; +Cc: ppcdev, kexec

[-- Attachment #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 #2: Type: text/html, Size: 15985 bytes --]

^ permalink raw reply	[flat|nested] 8+ 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; 8+ messages in thread
From: Simon Horman @ 2008-11-01  3:16 UTC (permalink / raw)
  To: Maxim Uvarov; +Cc: ppcdev, 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

^ permalink raw reply	[flat|nested] 8+ 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; 8+ messages in thread
From: Maxim Uvarov @ 2008-11-01  8:43 UTC (permalink / raw)
  To: Simon Horman; +Cc: ppcdev, kexec

[-- Attachment #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 #2: Type: text/html, Size: 16915 bytes --]

^ permalink raw reply	[flat|nested] 8+ 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; 8+ messages in thread
From: Simon Horman @ 2008-11-02 23:41 UTC (permalink / raw)
  To: Maxim Uvarov; +Cc: ppcdev, 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

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2008-11-02 23:41 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <572af9170810140811v446a6874pd67cb77753a9e32d@mail.gmail.com>
2008-10-15  3:18 ` [PATCH] kexec memory ranges dynamic allocation 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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).