[PATCH 4/5] Remove redundancy between get_memory_ranges_proc_iomem() and get_memory_ranges_sysfs()
Bernhard Walle
bwalle at suse.de
Sun Jul 6 19:06:10 EDT 2008
From: Bernhard Walle <bernhard.walle at gmx.de>
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>
Signed-off-by: Bernhard Walle <bernhard.walle at gmx.de>
---
kexec/arch/i386/kexec-x86.c | 96 ++++++++++++++++---------------------------
1 files changed, 36 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
{
--
1.5.6.1
More information about the kexec
mailing list