All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump
@ 2014-04-11  2:23 WANG Chao
  2014-04-11  2:23 ` [PATCH RESEND v5 01/10] x86, cleanup: fix indent WANG Chao
                   ` (9 more replies)
  0 siblings, 10 replies; 19+ messages in thread
From: WANG Chao @ 2014-04-11  2:23 UTC (permalink / raw)
  To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec

Hi, all

(Sorry for this late update. I was occupied with something else)

This patchset enables passing memory map via E820 map on x86 platform instead
of memmap=exactmap. It's a better design and will solve the following problem
so far:

- kernel cmdline is limited resource and large machines tend to have many
    memory ranges that may excceed kernel cmdline limit size.
- kASLR doesn't work with memmap=exactmap, because kASLR happens early than
    user defined memmap=exactmap takes effect.

Unfortunately, saved_max_pfn still got its user out there (calgry pci, it looks
like the only one). So for backward compatibility, I'm introducing a new option
--pass-memmap-cmdline to force kexec-tools to pass memmap=exactmap, the old way.

This patchset contains massive updates from the previous one. I take some
suggestions from reviewers. I try to split the changes into smaller pieces and
keep the whole change as minimal as I can so it wouldn't be too harsh to review
the patch.

Any comment is appreciate!

v5->v4:
Dave:
 - separate add_setup_data() to another patch.
Vivek:
 - adding comments for setup_data.
 - store crash memory range info golobally in kexec_info.
me:
 -remove dbgprint_mem_range defination, Simon has merged the patch.

v3->v4:
Linn: check return value of malloc (use xmalloc).
me: fix dbgprintf_mem_range.

v2->v3:
Linn:
 - do not free sd (setup_data) buffer.
 - reuse code in setup_e820 and setup_e820_ext.

v1->v2:
Vivek:
 - Use function instead of macro for dbgprint_mem_range
 - Do not pass reserved memory range for kdump. It could addressed later
   separately.

WANG Chao (10):
  x86, cleanup: fix indent
  x86, cleanup: add extra arguments to add_memmap() and delete_memmap()
  x86, cleanup: add other types of memory range for 2nd kernel boot to
    memmap_p
  x86, cleanup: add_memmap() only do alignment check on RANGE_RAM
  x86, cleanup: use dbgprint_mem_range for memory range debugging
  x86, cleanup: increase CRASH_MAX_MEMMAP_NR up to
    CRASH_MAX_MEMORY_RANGES
  x86, cleanup: Store crash memory ranges kexec_info
  x86, cleanup: Add a funtion add_setup_data()
  x86: add --pass-memmap-cmdline option
  x86: Pass memory range via E820 for kdump

 kexec/arch/i386/crashdump-x86.c        |  79 +++++++--------
 kexec/arch/i386/crashdump-x86.h        |   2 +-
 kexec/arch/i386/include/arch/options.h |   2 +
 kexec/arch/i386/kexec-x86.c            |   4 +
 kexec/arch/i386/kexec-x86.h            |   1 +
 kexec/arch/i386/x86-linux-setup.c      | 175 ++++++++++++++++++++++-----------
 kexec/arch/i386/x86-linux-setup.h      |   1 +
 kexec/arch/x86_64/kexec-x86_64.c       |   5 +
 kexec/kexec.h                          |   2 +
 9 files changed, 171 insertions(+), 100 deletions(-)

-- 
1.8.5.3


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* [PATCH RESEND v5 01/10] x86, cleanup: fix indent
  2014-04-11  2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
@ 2014-04-11  2:23 ` WANG Chao
  2014-04-14  2:09   ` Simon Horman
  2014-04-11  2:23 ` [PATCH RESEND v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap() WANG Chao
                   ` (8 subsequent siblings)
  9 siblings, 1 reply; 19+ messages in thread
From: WANG Chao @ 2014-04-11  2:23 UTC (permalink / raw)
  To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec

Signed-off-by: WANG Chao <chaowang@redhat.com>
---
 kexec/arch/i386/crashdump-x86.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
index 91872ab..72bce0b 100644
--- a/kexec/arch/i386/crashdump-x86.c
+++ b/kexec/arch/i386/crashdump-x86.c
@@ -509,11 +509,11 @@ static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
 		else if (addr > mend)
 			tidx = i+1;
 	}
