Kexec Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [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

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