All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump
@ 2014-04-10  9:12 WANG Chao
  2014-04-10  9:12 ` [PATCH v5 01/10] x86, cleanup: fix indent WANG Chao
                   ` (14 more replies)
  0 siblings, 15 replies; 35+ messages in thread
From: WANG Chao @ 2014-04-10  9:12 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

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] 35+ messages in thread

* [PATCH v5 01/10] x86, cleanup: fix indent
  2014-04-10  9:12 [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
@ 2014-04-10  9:12 ` WANG Chao
  2014-04-10  9:12 ` [PATCH v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap() WANG Chao
                   ` (13 subsequent siblings)
  14 siblings, 0 replies; 35+ messages in thread
From: WANG Chao @ 2014-04-10  9:12 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] 35+ messages in thread

* [PATCH v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap()
  2014-04-10  9:12 [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
  2014-04-10  9:12 ` [PATCH v5 01/10] x86, cleanup: fix indent WANG Chao
@ 2014-04-10  9:12 ` WANG Chao
  2014-04-11  2:22   ` Dave Young
  2014-04-10  9:12 ` [PATCH v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p WANG Chao
                   ` (12 subsequent siblings)
  14 siblings, 1 reply; 35+ messages in thread
From: WANG Chao @ 2014-04-10  9:12 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] 35+ messages in thread

* [PATCH v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p
  2014-04-10  9:12 [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
  2014-04-10  9:12 ` [PATCH v5 01/10] x86, cleanup: fix indent WANG Chao
  2014-04-10  9:12 ` [PATCH v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap() WANG Chao
@ 2014-04-10  9:12 ` WANG Chao
  2014-04-11  2:24   ` Dave Young
  2014-04-10  9:12 ` [PATCH v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM WANG Chao
                   ` (11 subsequent siblings)
  14 siblings, 1 reply; 35+ messages in thread
From: WANG Chao @ 2014-04-10  9:12 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] 35+ messages in thread

* [PATCH v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM
  2014-04-10  9:12 [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (2 preceding siblings ...)
  2014-04-10  9:12 ` [PATCH v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p WANG Chao
@ 2014-04-10  9:12 ` WANG Chao
  2014-04-10  9:12 ` [PATCH v5 05/10] x86, cleanup: use dbgprint_mem_range for memory range debugging WANG Chao
                   ` (10 subsequent siblings)
  14 siblings, 0 replies; 35+ messages in thread
From: WANG Chao @ 2014-04-10  9:12 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] 35+ messages in thread

* [PATCH v5 05/10] x86, cleanup: use dbgprint_mem_range for memory range debugging
  2014-04-10  9:12 [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (3 preceding siblings ...)
  2014-04-10  9:12 ` [PATCH v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM WANG Chao
@ 2014-04-10  9:12 ` WANG Chao
  2014-04-10 20:18   ` Linn Crosetto
  2014-04-10  9:12 ` [PATCH v5 06/10] x86, cleanup: increase CRASH_MAX_MEMMAP_NR up to CRASH_MAX_MEMORY_RANGES WANG Chao
                   ` (9 subsequent siblings)
  14 siblings, 1 reply; 35+ messages in thread
From: WANG Chao @ 2014-04-10  9:12 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] 35+ messages in thread

* [PATCH v5 06/10] x86, cleanup: increase CRASH_MAX_MEMMAP_NR up to CRASH_MAX_MEMORY_RANGES
  2014-04-10  9:12 [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (4 preceding siblings ...)
  2014-04-10  9:12 ` [PATCH v5 05/10] x86, cleanup: use dbgprint_mem_range for memory range debugging WANG Chao
@ 2014-04-10  9:12 ` WANG Chao
  2014-04-10  9:13 ` [PATCH v5 06/10] x86, cleanup: Store crash memory ranges kexec_info WANG Chao
                   ` (8 subsequent siblings)
  14 siblings, 0 replies; 35+ messages in thread
From: WANG Chao @ 2014-04-10  9:12 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] 35+ messages in thread

* [PATCH v5 06/10] x86, cleanup: Store crash memory ranges kexec_info
  2014-04-10  9:12 [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (5 preceding siblings ...)
  2014-04-10  9:12 ` [PATCH v5 06/10] x86, cleanup: increase CRASH_MAX_MEMMAP_NR up to CRASH_MAX_MEMORY_RANGES WANG Chao
@ 2014-04-10  9:13 ` WANG Chao
  2014-04-11  2:20   ` Dave Young
  2014-04-10  9:13 ` [PATCH v5 07/10] x86, cleanup: Add a funtion add_setup_data() WANG Chao
                   ` (7 subsequent siblings)
  14 siblings, 1 reply; 35+ messages in thread
From: WANG Chao @ 2014-04-10  9:13 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] 35+ messages in thread

* [PATCH v5 07/10] x86, cleanup: Add a funtion add_setup_data()
  2014-04-10  9:12 [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (6 preceding siblings ...)
  2014-04-10  9:13 ` [PATCH v5 06/10] x86, cleanup: Store crash memory ranges kexec_info WANG Chao
@ 2014-04-10  9:13 ` WANG Chao
  2014-04-10  9:13 ` [PATCH v5 07/10] x86, cleanup: Store crash memory ranges kexec_info WANG Chao
                   ` (6 subsequent siblings)
  14 siblings, 0 replies; 35+ messages in thread
From: WANG Chao @ 2014-04-10  9:13 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] 35+ messages in thread

* [PATCH v5 07/10] x86, cleanup: Store crash memory ranges kexec_info
  2014-04-10  9:12 [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (7 preceding siblings ...)
  2014-04-10  9:13 ` [PATCH v5 07/10] x86, cleanup: Add a funtion add_setup_data() WANG Chao
@ 2014-04-10  9:13 ` WANG Chao
  2014-04-10  9:13 ` [PATCH v5 08/10] x86: add --pass-memmap-cmdline option WANG Chao
                   ` (5 subsequent siblings)
  14 siblings, 0 replies; 35+ messages in thread
From: WANG Chao @ 2014-04-10  9:13 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] 35+ messages in thread

* [PATCH v5 08/10] x86: add --pass-memmap-cmdline option
  2014-04-10  9:12 [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (8 preceding siblings ...)
  2014-04-10  9:13 ` [PATCH v5 07/10] x86, cleanup: Store crash memory ranges kexec_info WANG Chao
@ 2014-04-10  9:13 ` WANG Chao
  2014-04-10  9:13 ` [PATCH v5 08/10] x86, cleanup: Add a funtion add_setup_data() WANG Chao
                   ` (4 subsequent siblings)
  14 siblings, 0 replies; 35+ messages in thread
From: WANG Chao @ 2014-04-10  9:13 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] 35+ messages in thread

* [PATCH v5 08/10] x86, cleanup: Add a funtion add_setup_data()
  2014-04-10  9:12 [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (9 preceding siblings ...)
  2014-04-10  9:13 ` [PATCH v5 08/10] x86: add --pass-memmap-cmdline option WANG Chao
@ 2014-04-10  9:13 ` WANG Chao
  2014-04-10  9:13 ` [PATCH v5 09/10] x86: add --pass-memmap-cmdline option WANG Chao
                   ` (3 subsequent siblings)
  14 siblings, 0 replies; 35+ messages in thread
From: WANG Chao @ 2014-04-10  9:13 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] 35+ messages in thread

* [PATCH v5 09/10] x86: add --pass-memmap-cmdline option
  2014-04-10  9:12 [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (10 preceding siblings ...)
  2014-04-10  9:13 ` [PATCH v5 08/10] x86, cleanup: Add a funtion add_setup_data() WANG Chao
@ 2014-04-10  9:13 ` WANG Chao
  2014-04-10  9:13 ` [PATCH v5 09/10] x86: Pass memory range via E820 for kdump WANG Chao
                   ` (2 subsequent siblings)
  14 siblings, 0 replies; 35+ messages in thread
From: WANG Chao @ 2014-04-10  9:13 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] 35+ messages in thread

* [PATCH v5 09/10] x86: Pass memory range via E820 for kdump
  2014-04-10  9:12 [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (11 preceding siblings ...)
  2014-04-10  9:13 ` [PATCH v5 09/10] x86: add --pass-memmap-cmdline option WANG Chao
@ 2014-04-10  9:13 ` WANG Chao
  2014-04-11  2:28   ` Dave Young
  2014-04-11  2:06 ` [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass " Dave Young
  2014-04-11  3:05 ` WANG Chao
  14 siblings, 1 reply; 35+ messages in thread
From: WANG Chao @ 2014-04-10  9:13 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] 35+ messages in thread

* Re: [PATCH v5 05/10] x86, cleanup: use dbgprint_mem_range for memory range debugging
  2014-04-10  9:12 ` [PATCH v5 05/10] x86, cleanup: use dbgprint_mem_range for memory range debugging WANG Chao
@ 2014-04-10 20:18   ` Linn Crosetto
  2014-04-11  2:00     ` Dave Young
  0 siblings, 1 reply; 35+ messages in thread
From: Linn Crosetto @ 2014-04-10 20:18 UTC (permalink / raw)
  To: WANG Chao; +Cc: kexec, horms, ebiederm, hpa, dyoung, trenn, vgoyal

Wang Chao,

On Thu, Apr 10, 2014 at 05:12:58PM +0800, WANG Chao wrote:
> 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

Is the definition for dbgprint_mem_range() missing? It was added in patch v4 1/4
but I do not see it in this set.

Linn

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

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

* Re: [PATCH v5 05/10] x86, cleanup: use dbgprint_mem_range for memory range debugging
  2014-04-10 20:18   ` Linn Crosetto
@ 2014-04-11  2:00     ` Dave Young
  2014-04-11  2:11       ` WANG Chao
  0 siblings, 1 reply; 35+ messages in thread
From: Dave Young @ 2014-04-11  2:00 UTC (permalink / raw)
  To: Linn Crosetto; +Cc: kexec, horms, WANG Chao, hpa, trenn, vgoyal, ebiederm

> Is the definition for dbgprint_mem_range() missing? It was added in patch v4 1/4
> but I do not see it in this set.

I think that one has been merged by Simon..

Thanks
Dave

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

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

* Re: [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump
  2014-04-10  9:12 [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (12 preceding siblings ...)
  2014-04-10  9:13 ` [PATCH v5 09/10] x86: Pass memory range via E820 for kdump WANG Chao
@ 2014-04-11  2:06 ` Dave Young
  2014-04-11  2:14   ` WANG Chao
  2014-04-11  3:05 ` WANG Chao
  14 siblings, 1 reply; 35+ messages in thread
From: Dave Young @ 2014-04-11  2:06 UTC (permalink / raw)
  To: WANG Chao; +Cc: kexec, horms, linn, hpa, trenn, vgoyal, ebiederm

On 04/10/14 at 05:12pm, WANG Chao wrote:
> 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
> 
> 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(-)

Hi,

Here is what I received, seems there's some duplicate patches?

2535   T 04/10 WANG Chao         [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump
2536   T 04/10 WANG Chao         [PATCH v5 01/10] x86, cleanup: fix indent
2537   T 04/10 WANG Chao         [PATCH v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap()
2538   T 04/10 WANG Chao         [PATCH v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_
2539   T 04/10 WANG Chao         [PATCH v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM
2540   T 04/10 WANG Chao         [PATCH v5 05/10] x86, cleanup: use dbgprint_mem_range for memory range debugging
2541   T 04/10 WANG Chao         [PATCH v5 06/10] x86, cleanup: increase CRASH_MAX_MEMMAP_NR up to CRASH_MAX_MEMORY_RANGES
2542   T 04/10 WANG Chao         [PATCH v5 06/10] x86, cleanup: Store crash memory ranges kexec_info
2543   T 04/10 WANG Chao         [PATCH v5 07/10] x86, cleanup: Add a funtion add_setup_data()
2544   T 04/10 WANG Chao         [PATCH v5 07/10] x86, cleanup: Store crash memory ranges kexec_info

There's another [PATCH v5 06/10] x86, cleanup: Store crash memory ranges kexec_info

2545   T 04/10 WANG Chao         [PATCH v5 08/10] x86: add --pass-memmap-cmdline option
2546   T 04/10 WANG Chao         [PATCH v5 08/10] x86, cleanup: Add a funtion add_setup_data()

There's another [PATCH v5 07/10] x86, cleanup: Add a funtion add_setup_data()

2547   T 04/10 WANG Chao         [PATCH v5 09/10] x86: add --pass-memmap-cmdline option
2548   T 04/10 WANG Chao         [PATCH v5 09/10] x86: Pass memory range via E820 for kdump

Thanks
Dave

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

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

* Re: [PATCH v5 05/10] x86, cleanup: use dbgprint_mem_range for memory range debugging
  2014-04-11  2:00     ` Dave Young
@ 2014-04-11  2:11       ` WANG Chao
  0 siblings, 0 replies; 35+ messages in thread
From: WANG Chao @ 2014-04-11  2:11 UTC (permalink / raw)
  To: Dave Young; +Cc: kexec, horms, Linn Crosetto, hpa, trenn, vgoyal, ebiederm

On 04/11/14 at 10:00am, Dave Young wrote:
> > Is the definition for dbgprint_mem_range() missing? It was added in patch v4 1/4
> > but I do not see it in this set.
> 
> I think that one has been merged by Simon..

Yes, Simon has picked up this one.

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

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

* Re: [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump
  2014-04-11  2:06 ` [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass " Dave Young
@ 2014-04-11  2:14   ` WANG Chao
  0 siblings, 0 replies; 35+ messages in thread
From: WANG Chao @ 2014-04-11  2:14 UTC (permalink / raw)
  To: Dave Young; +Cc: kexec, horms, linn, hpa, trenn, vgoyal, ebiederm

On 04/11/14 at 10:06am, Dave Young wrote:
> On 04/10/14 at 05:12pm, WANG Chao wrote:
> > 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
> > 
> > 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(-)
> 
> Hi,
> 
> Here is what I received, seems there's some duplicate patches?

Sorry, I rearranged some patches and forget to remove the old one.

I'll resend. Thanks for noticing me.

Thanks
WANG Chao

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

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

* Re: [PATCH v5 06/10] x86, cleanup: Store crash memory ranges kexec_info
  2014-04-10  9:13 ` [PATCH v5 06/10] x86, cleanup: Store crash memory ranges kexec_info WANG Chao
@ 2014-04-11  2:20   ` Dave Young
  2014-04-11  3:17     ` WANG Chao
  0 siblings, 1 reply; 35+ messages in thread
From: Dave Young @ 2014-04-11  2:20 UTC (permalink / raw)
  To: WANG Chao; +Cc: kexec, horms, linn, hpa, trenn, vgoyal, ebiederm

On 04/10/14 at 05:13pm, WANG Chao wrote:
> 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;

Is the memory_range field used in crash case? If not how about reuse the field for 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	[flat|nested] 35+ messages in thread

* Re: [PATCH v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap()
  2014-04-10  9:12 ` [PATCH v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap() WANG Chao
@ 2014-04-11  2:22   ` Dave Young
  2014-04-11  4:47     ` WANG Chao
  0 siblings, 1 reply; 35+ messages in thread
From: Dave Young @ 2014-04-11  2:22 UTC (permalink / raw)
  To: WANG Chao; +Cc: kexec, horms, linn, hpa, trenn, vgoyal, ebiederm

On 04/10/14 at 05:12pm, WANG Chao wrote:
> 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)

Maybe nr_memmap is better than nr_memmap_p?

Thanks
Dave

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

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

* Re: [PATCH v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p
  2014-04-10  9:12 ` [PATCH v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p WANG Chao
@ 2014-04-11  2:24   ` Dave Young
  2014-04-11  3:02     ` WANG Chao
  0 siblings, 1 reply; 35+ messages in thread
From: Dave Young @ 2014-04-11  2:24 UTC (permalink / raw)
  To: WANG Chao; +Cc: kexec, horms, linn, hpa, trenn, vgoyal, ebiederm

On 04/10/14 at 05:12pm, WANG Chao wrote:
> Now memmap_p contains all the memory range for 2nd kernel boot.

Hi, the patch description is not infomative, I still do not get the idea
why this patch is need, what it is doing..

> 
> 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;

Probably size = end - start + 1;

> +		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] 35+ messages in thread

* Re: [PATCH v5 09/10] x86: Pass memory range via E820 for kdump
  2014-04-10  9:13 ` [PATCH v5 09/10] x86: Pass memory range via E820 for kdump WANG Chao
@ 2014-04-11  2:28   ` Dave Young
  2014-04-11  2:36     ` H. Peter Anvin
  0 siblings, 1 reply; 35+ messages in thread
From: Dave Young @ 2014-04-11  2:28 UTC (permalink / raw)
  To: WANG Chao; +Cc: kexec, horms, linn, hpa, trenn, vgoyal, ebiederm

On 04/10/14 at 05:13pm, WANG Chao wrote:
> 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;

I see it's same as original code but I still feel it should be end - start + 1;

Thanks
Dave

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

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

* Re: [PATCH v5 09/10] x86: Pass memory range via E820 for kdump
  2014-04-11  2:28   ` Dave Young
@ 2014-04-11  2:36     ` H. Peter Anvin
  2014-04-11  2:47       ` Dave Young
  0 siblings, 1 reply; 35+ messages in thread
From: H. Peter Anvin @ 2014-04-11  2:36 UTC (permalink / raw)
  To: Dave Young, WANG Chao; +Cc: kexec, horms, linn, trenn, vgoyal, ebiederm

On 04/10/2014 07:28 PM, Dave Young wrote:
>>  
>> +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;
> 
> I see it's same as original code but I still feel it should be end - start + 1;
> 

I can't see how it could possibly be +1.

How do you encode range[].end?  If it is inclusive it should be end -
start - 1, if it is a semiclosed range (the normal thing in computer
contexts) then the code above is correct.

	-hpa



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

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

* Re: [PATCH v5 09/10] x86: Pass memory range via E820 for kdump
  2014-04-11  2:36     ` H. Peter Anvin
@ 2014-04-11  2:47       ` Dave Young
  2014-04-11  2:55         ` H. Peter Anvin
  2014-04-11  3:00         ` WANG Chao
  0 siblings, 2 replies; 35+ messages in thread
From: Dave Young @ 2014-04-11  2:47 UTC (permalink / raw)
  To: H. Peter Anvin; +Cc: kexec, WANG Chao, horms, linn, trenn, vgoyal, ebiederm

On 04/10/14 at 07:36pm, H. Peter Anvin wrote:
> On 04/10/2014 07:28 PM, Dave Young wrote:
> >>  
> >> +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;
> > 
> > I see it's same as original code but I still feel it should be end - start + 1;
> > 
> 
> I can't see how it could possibly be +1.
> 
> How do you encode range[].end?  If it is inclusive it should be end -
> start - 1, if it is a semiclosed range (the normal thing in computer
> contexts) then the code above is correct.

Say the first range from my /proc/iomem:
00000000-00000fff : reserved

Shouldn't the size be 0x1000? It looks like closed range instead of semiclosed range.

Thanks
Dave

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

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

* Re: [PATCH v5 09/10] x86: Pass memory range via E820 for kdump
  2014-04-11  2:47       ` Dave Young
@ 2014-04-11  2:55         ` H. Peter Anvin
  2014-04-11  3:00         ` WANG Chao
  1 sibling, 0 replies; 35+ messages in thread
From: H. Peter Anvin @ 2014-04-11  2:55 UTC (permalink / raw)
  To: Dave Young; +Cc: kexec, WANG Chao, horms, linn, trenn, vgoyal, ebiederm

On 04/10/2014 07:47 PM, Dave Young wrote:
> On 04/10/14 at 07:36pm, H. Peter Anvin wrote:
>> On 04/10/2014 07:28 PM, Dave Young wrote:
>>>>  
>>>> +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;
>>>
>>> I see it's same as original code but I still feel it should be end - start + 1;
>>>
>>
>> I can't see how it could possibly be +1.
>>
>> How do you encode range[].end?  If it is inclusive it should be end -
>> start - 1, if it is a semiclosed range (the normal thing in computer
>> contexts) then the code above is correct.

I obviously got the above backwards in my head.  Please ignore.

> 
> Say the first range from my /proc/iomem:
> 00000000-00000fff : reserved
> 
> Shouldn't the size be 0x1000? It looks like closed range instead of semiclosed range.

You're right.  I thought we mangled the contents for /proc/iomem, but we
actually keep the contents as a closed range.

So never mind me!  -ENOBRAINTODAY.

	-hpa





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

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

* Re: [PATCH v5 09/10] x86: Pass memory range via E820 for kdump
  2014-04-11  2:47       ` Dave Young
  2014-04-11  2:55         ` H. Peter Anvin
@ 2014-04-11  3:00         ` WANG Chao
  2014-04-11  3:33           ` WANG Chao
  1 sibling, 1 reply; 35+ messages in thread
From: WANG Chao @ 2014-04-11  3:00 UTC (permalink / raw)
  To: Dave Young; +Cc: kexec, horms, linn, H. Peter Anvin, trenn, vgoyal, ebiederm

On 04/11/14 at 10:47am, Dave Young wrote:
> On 04/10/14 at 07:36pm, H. Peter Anvin wrote:
> > On 04/10/2014 07:28 PM, Dave Young wrote:
> > >>  
> > >> +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;
> > > 
> > > I see it's same as original code but I still feel it should be end - start + 1;
> > > 
> > 
> > I can't see how it could possibly be +1.
> > 
> > How do you encode range[].end?  If it is inclusive it should be end -
> > start - 1, if it is a semiclosed range (the normal thing in computer
> > contexts) then the code above is correct.
> 
> Say the first range from my /proc/iomem:
> 00000000-00000fff : reserved
> 
> Shouldn't the size be 0x1000? It looks like closed range instead of semiclosed range.

You're right. range[].end is inclusive and size should be (end - start + 1)

I'll fix it.

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

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

* Re: [PATCH v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p
  2014-04-11  2:24   ` Dave Young
@ 2014-04-11  3:02     ` WANG Chao
  0 siblings, 0 replies; 35+ messages in thread
From: WANG Chao @ 2014-04-11  3:02 UTC (permalink / raw)
  To: Dave Young; +Cc: kexec, horms, linn, hpa, trenn, vgoyal, ebiederm

On 04/11/14 at 10:24am, Dave Young wrote:
> On 04/10/14 at 05:12pm, WANG Chao wrote:
> > Now memmap_p contains all the memory range for 2nd kernel boot.
> 
> Hi, the patch description is not infomative, I still do not get the idea
> why this patch is need, what it is doing..
> 
> > 
> > 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;
> 
> Probably size = end - start + 1;

Right. end is inclusive. Will fix.

> 
> > +		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] 35+ messages in thread

* Re: [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump
  2014-04-10  9:12 [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
                   ` (13 preceding siblings ...)
  2014-04-11  2:06 ` [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass " Dave Young
@ 2014-04-11  3:05 ` WANG Chao
  14 siblings, 0 replies; 35+ messages in thread
From: WANG Chao @ 2014-04-11  3:05 UTC (permalink / raw)
  To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec

On 04/10/14 at 05:12pm, WANG Chao wrote:
> 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.

I messed up this patchset and ended up with some duplicated patches :(

Please ignore this patchset and take a look at the other series I just
sent out with "RESEND" suject prefix.

Thanks
WANG Chao

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

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

* Re: [PATCH v5 06/10] x86, cleanup: Store crash memory ranges kexec_info
  2014-04-11  2:20   ` Dave Young
@ 2014-04-11  3:17     ` WANG Chao
  2014-04-11  6:10       ` Dave Young
  0 siblings, 1 reply; 35+ messages in thread
From: WANG Chao @ 2014-04-11  3:17 UTC (permalink / raw)
  To: Dave Young; +Cc: kexec, horms, linn, hpa, trenn, vgoyal, ebiederm

On 04/11/14 at 10:20am, Dave Young wrote:
> On 04/10/14 at 05:13pm, WANG Chao wrote:
> > 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;
> 
> Is the memory_range field used in crash case? If not how about reuse the field for crash ranges.

We need memory_range field in the --pass-memmap-cmdline case.

> 
> >  	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	[flat|nested] 35+ messages in thread

* Re: [PATCH v5 09/10] x86: Pass memory range via E820 for kdump
  2014-04-11  3:00         ` WANG Chao
@ 2014-04-11  3:33           ` WANG Chao
  0 siblings, 0 replies; 35+ messages in thread
From: WANG Chao @ 2014-04-11  3:33 UTC (permalink / raw)
  To: Dave Young; +Cc: kexec, horms, linn, H. Peter Anvin, trenn, vgoyal, ebiederm

On 04/11/14 at 11:00am, WANG Chao wrote:
> On 04/11/14 at 10:47am, Dave Young wrote:
> > On 04/10/14 at 07:36pm, H. Peter Anvin wrote:
> > > On 04/10/2014 07:28 PM, Dave Young wrote:
> > > >>  
> > > >> +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;
> > > > 
> > > > I see it's same as original code but I still feel it should be end - start + 1;
> > > > 
> > > 
> > > I can't see how it could possibly be +1.
> > > 
> > > How do you encode range[].end?  If it is inclusive it should be end -
> > > start - 1, if it is a semiclosed range (the normal thing in computer
> > > contexts) then the code above is correct.
> > 
> > Say the first range from my /proc/iomem:
> > 00000000-00000fff : reserved
> > 
> > Shouldn't the size be 0x1000? It looks like closed range instead of semiclosed range.
> 
> You're right. range[].end is inclusive and size should be (end - start + 1)

In kexec path, memory range .end is exclusive however. I think it should
also be updated to inclusive to unify the encoding of memory range for
both kexec and kdump.

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

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

* Re: [PATCH v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap()
  2014-04-11  2:22   ` Dave Young
@ 2014-04-11  4:47     ` WANG Chao
  0 siblings, 0 replies; 35+ messages in thread
From: WANG Chao @ 2014-04-11  4:47 UTC (permalink / raw)
  To: Dave Young; +Cc: kexec, horms, linn, hpa, trenn, vgoyal, ebiederm

On 04/11/14 at 10:22am, Dave Young wrote:
> On 04/10/14 at 05:12pm, WANG Chao wrote:
> > 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)
> 
> Maybe nr_memmap is better than nr_memmap_p?

Sure. Will rename. I thought nr_memmap_p vs. memmap_p looked more no-brainer.

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

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

* Re: [PATCH v5 06/10] x86, cleanup: Store crash memory ranges kexec_info
  2014-04-11  3:17     ` WANG Chao
@ 2014-04-11  6:10       ` Dave Young
  2014-04-11  6:50         ` WANG Chao
  0 siblings, 1 reply; 35+ messages in thread
From: Dave Young @ 2014-04-11  6:10 UTC (permalink / raw)
  To: WANG Chao; +Cc: kexec, horms, linn, hpa, trenn, vgoyal, ebiederm

On 04/11/14 at 11:17am, WANG Chao wrote:
> On 04/11/14 at 10:20am, Dave Young wrote:
> > On 04/10/14 at 05:13pm, WANG Chao wrote:
> > > 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;
> > 
> > Is the memory_range field used in crash case? If not how about reuse the field for crash ranges.
> 
> We need memory_range field in the --pass-memmap-cmdline case.

I can not think out why it is needed. In case memmap=exactmap the e820 should be totally ignored.

It's my understanding for the user defined memmap, but there's could be other tricks.. Could you
test kdump for dropping the e820 passing with memmap=exactmap?

Thanks
Dave

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

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

* Re: [PATCH v5 06/10] x86, cleanup: Store crash memory ranges kexec_info
  2014-04-11  6:10       ` Dave Young
@ 2014-04-11  6:50         ` WANG Chao
  2014-04-11  7:02           ` Dave Young
  0 siblings, 1 reply; 35+ messages in thread
From: WANG Chao @ 2014-04-11  6:50 UTC (permalink / raw)
  To: Dave Young; +Cc: kexec, horms, linn, hpa, trenn, vgoyal, ebiederm

On 04/11/14 at 02:10pm, Dave Young wrote:
> On 04/11/14 at 11:17am, WANG Chao wrote:
> > On 04/11/14 at 10:20am, Dave Young wrote:
> > > On 04/10/14 at 05:13pm, WANG Chao wrote:
> > > > 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;
> > > 
> > > Is the memory_range field used in crash case? If not how about reuse the field for crash ranges.
> > 
> > We need memory_range field in the --pass-memmap-cmdline case.
> 
> I can not think out why it is needed. In case memmap=exactmap the e820 should be totally ignored.

Actually, we use this e820 to calculate saved_max_pfn.

In memmap=exactmap case, we pass two kinds of e820:

- e820 in boot_params filled with 1st kernel's memmap
- User defined exactmap in kernel cmdline


> 
> It's my understanding for the user defined memmap, but there's could be other tricks.. Could you
> test kdump for dropping the e820 passing with memmap=exactmap?

We can't get rid of passing 1st kernel's memmap as long as saved_max_pfn
is still in use in calgary iommu.

And that's why I introduce --pass-memmap-cmdline as a fallback method
for calgary iommu user with older kernel.

Thanks
WANG Chao

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

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

* Re: [PATCH v5 06/10] x86, cleanup: Store crash memory ranges kexec_info
  2014-04-11  6:50         ` WANG Chao
@ 2014-04-11  7:02           ` Dave Young
  0 siblings, 0 replies; 35+ messages in thread
From: Dave Young @ 2014-04-11  7:02 UTC (permalink / raw)
  To: WANG Chao; +Cc: kexec, horms, linn, hpa, trenn, vgoyal, ebiederm

On 04/11/14 at 02:50pm, WANG Chao wrote:
> On 04/11/14 at 02:10pm, Dave Young wrote:
> > On 04/11/14 at 11:17am, WANG Chao wrote:
> > > On 04/11/14 at 10:20am, Dave Young wrote:
> > > > On 04/10/14 at 05:13pm, WANG Chao wrote:
> > > > > 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;
> > > > 
> > > > Is the memory_range field used in crash case? If not how about reuse the field for crash ranges.
> > > 
> > > We need memory_range field in the --pass-memmap-cmdline case.
> > 
> > I can not think out why it is needed. In case memmap=exactmap the e820 should be totally ignored.
> 
> Actually, we use this e820 to calculate saved_max_pfn.
> 
> In memmap=exactmap case, we pass two kinds of e820:
> 
> - e820 in boot_params filled with 1st kernel's memmap
> - User defined exactmap in kernel cmdline
> 
> 
> > 
> > It's my understanding for the user defined memmap, but there's could be other tricks.. Could you
> > test kdump for dropping the e820 passing with memmap=exactmap?
> 
> We can't get rid of passing 1st kernel's memmap as long as saved_max_pfn
> is still in use in calgary iommu.
> 
> And that's why I introduce --pass-memmap-cmdline as a fallback method
> for calgary iommu user with older kernel.

Ok, I got it. Thanks the explanation.

Dave

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

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

end of thread, other threads:[~2014-04-11  7:02 UTC | newest]

Thread overview: 35+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-04-10  9:12 [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
2014-04-10  9:12 ` [PATCH v5 01/10] x86, cleanup: fix indent WANG Chao
2014-04-10  9:12 ` [PATCH v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap() WANG Chao
2014-04-11  2:22   ` Dave Young
2014-04-11  4:47     ` WANG Chao
2014-04-10  9:12 ` [PATCH v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p WANG Chao
2014-04-11  2:24   ` Dave Young
2014-04-11  3:02     ` WANG Chao
2014-04-10  9:12 ` [PATCH v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM WANG Chao
2014-04-10  9:12 ` [PATCH v5 05/10] x86, cleanup: use dbgprint_mem_range for memory range debugging WANG Chao
2014-04-10 20:18   ` Linn Crosetto
2014-04-11  2:00     ` Dave Young
2014-04-11  2:11       ` WANG Chao
2014-04-10  9:12 ` [PATCH v5 06/10] x86, cleanup: increase CRASH_MAX_MEMMAP_NR up to CRASH_MAX_MEMORY_RANGES WANG Chao
2014-04-10  9:13 ` [PATCH v5 06/10] x86, cleanup: Store crash memory ranges kexec_info WANG Chao
2014-04-11  2:20   ` Dave Young
2014-04-11  3:17     ` WANG Chao
2014-04-11  6:10       ` Dave Young
2014-04-11  6:50         ` WANG Chao
2014-04-11  7:02           ` Dave Young
2014-04-10  9:13 ` [PATCH v5 07/10] x86, cleanup: Add a funtion add_setup_data() WANG Chao
2014-04-10  9:13 ` [PATCH v5 07/10] x86, cleanup: Store crash memory ranges kexec_info WANG Chao
2014-04-10  9:13 ` [PATCH v5 08/10] x86: add --pass-memmap-cmdline option WANG Chao
2014-04-10  9:13 ` [PATCH v5 08/10] x86, cleanup: Add a funtion add_setup_data() WANG Chao
2014-04-10  9:13 ` [PATCH v5 09/10] x86: add --pass-memmap-cmdline option WANG Chao
2014-04-10  9:13 ` [PATCH v5 09/10] x86: Pass memory range via E820 for kdump WANG Chao
2014-04-11  2:28   ` Dave Young
2014-04-11  2:36     ` H. Peter Anvin
2014-04-11  2:47       ` Dave Young
2014-04-11  2:55         ` H. Peter Anvin
2014-04-11  3:00         ` WANG Chao
2014-04-11  3:33           ` WANG Chao
2014-04-11  2:06 ` [PATCH v5 00/10] kexec-tools, x86: E820 memmap pass " Dave Young
2014-04-11  2:14   ` WANG Chao
2014-04-11  3:05 ` 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.