-		/* Insert the memory region. */
-		for (j = nr_entries-1; j >= tidx; j--)
-			memmap_p[j+1] = memmap_p[j];
-		memmap_p[tidx].start = addr;
-		memmap_p[tidx].end = addr + size - 1;
+	/* Insert the memory region. */
+	for (j = nr_entries-1; j >= tidx; j--)
+		memmap_p[j+1] = memmap_p[j];
+	memmap_p[tidx].start = addr;
+	memmap_p[tidx].end = addr + size - 1;
 
 	dbgprintf("Memmap after adding segment\n");
 	for (i = 0; i < CRASH_MAX_MEMMAP_NR;  i++) {
-- 
1.8.5.3


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* [PATCH RESEND v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap()
  2014-04-11  2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
  2014-04-11  2:23 ` [PATCH RESEND v5 01/10] x86, cleanup: fix indent WANG Chao
@ 2014-04-11  2:23 ` WANG Chao
  2014-04-14  2:11   ` Simon Horman
  2014-04-11  2:23 ` [PATCH RESEND v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p WANG Chao
                   ` (7 subsequent siblings)
  9 siblings, 1 reply; 19+ messages in thread
From: WANG Chao @ 2014-04-11  2:23 UTC (permalink / raw)
  To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec

This change will be used later:

add_memmap(.., int *nr_memmap, .., int type);
delete_memmap(.., int *nr_memmap, ..);

Signed-off-by: WANG Chao <chaowang@redhat.com>
---
 kexec/arch/i386/crashdump-x86.c | 22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
index 72bce0b..e695eaf 100644
--- a/kexec/arch/i386/crashdump-x86.c
+++ b/kexec/arch/i386/crashdump-x86.c
@@ -476,8 +476,8 @@ static int exclude_region(int *nr_ranges, uint64_t start, uint64_t end)
 
 /* Adds a segment from list of memory regions which new kernel can use to
  * boot. Segment start and end should be aligned to 1K boundary. */
-static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
-								size_t size)
+static int add_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
+			unsigned long long addr, size_t size, int type)
 {
 	int i, j, nr_entries = 0, tidx = 0, align = 1024;
 	unsigned long long mstart, mend;
@@ -514,6 +514,8 @@ static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
 		memmap_p[j+1] = memmap_p[j];
 	memmap_p[tidx].start = addr;
 	memmap_p[tidx].end = addr + size - 1;
+	memmap_p[tidx].type = type;
+	*nr_memmap_p = nr_entries + 1;
 
 	dbgprintf("Memmap after adding segment\n");
 	for (i = 0; i < CRASH_MAX_MEMMAP_NR;  i++) {
@@ -530,8 +532,8 @@ static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
 
 /* Removes a segment from list of memory regions which new kernel can use to
  * boot. Segment start and end should be aligned to 1K boundary. */
-static int delete_memmap(struct memory_range *memmap_p, unsigned long long addr,
-								size_t size)
+static int delete_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
+				unsigned long long addr, size_t size)
 {
 	int i, j, nr_entries = 0, tidx = -1, operation = 0, align = 1024;
 	unsigned long long mstart, mend;
@@ -593,12 +595,14 @@ static int delete_memmap(struct memory_range *memmap_p, unsigned long long addr,
 		for (j = nr_entries-1; j > tidx; j--)
 			memmap_p[j+1] = memmap_p[j];
 		memmap_p[tidx+1] = temp_region;
+		*nr_memmap_p = nr_entries + 1;
 	}
 	if ((operation == -1) && tidx >=0) {
 		/* Delete the exact match memory region. */
 		for (j = i+1; j < CRASH_MAX_MEMMAP_NR; j++)
 			memmap_p[j-1] = memmap_p[j];
 		memmap_p[j-1].start = memmap_p[j-1].end = 0;
+		*nr_memmap_p = nr_entries - 1;
 	}
 
 	dbgprintf("Memmap after deleting segment\n");
@@ -865,7 +869,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
 {
 	void *tmp;
 	unsigned long sz, bufsz, memsz, elfcorehdr;
-	int nr_ranges = 0, align = 1024, i;
+	int nr_ranges = 0, nr_memmap_p = 0, align = 1024, i;
 	struct memory_range *mem_range, *memmap_p;
 	struct crash_elf_info elf_info;
 	unsigned kexec_arch;
@@ -941,10 +945,10 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
 	sz = (sizeof(struct memory_range) * CRASH_MAX_MEMMAP_NR);
 	memmap_p = xmalloc(sz);
 	memset(memmap_p, 0, sz);
-	add_memmap(memmap_p, info->backup_src_start, info->backup_src_size);
+	add_memmap(memmap_p, &nr_memmap_p, info->backup_src_start, info->backup_src_size, RANGE_RAM);
 	for (i = 0; i < crash_reserved_mem_nr; i++) {
 		sz = crash_reserved_mem[i].end - crash_reserved_mem[i].start +1;
-		if (add_memmap(memmap_p, crash_reserved_mem[i].start, sz) < 0)
+		if (add_memmap(memmap_p, &nr_memmap_p, crash_reserved_mem[i].start, sz, RANGE_RAM) < 0)
 			return ENOCRASHKERNEL;
 	}
 
@@ -957,7 +961,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
 						0, max_addr, -1);
 		dbgprintf("Created backup segment at 0x%lx\n",
 			  info->backup_start);
-		if (delete_memmap(memmap_p, info->backup_start, sz) < 0)
+		if (delete_memmap(memmap_p, &nr_memmap_p, info->backup_start, sz) < 0)
 			return EFAILED;
 	}
 
@@ -993,7 +997,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
 	elfcorehdr = add_buffer(info, tmp, bufsz, memsz, align, min_base,
 							max_addr, -1);
 	dbgprintf("Created elf header segment at 0x%lx\n", elfcorehdr);
-	if (delete_memmap(memmap_p, elfcorehdr, memsz) < 0)
+	if (delete_memmap(memmap_p, &nr_memmap_p, elfcorehdr, memsz) < 0)
 		return -1;
 	cmdline_add_memmap(mod_cmdline, memmap_p);
 	if (!bzImage_support_efi_boot)
-- 
1.8.5.3


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* [PATCH RESEND v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p
  2014-04-11  2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
  2014-04-11  2:23 ` [PATCH RESEND v5 01/10] x86, cleanup: fix indent WANG Chao
  2014-04-11  2:23 ` [PATCH RESEND v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap() WANG Chao
@ 2014-04-11  2:23 ` WANG Chao
  2014-04-14  2:12   ` Simon Horman
  2014-04-11  2:23 ` [PATCH RESEND v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM WANG Chao
                   ` (6 subsequent siblings)
  9 siblings, 1 reply; 19+ messages in thread
From: WANG Chao @ 2014-04-11  2:23 UTC (permalink / raw)
  To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec

Now memmap_p contains all the memory range for 2nd kernel boot.

Signed-off-by: WANG Chao <chaowang@redhat.com>
---
 kexec/arch/i386/crashdump-x86.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
index e695eaf..43eb8f7 100644
--- a/kexec/arch/i386/crashdump-x86.c
+++ b/kexec/arch/i386/crashdump-x86.c
@@ -1006,12 +1006,15 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
 
 	/* Inform second kernel about the presence of ACPI tables. */
 	for (i = 0; i < CRASH_MAX_MEMORY_RANGES; i++) {
-		unsigned long start, end;
+		unsigned long start, end, size, type;
 		if ( !( mem_range[i].type == RANGE_ACPI
 			|| mem_range[i].type == RANGE_ACPI_NVS) )
 			continue;
 		start = mem_range[i].start;
 		end = mem_range[i].end;
+		type = mem_range[i].type;
+		size = end - start;
+		add_memmap(memmap_p, &nr_memmap_p, start, size, type);
 		cmdline_add_memmap_acpi(mod_cmdline, start, end);
 	}
 	return 0;
-- 
1.8.5.3


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* [PATCH RESEND v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM
  2014-04-11  2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (2 preceding siblings ...)
  2014-04-11  2:23 ` [PATCH RESEND v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p WANG Chao
@ 2014-04-11  2:23 ` WANG Chao
  2014-04-14  2:13   ` Simon Horman
  2014-04-11  2:23 ` [PATCH RESEND v5 05/10] x86, cleanup: use dbgprint_mem_range for memory range debugging WANG Chao
                   ` (5 subsequent siblings)
  9 siblings, 1 reply; 19+ messages in thread
From: WANG Chao @ 2014-04-11  2:23 UTC (permalink / raw)
  To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec

Signed-off-by: WANG Chao <chaowang@redhat.com>
---
 kexec/arch/i386/crashdump-x86.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
index 43eb8f7..4072c10 100644
--- a/kexec/arch/i386/crashdump-x86.c
+++ b/kexec/arch/i386/crashdump-x86.c
@@ -482,8 +482,8 @@ static int add_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
 	int i, j, nr_entries = 0, tidx = 0, align = 1024;
 	unsigned long long mstart, mend;
 
-	/* Do alignment check. */
-	if ((addr%align) || (size%align))
+	/* Do alignment check if it's RANGE_RAM */
+	if ((type == RANGE_RAM) && ((addr%align) || (size%align)))
 		return -1;
 
 	/* Make sure at least one entry in list is free. */
-- 
1.8.5.3


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* [PATCH RESEND v5 05/10] x86, cleanup: use dbgprint_mem_range for memory range debugging
  2014-04-11  2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (3 preceding siblings ...)
  2014-04-11  2:23 ` [PATCH RESEND v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM WANG Chao
@ 2014-04-11  2:23 ` WANG Chao
  2014-04-11  2:23 ` [PATCH RESEND v5 06/10] x86, cleanup: increase CRASH_MAX_MEMMAP_NR up to CRASH_MAX_MEMORY_RANGES WANG Chao
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 19+ messages in thread
From: WANG Chao @ 2014-04-11  2:23 UTC (permalink / raw)
  To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec

Signed-off-by: WANG Chao <chaowang@redhat.com>
---
 kexec/arch/i386/crashdump-x86.c | 26 +++-----------------------
 1 file changed, 3 insertions(+), 23 deletions(-)

diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
index 4072c10..2437c30 100644
--- a/kexec/arch/i386/crashdump-x86.c
+++ b/kexec/arch/i386/crashdump-x86.c
@@ -517,15 +517,7 @@ static int add_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
 	memmap_p[tidx].type = type;
 	*nr_memmap_p = nr_entries + 1;
 
-	dbgprintf("Memmap after adding segment\n");
-	for (i = 0; i < CRASH_MAX_MEMMAP_NR;  i++) {
-		mstart = memmap_p[i].start;
-		mend = memmap_p[i].end;
-		if (mstart == 0 && mend == 0)
-			break;
-		dbgprintf("%016llx - %016llx\n",
-			mstart, mend);
-	}
+	dbgprint_mem_range("Memmap after adding segment", memmap_p, *nr_memmap_p);
 
 	return 0;
 }
@@ -605,16 +597,7 @@ static int delete_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
 		*nr_memmap_p = nr_entries - 1;
 	}
 
-	dbgprintf("Memmap after deleting segment\n");
-	for (i = 0; i < CRASH_MAX_MEMMAP_NR;  i++) {
-		mstart = memmap_p[i].start;
-		mend = memmap_p[i].end;
-		if (mstart == 0 && mend == 0) {
-			break;
-		}
-		dbgprintf("%016llx - %016llx\n",
-			mstart, mend);
-	}
+	dbgprint_mem_range("Memmap after deleting segment", memmap_p, *nr_memmap_p);
 
 	return 0;
 }
@@ -913,10 +896,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
 
 	get_backup_area(info, mem_range, nr_ranges);
 
-	dbgprintf("CRASH MEMORY RANGES\n");
-
-	for(i = 0; i < nr_ranges; ++i)
-		dbgprintf("%016Lx-%016Lx\n", mem_range[i].start, mem_range[i].end);
+	dbgprint_mem_range("CRASH MEMORY RANGES", mem_range, nr_ranges);
 
 	/*
 	 * if the core type has not been set on command line, set it here
-- 
1.8.5.3


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* [PATCH RESEND v5 06/10] x86, cleanup: increase CRASH_MAX_MEMMAP_NR up to CRASH_MAX_MEMORY_RANGES
  2014-04-11  2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (4 preceding siblings ...)
  2014-04-11  2:23 ` [PATCH RESEND v5 05/10] x86, cleanup: use dbgprint_mem_range for memory range debugging WANG Chao
@ 2014-04-11  2:23 ` WANG Chao
  2014-04-11  2:23 ` [PATCH RESEND v5 07/10] x86, cleanup: Store crash memory ranges kexec_info WANG Chao
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 19+ messages in thread
From: WANG Chao @ 2014-04-11  2:23 UTC (permalink / raw)
  To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec

CRASH_MAX_MEMMAP_NR now is defined (KEXEC_MAX_SEGMENTS + 2) which is way
lower than the memmap we can pass to 2nd kernel.

Signed-off-by: WANG Chao <chaowang@redhat.com>
---
 kexec/arch/i386/crashdump-x86.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kexec/arch/i386/crashdump-x86.h b/kexec/arch/i386/crashdump-x86.h
index b61cf0a..0edeb27 100644
--- a/kexec/arch/i386/crashdump-x86.h
+++ b/kexec/arch/i386/crashdump-x86.h
@@ -20,8 +20,8 @@ int load_crashdump_segments(struct kexec_info *info, char *mod_cmdline,
 /* Kernel text size */
 #define X86_64_KERNEL_TEXT_SIZE  (512UL*1024*1024)
 
-#define CRASH_MAX_MEMMAP_NR	(KEXEC_MAX_SEGMENTS + 1)
 #define CRASH_MAX_MEMORY_RANGES	(MAX_MEMORY_RANGES + 2)
+#define CRASH_MAX_MEMMAP_NR	CRASH_MAX_MEMORY_RANGES
 
 /* Backup Region, First 640K of System RAM. */
 #define BACKUP_SRC_START	0x00000000
-- 
1.8.5.3


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* [PATCH RESEND v5 07/10] x86, cleanup: Store crash memory ranges kexec_info
  2014-04-11  2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (5 preceding siblings ...)
  2014-04-11  2:23 ` [PATCH RESEND v5 06/10] x86, cleanup: increase CRASH_MAX_MEMMAP_NR up to CRASH_MAX_MEMORY_RANGES WANG Chao
@ 2014-04-11  2:23 ` WANG Chao
  2014-04-11  2:23 ` [PATCH RESEND v5 08/10] x86, cleanup: Add a funtion add_setup_data() WANG Chao
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 19+ messages in thread
From: WANG Chao @ 2014-04-11  2:23 UTC (permalink / raw)
  To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec

Add two new members to kexec_info structure:

struct memory_range *crash_range
int nr_crash_ranges;

crash_range contains the memory ranges used to boot 2nd kernel.
nr_crash_ranges contains the count of the crash memory ranges.

Signed-off-by: WANG Chao <chaowang@redhat.com>
---
 kexec/arch/i386/crashdump-x86.c | 6 ++++++
 kexec/kexec.h                   | 2 ++
 2 files changed, 8 insertions(+)

diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
index 2437c30..2a6871d 100644
--- a/kexec/arch/i386/crashdump-x86.c
+++ b/kexec/arch/i386/crashdump-x86.c
@@ -997,6 +997,12 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
 		add_memmap(memmap_p, &nr_memmap_p, start, size, type);
 		cmdline_add_memmap_acpi(mod_cmdline, start, end);
 	}
+
+	/* Store 2nd kernel boot memory ranges for later reference in
+	 * x86-setup-linux.c: setup_linux_system_parameters() */
+	info->crash_range = memmap_p;
+	info->nr_crash_ranges = nr_memmap_p;
+
 	return 0;
 }
 
diff --git a/kexec/kexec.h b/kexec/kexec.h
index d69bba2..22d4a42 100644
--- a/kexec/kexec.h
+++ b/kexec/kexec.h
@@ -148,6 +148,8 @@ struct kexec_info {
 	int nr_segments;
 	struct memory_range *memory_range;
 	int memory_ranges;
+	struct memory_range *crash_range;
+	int nr_crash_ranges;
 	void *entry;
 	struct mem_ehdr rhdr;
 	unsigned long backup_start;
-- 
1.8.5.3


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* [PATCH RESEND v5 08/10] x86, cleanup: Add a funtion add_setup_data()
  2014-04-11  2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (6 preceding siblings ...)
  2014-04-11  2:23 ` [PATCH RESEND v5 07/10] x86, cleanup: Store crash memory ranges kexec_info WANG Chao
@ 2014-04-11  2:23 ` WANG Chao
  2014-04-14  2:16   ` Simon Horman
  2014-04-11  2:23 ` [PATCH RESEND v5 09/10] x86: add --pass-memmap-cmdline option WANG Chao
  2014-04-11  2:23 ` [PATCH RESEND v5 10/10] x86: Pass memory range via E820 for kdump WANG Chao
  9 siblings, 1 reply; 19+ messages in thread
From: WANG Chao @ 2014-04-11  2:23 UTC (permalink / raw)
  To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec

add_setup_data() is used to add an instance to the single linked list
of setup_data structure.

Signed-off-by: WANG Chao <chaowang@redhat.com>
---
 kexec/arch/i386/x86-linux-setup.c | 26 ++++++++++++++++++++------
 1 file changed, 20 insertions(+), 6 deletions(-)

diff --git a/kexec/arch/i386/x86-linux-setup.c b/kexec/arch/i386/x86-linux-setup.c
index e04e45d..8ed36cc 100644
--- a/kexec/arch/i386/x86-linux-setup.c
+++ b/kexec/arch/i386/x86-linux-setup.c
@@ -603,6 +603,22 @@ struct efi_info {
 };
 
 /*
+ * Add another instance to single linked list of struct setup_data.
+ * Please refer to kernel Documentation/x86/boot.txt for more details
+ * about setup_data structure.
+ */
+static void add_setup_data(struct kexec_info *info,
+			   struct x86_linux_param_header *real_mode,
+			   struct setup_data *sd)
+{
+	int sdsize = sizeof(struct setup_data) + sd->len;
+
+	sd->next = real_mode->setup_data;
+	real_mode->setup_data = add_buffer(info, sd, sdsize, sdsize, getpagesize(),
+			    0x100000, ULONG_MAX, INT_MAX);
+}
+
+/*
  * setup_efi_data will collect below data and pass them to 2nd kernel.
  * 1) SMBIOS, fw_vendor, runtime, config_table, they are passed via x86
  *    setup_data.
@@ -611,11 +627,11 @@ struct efi_info {
 static int setup_efi_data(struct kexec_info *info,
 			  struct x86_linux_param_header *real_mode)
 {
-	int64_t setup_data_paddr, memmap_paddr;
+	int64_t memmap_paddr;
 	struct setup_data *sd;
 	struct efi_setup_data *esd;
 	struct efi_mem_descriptor *maps;
-	int nr_maps, size, sdsize, ret = 0;
+	int nr_maps, size, ret = 0;
 	struct efi_info *ei = (struct efi_info *)real_mode->efi_info;
 
 	ret = access("/sys/firmware/efi/systab", F_OK);
@@ -648,10 +664,8 @@ static int setup_efi_data(struct kexec_info *info,
 	sd->len = sizeof(*esd);
 	memcpy(sd->data, esd, sizeof(*esd));
 	free(esd);
-	sdsize = sd->len + sizeof(struct setup_data);
-	setup_data_paddr = add_buffer(info, sd, sdsize, sdsize, getpagesize(),
-					0x100000, ULONG_MAX, INT_MAX);
-	real_mode->setup_data = setup_data_paddr;
+
+	add_setup_data(info, real_mode, sd);
 
 	size = nr_maps * sizeof(struct efi_mem_descriptor);
 	memmap_paddr = add_buffer(info, maps, size, size, getpagesize(),
-- 
1.8.5.3


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* [PATCH RESEND v5 09/10] x86: add --pass-memmap-cmdline option
  2014-04-11  2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (7 preceding siblings ...)
  2014-04-11  2:23 ` [PATCH RESEND v5 08/10] x86, cleanup: Add a funtion add_setup_data() WANG Chao
@ 2014-04-11  2:23 ` WANG Chao
  2014-04-11  2:23 ` [PATCH RESEND v5 10/10] x86: Pass memory range via E820 for kdump WANG Chao
  9 siblings, 0 replies; 19+ messages in thread
From: WANG Chao @ 2014-04-11  2:23 UTC (permalink / raw)
  To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec

--pass-memmap-cmdline is used for pass memmap=exactmap cmdline for 2nd
kernel. Later we will use this option to disable passing E820 memmap
method but use the old exactmap method.

Signed-off-by: WANG Chao <chaowang@redhat.com>
Tested-by: Linn Crosetto <linn@hp.com>
---
 kexec/arch/i386/include/arch/options.h | 2 ++
 kexec/arch/i386/kexec-x86.c            | 4 ++++
 kexec/arch/i386/kexec-x86.h            | 1 +
 kexec/arch/x86_64/kexec-x86_64.c       | 5 +++++
 4 files changed, 12 insertions(+)

diff --git a/kexec/arch/i386/include/arch/options.h b/kexec/arch/i386/include/arch/options.h
index aaac731..e5300b5 100644
--- a/kexec/arch/i386/include/arch/options.h
+++ b/kexec/arch/i386/include/arch/options.h
@@ -30,6 +30,7 @@
 #define OPT_VGA 		(OPT_ARCH_MAX+8)
 #define OPT_REAL_MODE		(OPT_ARCH_MAX+9)
 #define OPT_ENTRY_32BIT		(OPT_ARCH_MAX+10)
+#define OPT_PASS_MEMMAP_CMDLINE	(OPT_ARCH_MAX+11)
 
 /* Options relevant to the architecture (excluding loader-specific ones): */
 #define KEXEC_ARCH_OPTIONS \
@@ -41,6 +42,7 @@
 	{ "console-serial", 0, 0, OPT_CONSOLE_SERIAL }, \
 	{ "elf32-core-headers", 0, 0, OPT_ELF32_CORE }, \
 	{ "elf64-core-headers", 0, 0, OPT_ELF64_CORE }, \
+	{ "pass-memmap-cmdline", 0, 0, OPT_PASS_MEMMAP_CMDLINE }, \
 
 #define KEXEC_ARCH_OPT_STR KEXEC_OPT_STR ""
 
diff --git a/kexec/arch/i386/kexec-x86.c b/kexec/arch/i386/kexec-x86.c
index 014ecd5..0b58dff 100644
--- a/kexec/arch/i386/kexec-x86.c
+++ b/kexec/arch/i386/kexec-x86.c
@@ -54,6 +54,7 @@ void arch_usage(void)
 		"     --console-serial          Enable the serial console\n"
 		"     --elf32-core-headers      Prepare core headers in ELF32 format\n"
 		"     --elf64-core-headers      Prepare core headers in ELF64 format\n"
+		"     --pass--memmap-cmdline    Pass memory map via command line in kexec on panic case\n"
 		);
 }
 
@@ -64,6 +65,7 @@ struct arch_options_t arch_options = {
 	.console_vga = 0,
 	.console_serial = 0,
 	.core_header_type = CORE_TYPE_UNDEF,
+	.pass_memmap_cmdline = 0,
 };
 
 int arch_process_options(int argc, char **argv)
@@ -133,6 +135,8 @@ int arch_process_options(int argc, char **argv)
 		case OPT_ELF64_CORE:
 			arch_options.core_header_type = CORE_TYPE_ELF64;
 			break;
+		case OPT_PASS_MEMMAP_CMDLINE:
+			arch_options.pass_memmap_cmdline = 1;
 		}
 	}
 	/* Reset getopt for the next pass; called in other source modules */
diff --git a/kexec/arch/i386/kexec-x86.h b/kexec/arch/i386/kexec-x86.h
index 5aa2a46..e8c9188 100644
--- a/kexec/arch/i386/kexec-x86.h
+++ b/kexec/arch/i386/kexec-x86.h
@@ -50,6 +50,7 @@ struct arch_options_t {
 	uint8_t  	console_vga;
 	uint8_t  	console_serial;
 	enum coretype	core_header_type;
+	uint8_t  	pass_memmap_cmdline;
 };
 
 int multiboot_x86_probe(const char *buf, off_t len);
diff --git a/kexec/arch/x86_64/kexec-x86_64.c b/kexec/arch/x86_64/kexec-x86_64.c
index 5c23e01..f70851d 100644
--- a/kexec/arch/x86_64/kexec-x86_64.c
+++ b/kexec/arch/x86_64/kexec-x86_64.c
@@ -53,6 +53,7 @@ void arch_usage(void)
 		"     --serial-baud=<baud_rate> Specify the serial port baud rate\n"
 		"     --console-vga             Enable the vga console\n"
 		"     --console-serial          Enable the serial console\n"
+		"     --pass-memmap-cmdline     Pass memory map via command line in kexec on panic case\n"
 		);
 }
 
