[PATCH 2/3] Remove redundancy between get_memory_ranges_proc_iomem() and get_memory_ranges_sysfs()

Bernhard Walle bwalle at suse.de
Mon Jul 7 10:43:41 EDT 2008


With the previous patch, we have a duplication between that both functions
for following tasks:

 - don't report the interrupt table as RAM,
 - set the mem_min and mem_max limits for kdump.

This patch removes that redundancy into the function get_memory_ranges()
that calls both functions internally.


Signed-off-by: Bernhard Walle <bwalle at suse.de>
---
 kexec/arch/i386/kexec-x86.c |   96 ++++++++++++++++---------------------------
 kexec/firmware_memmap.c     |    7 +++
 2 files changed, 43 insertions(+), 60 deletions(-)

diff --git a/kexec/arch/i386/kexec-x86.c b/kexec/arch/i386/kexec-x86.c
index 554c154..d5b6737 100644
--- a/kexec/arch/i386/kexec-x86.c
+++ b/kexec/arch/i386/kexec-x86.c
@@ -41,13 +41,10 @@ static struct memory_range memory_range[MAX_MEMORY_RANGES];
  * @param[out] range pointer that will be set to an array that holds the
  *             memory ranges
  * @param[out] ranges number of ranges valid in @p range
- * @param[in]  kexec_flags the kexec_flags to determine if we load a normal
- *             or a crashdump kernel
  *
  * @return 0 on success, any other value on failure.
  */
-static int get_memory_ranges_proc_iomem(struct memory_range **range, int *ranges,
-					unsigned long kexec_flags)
+static int get_memory_ranges_proc_iomem(struct memory_range **range, int *ranges)
 {
 	const char *iomem= proc_iomem();
 	int memory_ranges = 0;
@@ -89,27 +86,9 @@ static int get_memory_ranges_proc_iomem(struct memory_range **range, int *ranges
 		else if (memcmp(str, "ACPI Non-volatile Storage\n", 26) == 0) {
 			type = RANGE_ACPI_NVS;
 		}
-		else if (memcmp(str, "Crash kernel\n", 13) == 0) {
-		/* Redefine the memory region boundaries if kernel
-		 * exports the limits and if it is panic kernel.
-		 * Override user values only if kernel exported values are
-		 * subset of user defined values.
-		 */
-			if (kexec_flags & KEXEC_ON_CRASH) {
-				if (start > mem_min)
-					mem_min = start;
-				if (end < mem_max)
-					mem_max = end;
-			}
-			continue;
-		}
 		else {
 			continue;
 		}
-		/* Don't report the interrupt table as ram */
-		if (type == RANGE_RAM && (start < 0x100)) {
-			start = 0x100;
-		}
 		memory_range[memory_ranges].start = start;
 		memory_range[memory_ranges].end = end;
 		memory_range[memory_ranges].type = type;
@@ -132,52 +111,19 @@ static int get_memory_ranges_proc_iomem(struct memory_range **range, int *ranges
  * @param[out] range pointer that will be set to an array that holds the
  *             memory ranges
  * @param[out] ranges number of ranges valid in @p range
- * @param[in]  kexec_flags the kexec_flags to determine if we load a normal
- *             or a crashdump kernel
  *
  * @return 0 on success, any other value on failure.
  */
-static int get_memory_ranges_sysfs(struct memory_range **range, int *ranges,
-				   unsigned long kexec_flags)
+static int get_memory_ranges_sysfs(struct memory_range **range, int *ranges)
 {
 	int ret;
-	size_t i;
 	size_t range_number = MAX_MEMORY_RANGES;
-	unsigned long long start, end;
 
 	ret = get_firmware_memmap_ranges(memory_range, &range_number);
 	if (ret != 0) {
 		fprintf(stderr, "Parsing the /sys/firmware memory map failed. "
 			"Falling back to /proc/iomem.\n");
-		return get_memory_ranges_proc_iomem(range, ranges, kexec_flags);
-	}
-
-	/* Don't report the interrupt table as ram */
-	for (i = 0; i < range_number; i++) {
-		if (memory_range[i].type == RANGE_RAM &&
-				(memory_range[i].start < 0x100)) {
-			memory_range[i].start = 0x100;
-			break;
-		}
-	}
-
-	/*
-	 * Redefine the memory region boundaries if kernel
-	 * exports the limits and if it is panic kernel.
-	 * Override user values only if kernel exported values are
-	 * subset of user defined values.
-	 */
-	if (kexec_flags & KEXEC_ON_CRASH) {
-		ret = parse_iomem_single("Crash kernel\n", &start, &end);
-		if (ret != 0) {
-			fprintf(stderr, "parse_iomem_single failed.\n");
-			return -1;
-		}
-
-		if (start > mem_min)
-			mem_min = start;
-		if (end < mem_max)
-			mem_max = end;
+		return get_memory_ranges_proc_iomem(range, ranges);
 	}
 
 	*range = memory_range;
@@ -203,12 +149,12 @@ static int get_memory_ranges_sysfs(struct memory_range **range, int *ranges,
 int get_memory_ranges(struct memory_range **range, int *ranges,
 		      unsigned long kexec_flags)
 {
-	int ret;
+	int ret, i;
 
 	if (have_sys_firmware_memmap())
-		ret = get_memory_ranges_sysfs(range, ranges,kexec_flags);
+		ret = get_memory_ranges_sysfs(range, ranges);
 	else
-		ret = get_memory_ranges_proc_iomem(range, ranges, kexec_flags);
+		ret = get_memory_ranges_proc_iomem(range, ranges);
 
 	/*
 	 * both get_memory_ranges_sysfs() and get_memory_ranges_proc_iomem()
@@ -217,6 +163,36 @@ int get_memory_ranges(struct memory_range **range, int *ranges,
 	if (ret != 0)
 		return ret;
 
+	/* Don't report the interrupt table as ram */
+	for (i = 0; i < *ranges; i++) {
+		if ((*range)[i].type == RANGE_RAM &&
+				((*range)[i].start < 0x100)) {
+			(*range)[i].start = 0x100;
+			break;
+		}
+	}
+
+	/*
+	 * Redefine the memory region boundaries if kernel
+	 * exports the limits and if it is panic kernel.
+	 * Override user values only if kernel exported values are
+	 * subset of user defined values.
+	 */
+	if (kexec_flags & KEXEC_ON_CRASH) {
+		unsigned long long start, end;
+
+		ret = parse_iomem_single("Crash kernel\n", &start, &end);
+		if (ret != 0) {
+			fprintf(stderr, "parse_iomem_single failed.\n");
+			return -1;
+		}
+
+		if (start > mem_min)
+			mem_min = start;
+		if (end < mem_max)
+			mem_max = end;
+	}
+
 	/* just set 0 to 1 to enable printing for debugging */
 #if 0
 	{
diff --git a/kexec/firmware_memmap.c b/kexec/firmware_memmap.c
index cdac6f3..2ad450d 100644
--- a/kexec/firmware_memmap.c
+++ b/kexec/firmware_memmap.c
@@ -31,6 +31,13 @@
 #include "firmware_memmap.h"
 #include "kexec.h"
 
+/*
+ * If the system is too old for ULLONG_MAX, define it here.
+ */
+#ifndef ULLONG_MAX
+#    define ULLONG_MAX (~0ULL)
+#endif
+
 /**
  * The full path to the sysfs interface that provides the memory map.
  */
-- 
1.5.6




More information about the kexec mailing list