@@ -63,6 +64,7 @@ struct arch_options_t arch_options = {
 	.console_vga = 0,
 	.console_serial = 0,
 	.core_header_type = CORE_TYPE_ELF64,
+	.pass_memmap_cmdline = 0,
 };
 
 int arch_process_options(int argc, char **argv)
@@ -126,6 +128,9 @@ int arch_process_options(int argc, char **argv)
 			}
 			arch_options.serial_baud = value;
 			break;
+		case OPT_PASS_MEMMAP_CMDLINE:
+			arch_options.pass_memmap_cmdline = 1;
+			break;
 		}
 	}
 	/* Reset getopt for the next pass; called in other source modules */
-- 
1.8.5.3


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* [PATCH RESEND v5 10/10] x86: Pass memory range via E820 for kdump
  2014-04-11  2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (8 preceding siblings ...)
  2014-04-11  2:23 ` [PATCH RESEND v5 09/10] x86: add --pass-memmap-cmdline option WANG Chao
@ 2014-04-11  2:23 ` WANG Chao
  9 siblings, 0 replies; 19+ messages in thread
From: WANG Chao @ 2014-04-11  2:23 UTC (permalink / raw)
  To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec

command line size is restricted by kernel, sometimes memmap=exactmap has
too many memory ranges to pass to cmdline. And also memmap=exactmap and
kASLR doesn't work together.

A better approach, to pass the memory ranges for crash kernel to boot
into, is filling the memory ranges into E820.

boot_params only got 128 slots for E820 map to fit in, when the number of
memory map exceeds 128, use setup_data to pass the rest as extended E820
memory map.

kexec boot could also benefit from setup_data in case E820 memory map
exceeds 128.

Now this new approach becomes default instead of memmap=exactmap.
saved_max_pfn users can specify --pass-memmap-cmdline to use the
exactmap approach.

Signed-off-by: WANG Chao <chaowang@redhat.com>
Tested-by: Linn Crosetto <linn@hp.com>
Reviewed-by: Linn Crosetto <linn@hp.com>
Signed-off-by: WANG Chao <chaowang@redhat.com>
---
 kexec/arch/i386/crashdump-x86.c   |   6 +-
 kexec/arch/i386/x86-linux-setup.c | 149 +++++++++++++++++++++++++-------------
 kexec/arch/i386/x86-linux-setup.h |   1 +
 3 files changed, 103 insertions(+), 53 deletions(-)

diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
index 2a6871d..2c0dbe3 100644
--- a/kexec/arch/i386/crashdump-x86.c
+++ b/kexec/arch/i386/crashdump-x86.c
@@ -979,7 +979,8 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
 	dbgprintf("Created elf header segment at 0x%lx\n", elfcorehdr);
 	if (delete_memmap(memmap_p, &nr_memmap_p, elfcorehdr, memsz) < 0)
 		return -1;
-	cmdline_add_memmap(mod_cmdline, memmap_p);
+	if (arch_options.pass_memmap_cmdline)
+		cmdline_add_memmap(mod_cmdline, memmap_p);
 	if (!bzImage_support_efi_boot)
 		cmdline_add_efi(mod_cmdline);
 	cmdline_add_elfcorehdr(mod_cmdline, elfcorehdr);
@@ -995,7 +996,8 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
 		type = mem_range[i].type;
 		size = end - start;
 		add_memmap(memmap_p, &nr_memmap_p, start, size, type);
-		cmdline_add_memmap_acpi(mod_cmdline, start, end);
+		if (arch_options.pass_memmap_cmdline)
+			cmdline_add_memmap_acpi(mod_cmdline, start, end);
 	}
 
 	/* Store 2nd kernel boot memory ranges for later reference in
diff --git a/kexec/arch/i386/x86-linux-setup.c b/kexec/arch/i386/x86-linux-setup.c
index 8ed36cc..2f9bb97 100644
--- a/kexec/arch/i386/x86-linux-setup.c
+++ b/kexec/arch/i386/x86-linux-setup.c
@@ -36,8 +36,6 @@
 #include "x86-linux-setup.h"
 #include "../../kexec/kexec-syscall.h"
 
-#define SETUP_EFI	4
-
 void init_linux_parameters(struct x86_linux_param_header *real_mode)
 {
 	/* Fill in the values that are usually provided by the kernel. */
@@ -502,6 +500,11 @@ struct efi_setup_data {
 struct setup_data {
 	uint64_t next;
 	uint32_t type;
+#define SETUP_NONE	0
+#define SETUP_E820_EXT	1
+#define SETUP_DTB	2
+#define SETUP_PCI	3
+#define SETUP_EFI	4
 	uint32_t len;
 	uint8_t data[0];
 } __attribute__((packed));
@@ -684,6 +687,98 @@ out:
 	return ret;
 }
 
+static void add_e820_map_from_mr(struct x86_linux_param_header *real_mode,
+			struct e820entry *e820, struct memory_range *range, int nr_range)
+{
+	int i;
+
+	for (i = 0; i < nr_range; i++) {
+		e820[i].addr = range[i].start;
+		e820[i].size = range[i].end - range[i].start;
+		switch (range[i].type) {
+			case RANGE_RAM:
+				e820[i].type = E820_RAM;
+				break;
+			case RANGE_ACPI:
+				e820[i].type = E820_ACPI;
+				break;
+			case RANGE_ACPI_NVS:
+				e820[i].type = E820_NVS;
+				break;
+			default:
+			case RANGE_RESERVED:
+				e820[i].type = E820_RESERVED;
+				break;
+		}
+		dbgprintf("%016lx-%016lx (%d)\n",
+				e820[i].addr,
+				e820[i].addr + e820[i].size - 1,
+				e820[i].type);
+
+		if (range[i].type != RANGE_RAM)
+			continue;
+		if ((range[i].start <= 0x100000) && range[i].end > 0x100000) {
+			unsigned long long mem_k = (range[i].end >> 10) - (0x100000 >> 10);
+			real_mode->ext_mem_k = mem_k;
+			real_mode->alt_mem_k = mem_k;
+			if (mem_k > 0xfc00) {
+				real_mode->ext_mem_k = 0xfc00; /* 64M */
+			}
+			if (mem_k > 0xffffffff) {
+				real_mode->alt_mem_k = 0xffffffff;
+			}
+		}
+	}
+}
+
+static void setup_e820_ext(struct kexec_info *info, struct x86_linux_param_header *real_mode,
+			   struct memory_range *range, int nr_range)
+{
+	struct setup_data *sd;
+	struct e820entry *e820;
+	int nr_range_ext;
+
+	nr_range_ext = nr_range - E820MAX;
+	sd = xmalloc(sizeof(struct setup_data) + nr_range_ext * sizeof(struct e820entry));
+	sd->next = 0;
+	sd->len = nr_range_ext * sizeof(struct e820entry);
+	sd->type = SETUP_E820_EXT;
+
+	e820 = (struct e820entry *) sd->data;
+	dbgprintf("Extended E820 via setup_data:\n");
+	add_e820_map_from_mr(real_mode, e820, range + E820MAX, nr_range_ext);
+	add_setup_data(info, real_mode, sd);
+}
+
+static void setup_e820(struct kexec_info *info, struct x86_linux_param_header *real_mode)
+{
+	struct memory_range *range;
+	int nr_range, nr_range_saved;
+
+
+	if (info->kexec_flags & KEXEC_ON_CRASH && !arch_options.pass_memmap_cmdline) {
+		range = info->crash_range;
+		nr_range = info->nr_crash_ranges;
+	} else {
+		range = info->memory_range;
+		nr_range = info->memory_ranges;
+	}
+
+	nr_range_saved = nr_range;
+	if (nr_range > E820MAX) {
+		nr_range = E820MAX;
+	}
+
+	real_mode->e820_map_nr = nr_range;
+	dbgprintf("E820 memmap:\n");
+	add_e820_map_from_mr(real_mode, real_mode->e820_map, range, nr_range);
+
+	if (nr_range_saved > E820MAX) {
+		dbgprintf("extra E820 memmap are passed via setup_data\n");
+		setup_e820_ext(info, real_mode, range, nr_range_saved);
+	}
+}
+
 static int
 get_efi_mem_desc_version(struct x86_linux_param_header *real_mode)
 {
@@ -725,10 +820,6 @@ out:
 void setup_linux_system_parameters(struct kexec_info *info,
 				   struct x86_linux_param_header *real_mode)
 {
-	/* Fill in information the BIOS would usually provide */
-	struct memory_range *range;
-	int i, ranges;
-
 	/* get subarch from running kernel */
 	setup_subarch(real_mode);
 	if (bzImage_support_efi_boot)
@@ -769,51 +860,7 @@ void setup_linux_system_parameters(struct kexec_info *info,
 	/* another safe default */
 	real_mode->aux_device_info = 0;
 
-	range = info->memory_range;
-	ranges = info->memory_ranges;
-	if (ranges > E820MAX) {
-		if (!(info->kexec_flags & KEXEC_ON_CRASH))
-			/*
-			 * this e820 not used for capture kernel, see
-			 * do_bzImage_load()
-			 */
-			fprintf(stderr,
-				"Too many memory ranges, truncating...\n");
-		ranges = E820MAX;
-	}
-	real_mode->e820_map_nr = ranges;
-	for(i = 0; i < ranges; i++) {
-		real_mode->e820_map[i].addr = range[i].start;
-		real_mode->e820_map[i].size = range[i].end - range[i].start;
-		switch (range[i].type) {
-		case RANGE_RAM:
-			real_mode->e820_map[i].type = E820_RAM; 
-			break;
-		case RANGE_ACPI:
-			real_mode->e820_map[i].type = E820_ACPI; 
-			break;
-		case RANGE_ACPI_NVS:
-			real_mode->e820_map[i].type = E820_NVS;
-			break;
-		default:
-		case RANGE_RESERVED:
-			real_mode->e820_map[i].type = E820_RESERVED; 
-			break;
-		}
-		if (range[i].type != RANGE_RAM)
-			continue;
-		if ((range[i].start <= 0x100000) && range[i].end > 0x100000) {
-			unsigned long long mem_k = (range[i].end >> 10) - (0x100000 >> 10);
-			real_mode->ext_mem_k = mem_k;
-			real_mode->alt_mem_k = mem_k;
-			if (mem_k > 0xfc00) {
-				real_mode->ext_mem_k = 0xfc00; /* 64M */
-			}
-			if (mem_k > 0xffffffff) {
-				real_mode->alt_mem_k = 0xffffffff;
-			}
-		}
-	}
+	setup_e820(info, real_mode);
 
 	/* fill the EDD information */
 	setup_edd_info(real_mode);
diff --git a/kexec/arch/i386/x86-linux-setup.h b/kexec/arch/i386/x86-linux-setup.h
index 6fb84b4..f5d23d3 100644
--- a/kexec/arch/i386/x86-linux-setup.h
+++ b/kexec/arch/i386/x86-linux-setup.h
@@ -30,5 +30,6 @@ void setup_linux_system_parameters(struct kexec_info *info,
 /* command line parameter may be appended by purgatory */
 #define PURGATORY_CMDLINE_SIZE 64
 extern int bzImage_support_efi_boot;
+extern struct arch_options_t arch_options;
 
 #endif /* X86_LINUX_SETUP_H */
-- 
1.8.5.3


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* Re: [PATCH RESEND v5 01/10] x86, cleanup: fix indent
  2014-04-11  2:23 ` [PATCH RESEND v5 01/10] x86, cleanup: fix indent WANG Chao
@ 2014-04-14  2:09   ` Simon Horman
  0 siblings, 0 replies; 19+ messages in thread
From: Simon Horman @ 2014-04-14  2:09 UTC (permalink / raw)
  To: WANG Chao; +Cc: kexec, linn, hpa, dyoung, trenn, vgoyal, ebiederm

On Fri, Apr 11, 2014 at 10:23:22AM +0800, WANG Chao wrote:
> Signed-off-by: WANG Chao <chaowang@redhat.com>

Thanks, Applied.

> ---
>  kexec/arch/i386/crashdump-x86.c | 10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
> index 91872ab..72bce0b 100644
> --- a/kexec/arch/i386/crashdump-x86.c
> +++ b/kexec/arch/i386/crashdump-x86.c
> @@ -509,11 +509,11 @@ static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
>  		else if (addr > mend)
>  			tidx = i+1;
>  	}
> -		/* Insert the memory region. */
> -		for (j = nr_entries-1; j >= tidx; j--)
> -			memmap_p[j+1] = memmap_p[j];
> -		memmap_p[tidx].start = addr;
> -		memmap_p[tidx].end = addr + size - 1;
> +	/* Insert the memory region. */
> +	for (j = nr_entries-1; j >= tidx; j--)
> +		memmap_p[j+1] = memmap_p[j];
> +	memmap_p[tidx].start = addr;
> +	memmap_p[tidx].end = addr + size - 1;
>  
>  	dbgprintf("Memmap after adding segment\n");
>  	for (i = 0; i < CRASH_MAX_MEMMAP_NR;  i++) {
> -- 
> 1.8.5.3
> 

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* Re: [PATCH RESEND v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap()
  2014-04-11  2:23 ` [PATCH RESEND v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap() WANG Chao
@ 2014-04-14  2:11   ` Simon Horman
  2014-04-14  5:41     ` WANG Chao
  0 siblings, 1 reply; 19+ messages in thread
From: Simon Horman @ 2014-04-14  2:11 UTC (permalink / raw)
  To: WANG Chao; +Cc: kexec, linn, hpa, dyoung, trenn, vgoyal, ebiederm

On Fri, Apr 11, 2014 at 10:23:23AM +0800, WANG Chao wrote:
> This change will be used later:
> 
> add_memmap(.., int *nr_memmap, .., int type);
> delete_memmap(.., int *nr_memmap, ..);

Could you please include an explanation of the motivation for this
change in the change log (i.e. here).

> 
> Signed-off-by: WANG Chao <chaowang@redhat.com>
> ---
>  kexec/arch/i386/crashdump-x86.c | 22 +++++++++++++---------
>  1 file changed, 13 insertions(+), 9 deletions(-)
> 
> diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
> index 72bce0b..e695eaf 100644
> --- a/kexec/arch/i386/crashdump-x86.c
> +++ b/kexec/arch/i386/crashdump-x86.c
> @@ -476,8 +476,8 @@ static int exclude_region(int *nr_ranges, uint64_t start, uint64_t end)
>  
>  /* Adds a segment from list of memory regions which new kernel can use to
>   * boot. Segment start and end should be aligned to 1K boundary. */
> -static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
> -								size_t size)
> +static int add_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
> +			unsigned long long addr, size_t size, int type)
>  {
>  	int i, j, nr_entries = 0, tidx = 0, align = 1024;
>  	unsigned long long mstart, mend;
> @@ -514,6 +514,8 @@ static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
>  		memmap_p[j+1] = memmap_p[j];
>  	memmap_p[tidx].start = addr;
>  	memmap_p[tidx].end = addr + size - 1;
> +	memmap_p[tidx].type = type;
> +	*nr_memmap_p = nr_entries + 1;
>  
>  	dbgprintf("Memmap after adding segment\n");
>  	for (i = 0; i < CRASH_MAX_MEMMAP_NR;  i++) {
> @@ -530,8 +532,8 @@ static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
>  
>  /* Removes a segment from list of memory regions which new kernel can use to
>   * boot. Segment start and end should be aligned to 1K boundary. */
> -static int delete_memmap(struct memory_range *memmap_p, unsigned long long addr,
> -								size_t size)
> +static int delete_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
> +				unsigned long long addr, size_t size)
>  {
>  	int i, j, nr_entries = 0, tidx = -1, operation = 0, align = 1024;
>  	unsigned long long mstart, mend;
> @@ -593,12 +595,14 @@ static int delete_memmap(struct memory_range *memmap_p, unsigned long long addr,
>  		for (j = nr_entries-1; j > tidx; j--)
>  			memmap_p[j+1] = memmap_p[j];
>  		memmap_p[tidx+1] = temp_region;
> +		*nr_memmap_p = nr_entries + 1;
>  	}
>  	if ((operation == -1) && tidx >=0) {
>  		/* Delete the exact match memory region. */
>  		for (j = i+1; j < CRASH_MAX_MEMMAP_NR; j++)
>  			memmap_p[j-1] = memmap_p[j];
>  		memmap_p[j-1].start = memmap_p[j-1].end = 0;
> +		*nr_memmap_p = nr_entries - 1;
>  	}
>  
>  	dbgprintf("Memmap after deleting segment\n");
> @@ -865,7 +869,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
>  {
>  	void *tmp;
>  	unsigned long sz, bufsz, memsz, elfcorehdr;
> -	int nr_ranges = 0, align = 1024, i;
> +	int nr_ranges = 0, nr_memmap_p = 0, align = 1024, i;
>  	struct memory_range *mem_range, *memmap_p;
>  	struct crash_elf_info elf_info;
>  	unsigned kexec_arch;
> @@ -941,10 +945,10 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
>  	sz = (sizeof(struct memory_range) * CRASH_MAX_MEMMAP_NR);
>  	memmap_p = xmalloc(sz);
>  	memset(memmap_p, 0, sz);
> -	add_memmap(memmap_p, info->backup_src_start, info->backup_src_size);
> +	add_memmap(memmap_p, &nr_memmap_p, info->backup_src_start, info->backup_src_size, RANGE_RAM);
>  	for (i = 0; i < crash_reserved_mem_nr; i++) {
>  		sz = crash_reserved_mem[i].end - crash_reserved_mem[i].start +1;
> -		if (add_memmap(memmap_p, crash_reserved_mem[i].start, sz) < 0)
> +		if (add_memmap(memmap_p, &nr_memmap_p, crash_reserved_mem[i].start, sz, RANGE_RAM) < 0)
>  			return ENOCRASHKERNEL;
>  	}
>  
> @@ -957,7 +961,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
>  						0, max_addr, -1);
>  		dbgprintf("Created backup segment at 0x%lx\n",
>  			  info->backup_start);
> -		if (delete_memmap(memmap_p, info->backup_start, sz) < 0)
> +		if (delete_memmap(memmap_p, &nr_memmap_p, info->backup_start, sz) < 0)
>  			return EFAILED;
>  	}
>  
> @@ -993,7 +997,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
>  	elfcorehdr = add_buffer(info, tmp, bufsz, memsz, align, min_base,
>  							max_addr, -1);
>  	dbgprintf("Created elf header segment at 0x%lx\n", elfcorehdr);
> -	if (delete_memmap(memmap_p, elfcorehdr, memsz) < 0)
> +	if (delete_memmap(memmap_p, &nr_memmap_p, elfcorehdr, memsz) < 0)
>  		return -1;
>  	cmdline_add_memmap(mod_cmdline, memmap_p);
>  	if (!bzImage_support_efi_boot)
> -- 
> 1.8.5.3
> 

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* Re: [PATCH RESEND v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p
  2014-04-11  2:23 ` [PATCH RESEND v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p WANG Chao
@ 2014-04-14  2:12   ` Simon Horman
  2014-04-14  5:24     ` WANG Chao
  0 siblings, 1 reply; 19+ messages in thread
From: Simon Horman @ 2014-04-14  2:12 UTC (permalink / raw)
  To: WANG Chao; +Cc: kexec, linn, hpa, dyoung, trenn, vgoyal, ebiederm

On Fri, Apr 11, 2014 at 10:23:24AM +0800, WANG Chao wrote:
> Now memmap_p contains all the memory range for 2nd kernel boot.

Could you please include a fuller explanation of what this patch
achieves and the motivation for it.

> 
> Signed-off-by: WANG Chao <chaowang@redhat.com>
> ---
>  kexec/arch/i386/crashdump-x86.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
> index e695eaf..43eb8f7 100644
> --- a/kexec/arch/i386/crashdump-x86.c
> +++ b/kexec/arch/i386/crashdump-x86.c
> @@ -1006,12 +1006,15 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
>  
>  	/* Inform second kernel about the presence of ACPI tables. */
>  	for (i = 0; i < CRASH_MAX_MEMORY_RANGES; i++) {
> -		unsigned long start, end;
> +		unsigned long start, end, size, type;
>  		if ( !( mem_range[i].type == RANGE_ACPI
>  			|| mem_range[i].type == RANGE_ACPI_NVS) )
>  			continue;
>  		start = mem_range[i].start;
>  		end = mem_range[i].end;
> +		type = mem_range[i].type;
> +		size = end - start;
> +		add_memmap(memmap_p, &nr_memmap_p, start, size, type);
>  		cmdline_add_memmap_acpi(mod_cmdline, start, end);
>  	}
>  	return 0;
> -- 
> 1.8.5.3
> 

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* Re: [PATCH RESEND v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM
  2014-04-11  2:23 ` [PATCH RESEND v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM WANG Chao
@ 2014-04-14  2:13   ` Simon Horman
  2014-04-14  5:17     ` WANG Chao
  0 siblings, 1 reply; 19+ messages in thread
From: Simon Horman @ 2014-04-14  2:13 UTC (permalink / raw)
  To: WANG Chao; +Cc: kexec, linn, hpa, dyoung, trenn, vgoyal, ebiederm

Could you please explain why this is necessary.

Also, it seems to me that it would make sense to move this
patch so that is is immediately after patch 2 in the series.

On Fri, Apr 11, 2014 at 10:23:25AM +0800, WANG Chao wrote:
> Signed-off-by: WANG Chao <chaowang@redhat.com>
> ---
>  kexec/arch/i386/crashdump-x86.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
> index 43eb8f7..4072c10 100644
> --- a/kexec/arch/i386/crashdump-x86.c
> +++ b/kexec/arch/i386/crashdump-x86.c
> @@ -482,8 +482,8 @@ static int add_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
>  	int i, j, nr_entries = 0, tidx = 0, align = 1024;
>  	unsigned long long mstart, mend;
>  
> -	/* Do alignment check. */
> -	if ((addr%align) || (size%align))
> +	/* Do alignment check if it's RANGE_RAM */
> +	if ((type == RANGE_RAM) && ((addr%align) || (size%align)))
>  		return -1;
>  
>  	/* Make sure at least one entry in list is free. */
> -- 
> 1.8.5.3
> 

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* Re: [PATCH RESEND v5 08/10] x86, cleanup: Add a funtion add_setup_data()
  2014-04-11  2:23 ` [PATCH RESEND v5 08/10] x86, cleanup: Add a funtion add_setup_data() WANG Chao
@ 2014-04-14  2:16   ` Simon Horman
  0 siblings, 0 replies; 19+ messages in thread
From: Simon Horman @ 2014-04-14  2:16 UTC (permalink / raw)
  To: WANG Chao; +Cc: kexec, linn, hpa, dyoung, trenn, vgoyal, ebiederm

On Fri, Apr 11, 2014 at 10:23:29AM +0800, WANG Chao wrote:
> add_setup_data() is used to add an instance to the single linked list
> of setup_data structure.
> 
> Signed-off-by: WANG Chao <chaowang@redhat.com>

Thanks, applied.

> ---
>  kexec/arch/i386/x86-linux-setup.c | 26 ++++++++++++++++++++------
>  1 file changed, 20 insertions(+), 6 deletions(-)
> 
> diff --git a/kexec/arch/i386/x86-linux-setup.c b/kexec/arch/i386/x86-linux-setup.c
> index e04e45d..8ed36cc 100644
> --- a/kexec/arch/i386/x86-linux-setup.c
> +++ b/kexec/arch/i386/x86-linux-setup.c
> @@ -603,6 +603,22 @@ struct efi_info {
>  };
>  
>  /*
> + * Add another instance to single linked list of struct setup_data.
> + * Please refer to kernel Documentation/x86/boot.txt for more details
> + * about setup_data structure.
> + */
> +static void add_setup_data(struct kexec_info *info,
> +			   struct x86_linux_param_header *real_mode,
> +			   struct setup_data *sd)
> +{
> +	int sdsize = sizeof(struct setup_data) + sd->len;
> +
> +	sd->next = real_mode->setup_data;
> +	real_mode->setup_data = add_buffer(info, sd, sdsize, sdsize, getpagesize(),
> +			    0x100000, ULONG_MAX, INT_MAX);
> +}
> +
> +/*
>   * setup_efi_data will collect below data and pass them to 2nd kernel.
>   * 1) SMBIOS, fw_vendor, runtime, config_table, they are passed via x86
>   *    setup_data.
> @@ -611,11 +627,11 @@ struct efi_info {
>  static int setup_efi_data(struct kexec_info *info,
>  			  struct x86_linux_param_header *real_mode)
>  {
> -	int64_t setup_data_paddr, memmap_paddr;
> +	int64_t memmap_paddr;
>  	struct setup_data *sd;
>  	struct efi_setup_data *esd;
>  	struct efi_mem_descriptor *maps;
> -	int nr_maps, size, sdsize, ret = 0;
> +	int nr_maps, size, ret = 0;
>  	struct efi_info *ei = (struct efi_info *)real_mode->efi_info;
>  
>  	ret = access("/sys/firmware/efi/systab", F_OK);
> @@ -648,10 +664,8 @@ static int setup_efi_data(struct kexec_info *info,
>  	sd->len = sizeof(*esd);
>  	memcpy(sd->data, esd, sizeof(*esd));
>  	free(esd);
> -	sdsize = sd->len + sizeof(struct setup_data);
> -	setup_data_paddr = add_buffer(info, sd, sdsize, sdsize, getpagesize(),
> -					0x100000, ULONG_MAX, INT_MAX);
> -	real_mode->setup_data = setup_data_paddr;
> +
> +	add_setup_data(info, real_mode, sd);
>  
>  	size = nr_maps * sizeof(struct efi_mem_descriptor);
>  	memmap_paddr = add_buffer(info, maps, size, size, getpagesize(),
> -- 
> 1.8.5.3
> 

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* Re: [PATCH RESEND v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM
  2014-04-14  2:13   ` Simon Horman
@ 2014-04-14  5:17     ` WANG Chao
  0 siblings, 0 replies; 19+ messages in thread
From: WANG Chao @ 2014-04-14  5:17 UTC (permalink / raw)
  To: Simon Horman; +Cc: kexec, linn, hpa, dyoung, trenn, vgoyal, ebiederm

On 04/14/14 at 11:13am, Simon Horman wrote:
> Could you please explain why this is necessary.

add_memmap() will also add memory range with type RANGE_ACPI and
RANGE_ACPI_NVS (RANGE_RESERVED in the future) besides RANGE_RAM to
memmap_p.

Among these types of memory range, only RANGE_RAM needs to
be aligned with certain alignment. RANGE_ACPI, RANGE_ACPI_NVS and
RANGE_RESERVED doesn't have to be aligned.

I'll add above comment to the patch description.

> 
> Also, it seems to me that it would make sense to move this
> patch so that is is immediately after patch 2 in the series.

Will do.

> 
> On Fri, Apr 11, 2014 at 10:23:25AM +0800, WANG Chao wrote:
> > Signed-off-by: WANG Chao <chaowang@redhat.com>
> > ---
> >  kexec/arch/i386/crashdump-x86.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
> > index 43eb8f7..4072c10 100644
> > --- a/kexec/arch/i386/crashdump-x86.c
> > +++ b/kexec/arch/i386/crashdump-x86.c
> > @@ -482,8 +482,8 @@ static int add_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
> >  	int i, j, nr_entries = 0, tidx = 0, align = 1024;
> >  	unsigned long long mstart, mend;
> >  
> > -	/* Do alignment check. */
> > -	if ((addr%align) || (size%align))
> > +	/* Do alignment check if it's RANGE_RAM */
> > +	if ((type == RANGE_RAM) && ((addr%align) || (size%align)))
> >  		return -1;
> >  
> >  	/* Make sure at least one entry in list is free. */
> > -- 
> > 1.8.5.3
> > 

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* Re: [PATCH RESEND v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p
  2014-04-14  2:12   ` Simon Horman
@ 2014-04-14  5:24     ` WANG Chao
  0 siblings, 0 replies; 19+ messages in thread
From: WANG Chao @ 2014-04-14  5:24 UTC (permalink / raw)
  To: Simon Horman; +Cc: kexec, linn, hpa, dyoung, trenn, vgoyal, ebiederm

On 04/14/14 at 11:12am, Simon Horman wrote:
> On Fri, Apr 11, 2014 at 10:23:24AM +0800, WANG Chao wrote:
> > Now memmap_p contains all the memory range for 2nd kernel boot.
> 
> Could you please include a fuller explanation of what this patch
> achieves and the motivation for it.

In load_crashdump_segments(), memmap_p used to contain RANGE_RAM memory
range for booting 2nd kernel. Now adding types of RANGE_ACPI and
RANGE_ACPI_NVS to memmap_p, so later we can pass all the types of memory
range to 2nd kernel. These all types of memory ranges are all stored in
memmap_p.

I'll add above comment to patch description.

Thanks
WANG Chao

> 
> > 
> > Signed-off-by: WANG Chao <chaowang@redhat.com>
> > ---
> >  kexec/arch/i386/crashdump-x86.c | 5 ++++-
> >  1 file changed, 4 insertions(+), 1 deletion(-)
> > 
> > diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
> > index e695eaf..43eb8f7 100644
> > --- a/kexec/arch/i386/crashdump-x86.c
> > +++ b/kexec/arch/i386/crashdump-x86.c
> > @@ -1006,12 +1006,15 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
> >  
> >  	/* Inform second kernel about the presence of ACPI tables. */
> >  	for (i = 0; i < CRASH_MAX_MEMORY_RANGES; i++) {
> > -		unsigned long start, end;
> > +		unsigned long start, end, size, type;
> >  		if ( !( mem_range[i].type == RANGE_ACPI
> >  			|| mem_range[i].type == RANGE_ACPI_NVS) )
> >  			continue;
> >  		start = mem_range[i].start;
> >  		end = mem_range[i].end;
> > +		type = mem_range[i].type;
> > +		size = end - start;
> > +		add_memmap(memmap_p, &nr_memmap_p, start, size, type);
> >  		cmdline_add_memmap_acpi(mod_cmdline, start, end);
> >  	}
> >  	return 0;
> > -- 
> > 1.8.5.3
> > 

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

* Re: [PATCH RESEND v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap()
  2014-04-14  2:11   ` Simon Horman
@ 2014-04-14  5:41     ` WANG Chao
  0 siblings, 0 replies; 19+ messages in thread
From: WANG Chao @ 2014-04-14  5:41 UTC (permalink / raw)
  To: Simon Horman; +Cc: kexec, linn, hpa, dyoung, trenn, vgoyal, ebiederm

On 04/14/14 at 11:11am, Simon Horman wrote:
> On Fri, Apr 11, 2014 at 10:23:23AM +0800, WANG Chao wrote:
> > This change will be used later:
> > 
> > add_memmap(.., int *nr_memmap, .., int type);
> > delete_memmap(.., int *nr_memmap, ..);
> 
> Could you please include an explanation of the motivation for this
> change in the change log (i.e. here).

memmap_p[] is statically allocated for a certain amount. It will be used
later when mapping these memory maps to e820 map.

It's convenient to keep track of the count of memmap_p (nr_memmap) in
add_memmap and delete_memmap, because the counting has already been
taken care of in these two functions.

The original add_memmap() can only add memory range of RANGE_RAM type.
For adding other types of memory range, add another argument for
indicating the type.

Thanks
WANG Chao

> 
> > 
> > Signed-off-by: WANG Chao <chaowang@redhat.com>
> > ---
> >  kexec/arch/i386/crashdump-x86.c | 22 +++++++++++++---------
> >  1 file changed, 13 insertions(+), 9 deletions(-)
> > 
> > diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
> > index 72bce0b..e695eaf 100644
> > --- a/kexec/arch/i386/crashdump-x86.c
> > +++ b/kexec/arch/i386/crashdump-x86.c
> > @@ -476,8 +476,8 @@ static int exclude_region(int *nr_ranges, uint64_t start, uint64_t end)
> >  
> >  /* Adds a segment from list of memory regions which new kernel can use to
> >   * boot. Segment start and end should be aligned to 1K boundary. */
> > -static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
> > -								size_t size)
> > +static int add_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
> > +			unsigned long long addr, size_t size, int type)
> >  {
> >  	int i, j, nr_entries = 0, tidx = 0, align = 1024;
> >  	unsigned long long mstart, mend;
> > @@ -514,6 +514,8 @@ static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
> >  		memmap_p[j+1] = memmap_p[j];
> >  	memmap_p[tidx].start = addr;
> >  	memmap_p[tidx].end = addr + size - 1;
> > +	memmap_p[tidx].type = type;
> > +	*nr_memmap_p = nr_entries + 1;
> >  
> >  	dbgprintf("Memmap after adding segment\n");
> >  	for (i = 0; i < CRASH_MAX_MEMMAP_NR;  i++) {
> > @@ -530,8 +532,8 @@ static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
> >  
> >  /* Removes a segment from list of memory regions which new kernel can use to
> >   * boot. Segment start and end should be aligned to 1K boundary. */
> > -static int delete_memmap(struct memory_range *memmap_p, unsigned long long addr,
> > -								size_t size)
> > +static int delete_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
> > +				unsigned long long addr, size_t size)
> >  {
> >  	int i, j, nr_entries = 0, tidx = -1, operation = 0, align = 1024;
> >  	unsigned long long mstart, mend;
> > @@ -593,12 +595,14 @@ static int delete_memmap(struct memory_range *memmap_p, unsigned long long addr,
> >  		for (j = nr_entries-1; j > tidx; j--)
> >  			memmap_p[j+1] = memmap_p[j];
> >  		memmap_p[tidx+1] = temp_region;
> > +		*nr_memmap_p = nr_entries + 1;
> >  	}
> >  	if ((operation == -1) && tidx >=0) {
> >  		/* Delete the exact match memory region. */
> >  		for (j = i+1; j < CRASH_MAX_MEMMAP_NR; j++)
> >  			memmap_p[j-1] = memmap_p[j];
> >  		memmap_p[j-1].start = memmap_p[j-1].end = 0;
> > +		*nr_memmap_p = nr_entries - 1;
> >  	}
> >  
> >  	dbgprintf("Memmap after deleting segment\n");
> > @@ -865,7 +869,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
> >  {
> >  	void *tmp;
> >  	unsigned long sz, bufsz, memsz, elfcorehdr;
> > -	int nr_ranges = 0, align = 1024, i;
> > +	int nr_ranges = 0, nr_memmap_p = 0, align = 1024, i;
> >  	struct memory_range *mem_range, *memmap_p;
> >  	struct crash_elf_info elf_info;
> >  	unsigned kexec_arch;
> > @@ -941,10 +945,10 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
> >  	sz = (sizeof(struct memory_range) * CRASH_MAX_MEMMAP_NR);
> >  	memmap_p = xmalloc(sz);
> >  	memset(memmap_p, 0, sz);
> > -	add_memmap(memmap_p, info->backup_src_start, info->backup_src_size);
> > +	add_memmap(memmap_p, &nr_memmap_p, info->backup_src_start, info->backup_src_size, RANGE_RAM);
> >  	for (i = 0; i < crash_reserved_mem_nr; i++) {
> >  		sz = crash_reserved_mem[i].end - crash_reserved_mem[i].start +1;
> > -		if (add_memmap(memmap_p, crash_reserved_mem[i].start, sz) < 0)
> > +		if (add_memmap(memmap_p, &nr_memmap_p, crash_reserved_mem[i].start, sz, RANGE_RAM) < 0)
> >  			return ENOCRASHKERNEL;
> >  	}
> >  
> > @@ -957,7 +961,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
> >  						0, max_addr, -1);
> >  		dbgprintf("Created backup segment at 0x%lx\n",
> >  			  info->backup_start);
> > -		if (delete_memmap(memmap_p, info->backup_start, sz) < 0)
> > +		if (delete_memmap(memmap_p, &nr_memmap_p, info->backup_start, sz) < 0)
> >  			return EFAILED;
> >  	}
> >  
> > @@ -993,7 +997,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
> >  	elfcorehdr = add_buffer(info, tmp, bufsz, memsz, align, min_base,
> >  							max_addr, -1);
> >  	dbgprintf("Created elf header segment at 0x%lx\n", elfcorehdr);
> > -	if (delete_memmap(memmap_p, elfcorehdr, memsz) < 0)
> > +	if (delete_memmap(memmap_p, &nr_memmap_p, elfcorehdr, memsz) < 0)
> >  		return -1;
> >  	cmdline_add_memmap(mod_cmdline, memmap_p);
> >  	if (!bzImage_support_efi_boot)
> > -- 
> > 1.8.5.3
> > 

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

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

end of thread, other threads:[~2014-04-14  5:41 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-04-11  2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
2014-04-11  2:23 ` [PATCH RESEND v5 01/10] x86, cleanup: fix indent WANG Chao
2014-04-14  2:09   ` Simon Horman
2014-04-11  2:23 ` [PATCH RESEND v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap() WANG Chao
2014-04-14  2:11   ` Simon Horman
2014-04-14  5:41     ` WANG Chao
2014-04-11  2:23 ` [PATCH RESEND v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p WANG Chao
2014-04-14  2:12   ` Simon Horman
2014-04-14  5:24     ` WANG Chao
2014-04-11  2:23 ` [PATCH RESEND v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM WANG Chao
2014-04-14  2:13   ` Simon Horman
2014-04-14  5:17     ` WANG Chao
2014-04-11  2:23 ` [PATCH RESEND v5 05/10] x86, cleanup: use dbgprint_mem_range for memory range debugging WANG Chao
2014-04-11  2:23 ` [PATCH RESEND v5 06/10] x86, cleanup: increase CRASH_MAX_MEMMAP_NR up to CRASH_MAX_MEMORY_RANGES WANG Chao
2014-04-11  2:23 ` [PATCH RESEND v5 07/10] x86, cleanup: Store crash memory ranges kexec_info WANG Chao
2014-04-11  2:23 ` [PATCH RESEND v5 08/10] x86, cleanup: Add a funtion add_setup_data() WANG Chao
2014-04-14  2:16   ` Simon Horman
2014-04-11  2:23 ` [PATCH RESEND v5 09/10] x86: add --pass-memmap-cmdline option WANG Chao
2014-04-11  2:23 ` [PATCH RESEND v5 10/10] x86: Pass memory range via E820 for kdump WANG Chao

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.