* [PATCH RESEND v5 01/10] x86, cleanup: fix indent
2014-04-11 2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
@ 2014-04-11 2:23 ` WANG Chao
2014-04-14 2:09 ` Simon Horman
2014-04-11 2:23 ` [PATCH RESEND v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap() WANG Chao
` (8 subsequent siblings)
9 siblings, 1 reply; 19+ messages in thread
From: WANG Chao @ 2014-04-11 2:23 UTC (permalink / raw)
To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec
Signed-off-by: WANG Chao <chaowang@redhat.com>
---
kexec/arch/i386/crashdump-x86.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
index 91872ab..72bce0b 100644
--- a/kexec/arch/i386/crashdump-x86.c
+++ b/kexec/arch/i386/crashdump-x86.c
@@ -509,11 +509,11 @@ static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
else if (addr > mend)
tidx = i+1;
}
- /* Insert the memory region. */
- for (j = nr_entries-1; j >= tidx; j--)
- memmap_p[j+1] = memmap_p[j];
- memmap_p[tidx].start = addr;
- memmap_p[tidx].end = addr + size - 1;
+ /* Insert the memory region. */
+ for (j = nr_entries-1; j >= tidx; j--)
+ memmap_p[j+1] = memmap_p[j];
+ memmap_p[tidx].start = addr;
+ memmap_p[tidx].end = addr + size - 1;
dbgprintf("Memmap after adding segment\n");
for (i = 0; i < CRASH_MAX_MEMMAP_NR; i++) {
--
1.8.5.3
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH RESEND v5 01/10] x86, cleanup: fix indent
2014-04-11 2:23 ` [PATCH RESEND v5 01/10] x86, cleanup: fix indent WANG Chao
@ 2014-04-14 2:09 ` Simon Horman
0 siblings, 0 replies; 19+ messages in thread
From: Simon Horman @ 2014-04-14 2:09 UTC (permalink / raw)
To: WANG Chao; +Cc: kexec, linn, hpa, dyoung, trenn, vgoyal, ebiederm
On Fri, Apr 11, 2014 at 10:23:22AM +0800, WANG Chao wrote:
> Signed-off-by: WANG Chao <chaowang@redhat.com>
Thanks, Applied.
> ---
> kexec/arch/i386/crashdump-x86.c | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
> index 91872ab..72bce0b 100644
> --- a/kexec/arch/i386/crashdump-x86.c
> +++ b/kexec/arch/i386/crashdump-x86.c
> @@ -509,11 +509,11 @@ static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
> else if (addr > mend)
> tidx = i+1;
> }
> - /* Insert the memory region. */
> - for (j = nr_entries-1; j >= tidx; j--)
> - memmap_p[j+1] = memmap_p[j];
> - memmap_p[tidx].start = addr;
> - memmap_p[tidx].end = addr + size - 1;
> + /* Insert the memory region. */
> + for (j = nr_entries-1; j >= tidx; j--)
> + memmap_p[j+1] = memmap_p[j];
> + memmap_p[tidx].start = addr;
> + memmap_p[tidx].end = addr + size - 1;
>
> dbgprintf("Memmap after adding segment\n");
> for (i = 0; i < CRASH_MAX_MEMMAP_NR; i++) {
> --
> 1.8.5.3
>
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH RESEND v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap()
2014-04-11 2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
2014-04-11 2:23 ` [PATCH RESEND v5 01/10] x86, cleanup: fix indent WANG Chao
@ 2014-04-11 2:23 ` WANG Chao
2014-04-14 2:11 ` Simon Horman
2014-04-11 2:23 ` [PATCH RESEND v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p WANG Chao
` (7 subsequent siblings)
9 siblings, 1 reply; 19+ messages in thread
From: WANG Chao @ 2014-04-11 2:23 UTC (permalink / raw)
To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec
This change will be used later:
add_memmap(.., int *nr_memmap, .., int type);
delete_memmap(.., int *nr_memmap, ..);
Signed-off-by: WANG Chao <chaowang@redhat.com>
---
kexec/arch/i386/crashdump-x86.c | 22 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
index 72bce0b..e695eaf 100644
--- a/kexec/arch/i386/crashdump-x86.c
+++ b/kexec/arch/i386/crashdump-x86.c
@@ -476,8 +476,8 @@ static int exclude_region(int *nr_ranges, uint64_t start, uint64_t end)
/* Adds a segment from list of memory regions which new kernel can use to
* boot. Segment start and end should be aligned to 1K boundary. */
-static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
- size_t size)
+static int add_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
+ unsigned long long addr, size_t size, int type)
{
int i, j, nr_entries = 0, tidx = 0, align = 1024;
unsigned long long mstart, mend;
@@ -514,6 +514,8 @@ static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
memmap_p[j+1] = memmap_p[j];
memmap_p[tidx].start = addr;
memmap_p[tidx].end = addr + size - 1;
+ memmap_p[tidx].type = type;
+ *nr_memmap_p = nr_entries + 1;
dbgprintf("Memmap after adding segment\n");
for (i = 0; i < CRASH_MAX_MEMMAP_NR; i++) {
@@ -530,8 +532,8 @@ static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
/* Removes a segment from list of memory regions which new kernel can use to
* boot. Segment start and end should be aligned to 1K boundary. */
-static int delete_memmap(struct memory_range *memmap_p, unsigned long long addr,
- size_t size)
+static int delete_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
+ unsigned long long addr, size_t size)
{
int i, j, nr_entries = 0, tidx = -1, operation = 0, align = 1024;
unsigned long long mstart, mend;
@@ -593,12 +595,14 @@ static int delete_memmap(struct memory_range *memmap_p, unsigned long long addr,
for (j = nr_entries-1; j > tidx; j--)
memmap_p[j+1] = memmap_p[j];
memmap_p[tidx+1] = temp_region;
+ *nr_memmap_p = nr_entries + 1;
}
if ((operation == -1) && tidx >=0) {
/* Delete the exact match memory region. */
for (j = i+1; j < CRASH_MAX_MEMMAP_NR; j++)
memmap_p[j-1] = memmap_p[j];
memmap_p[j-1].start = memmap_p[j-1].end = 0;
+ *nr_memmap_p = nr_entries - 1;
}
dbgprintf("Memmap after deleting segment\n");
@@ -865,7 +869,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
{
void *tmp;
unsigned long sz, bufsz, memsz, elfcorehdr;
- int nr_ranges = 0, align = 1024, i;
+ int nr_ranges = 0, nr_memmap_p = 0, align = 1024, i;
struct memory_range *mem_range, *memmap_p;
struct crash_elf_info elf_info;
unsigned kexec_arch;
@@ -941,10 +945,10 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
sz = (sizeof(struct memory_range) * CRASH_MAX_MEMMAP_NR);
memmap_p = xmalloc(sz);
memset(memmap_p, 0, sz);
- add_memmap(memmap_p, info->backup_src_start, info->backup_src_size);
+ add_memmap(memmap_p, &nr_memmap_p, info->backup_src_start, info->backup_src_size, RANGE_RAM);
for (i = 0; i < crash_reserved_mem_nr; i++) {
sz = crash_reserved_mem[i].end - crash_reserved_mem[i].start +1;
- if (add_memmap(memmap_p, crash_reserved_mem[i].start, sz) < 0)
+ if (add_memmap(memmap_p, &nr_memmap_p, crash_reserved_mem[i].start, sz, RANGE_RAM) < 0)
return ENOCRASHKERNEL;
}
@@ -957,7 +961,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
0, max_addr, -1);
dbgprintf("Created backup segment at 0x%lx\n",
info->backup_start);
- if (delete_memmap(memmap_p, info->backup_start, sz) < 0)
+ if (delete_memmap(memmap_p, &nr_memmap_p, info->backup_start, sz) < 0)
return EFAILED;
}
@@ -993,7 +997,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
elfcorehdr = add_buffer(info, tmp, bufsz, memsz, align, min_base,
max_addr, -1);
dbgprintf("Created elf header segment at 0x%lx\n", elfcorehdr);
- if (delete_memmap(memmap_p, elfcorehdr, memsz) < 0)
+ if (delete_memmap(memmap_p, &nr_memmap_p, elfcorehdr, memsz) < 0)
return -1;
cmdline_add_memmap(mod_cmdline, memmap_p);
if (!bzImage_support_efi_boot)
--
1.8.5.3
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH RESEND v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap()
2014-04-11 2:23 ` [PATCH RESEND v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap() WANG Chao
@ 2014-04-14 2:11 ` Simon Horman
2014-04-14 5:41 ` WANG Chao
0 siblings, 1 reply; 19+ messages in thread
From: Simon Horman @ 2014-04-14 2:11 UTC (permalink / raw)
To: WANG Chao; +Cc: kexec, linn, hpa, dyoung, trenn, vgoyal, ebiederm
On Fri, Apr 11, 2014 at 10:23:23AM +0800, WANG Chao wrote:
> This change will be used later:
>
> add_memmap(.., int *nr_memmap, .., int type);
> delete_memmap(.., int *nr_memmap, ..);
Could you please include an explanation of the motivation for this
change in the change log (i.e. here).
>
> Signed-off-by: WANG Chao <chaowang@redhat.com>
> ---
> kexec/arch/i386/crashdump-x86.c | 22 +++++++++++++---------
> 1 file changed, 13 insertions(+), 9 deletions(-)
>
> diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
> index 72bce0b..e695eaf 100644
> --- a/kexec/arch/i386/crashdump-x86.c
> +++ b/kexec/arch/i386/crashdump-x86.c
> @@ -476,8 +476,8 @@ static int exclude_region(int *nr_ranges, uint64_t start, uint64_t end)
>
> /* Adds a segment from list of memory regions which new kernel can use to
> * boot. Segment start and end should be aligned to 1K boundary. */
> -static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
> - size_t size)
> +static int add_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
> + unsigned long long addr, size_t size, int type)
> {
> int i, j, nr_entries = 0, tidx = 0, align = 1024;
> unsigned long long mstart, mend;
> @@ -514,6 +514,8 @@ static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
> memmap_p[j+1] = memmap_p[j];
> memmap_p[tidx].start = addr;
> memmap_p[tidx].end = addr + size - 1;
> + memmap_p[tidx].type = type;
> + *nr_memmap_p = nr_entries + 1;
>
> dbgprintf("Memmap after adding segment\n");
> for (i = 0; i < CRASH_MAX_MEMMAP_NR; i++) {
> @@ -530,8 +532,8 @@ static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
>
> /* Removes a segment from list of memory regions which new kernel can use to
> * boot. Segment start and end should be aligned to 1K boundary. */
> -static int delete_memmap(struct memory_range *memmap_p, unsigned long long addr,
> - size_t size)
> +static int delete_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
> + unsigned long long addr, size_t size)
> {
> int i, j, nr_entries = 0, tidx = -1, operation = 0, align = 1024;
> unsigned long long mstart, mend;
> @@ -593,12 +595,14 @@ static int delete_memmap(struct memory_range *memmap_p, unsigned long long addr,
> for (j = nr_entries-1; j > tidx; j--)
> memmap_p[j+1] = memmap_p[j];
> memmap_p[tidx+1] = temp_region;
> + *nr_memmap_p = nr_entries + 1;
> }
> if ((operation == -1) && tidx >=0) {
> /* Delete the exact match memory region. */
> for (j = i+1; j < CRASH_MAX_MEMMAP_NR; j++)
> memmap_p[j-1] = memmap_p[j];
> memmap_p[j-1].start = memmap_p[j-1].end = 0;
> + *nr_memmap_p = nr_entries - 1;
> }
>
> dbgprintf("Memmap after deleting segment\n");
> @@ -865,7 +869,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
> {
> void *tmp;
> unsigned long sz, bufsz, memsz, elfcorehdr;
> - int nr_ranges = 0, align = 1024, i;
> + int nr_ranges = 0, nr_memmap_p = 0, align = 1024, i;
> struct memory_range *mem_range, *memmap_p;
> struct crash_elf_info elf_info;
> unsigned kexec_arch;
> @@ -941,10 +945,10 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
> sz = (sizeof(struct memory_range) * CRASH_MAX_MEMMAP_NR);
> memmap_p = xmalloc(sz);
> memset(memmap_p, 0, sz);
> - add_memmap(memmap_p, info->backup_src_start, info->backup_src_size);
> + add_memmap(memmap_p, &nr_memmap_p, info->backup_src_start, info->backup_src_size, RANGE_RAM);
> for (i = 0; i < crash_reserved_mem_nr; i++) {
> sz = crash_reserved_mem[i].end - crash_reserved_mem[i].start +1;
> - if (add_memmap(memmap_p, crash_reserved_mem[i].start, sz) < 0)
> + if (add_memmap(memmap_p, &nr_memmap_p, crash_reserved_mem[i].start, sz, RANGE_RAM) < 0)
> return ENOCRASHKERNEL;
> }
>
> @@ -957,7 +961,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
> 0, max_addr, -1);
> dbgprintf("Created backup segment at 0x%lx\n",
> info->backup_start);
> - if (delete_memmap(memmap_p, info->backup_start, sz) < 0)
> + if (delete_memmap(memmap_p, &nr_memmap_p, info->backup_start, sz) < 0)
> return EFAILED;
> }
>
> @@ -993,7 +997,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
> elfcorehdr = add_buffer(info, tmp, bufsz, memsz, align, min_base,
> max_addr, -1);
> dbgprintf("Created elf header segment at 0x%lx\n", elfcorehdr);
> - if (delete_memmap(memmap_p, elfcorehdr, memsz) < 0)
> + if (delete_memmap(memmap_p, &nr_memmap_p, elfcorehdr, memsz) < 0)
> return -1;
> cmdline_add_memmap(mod_cmdline, memmap_p);
> if (!bzImage_support_efi_boot)
> --
> 1.8.5.3
>
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH RESEND v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap()
2014-04-14 2:11 ` Simon Horman
@ 2014-04-14 5:41 ` WANG Chao
0 siblings, 0 replies; 19+ messages in thread
From: WANG Chao @ 2014-04-14 5:41 UTC (permalink / raw)
To: Simon Horman; +Cc: kexec, linn, hpa, dyoung, trenn, vgoyal, ebiederm
On 04/14/14 at 11:11am, Simon Horman wrote:
> On Fri, Apr 11, 2014 at 10:23:23AM +0800, WANG Chao wrote:
> > This change will be used later:
> >
> > add_memmap(.., int *nr_memmap, .., int type);
> > delete_memmap(.., int *nr_memmap, ..);
>
> Could you please include an explanation of the motivation for this
> change in the change log (i.e. here).
memmap_p[] is statically allocated for a certain amount. It will be used
later when mapping these memory maps to e820 map.
It's convenient to keep track of the count of memmap_p (nr_memmap) in
add_memmap and delete_memmap, because the counting has already been
taken care of in these two functions.
The original add_memmap() can only add memory range of RANGE_RAM type.
For adding other types of memory range, add another argument for
indicating the type.
Thanks
WANG Chao
>
> >
> > Signed-off-by: WANG Chao <chaowang@redhat.com>
> > ---
> > kexec/arch/i386/crashdump-x86.c | 22 +++++++++++++---------
> > 1 file changed, 13 insertions(+), 9 deletions(-)
> >
> > diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
> > index 72bce0b..e695eaf 100644
> > --- a/kexec/arch/i386/crashdump-x86.c
> > +++ b/kexec/arch/i386/crashdump-x86.c
> > @@ -476,8 +476,8 @@ static int exclude_region(int *nr_ranges, uint64_t start, uint64_t end)
> >
> > /* Adds a segment from list of memory regions which new kernel can use to
> > * boot. Segment start and end should be aligned to 1K boundary. */
> > -static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
> > - size_t size)
> > +static int add_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
> > + unsigned long long addr, size_t size, int type)
> > {
> > int i, j, nr_entries = 0, tidx = 0, align = 1024;
> > unsigned long long mstart, mend;
> > @@ -514,6 +514,8 @@ static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
> > memmap_p[j+1] = memmap_p[j];
> > memmap_p[tidx].start = addr;
> > memmap_p[tidx].end = addr + size - 1;
> > + memmap_p[tidx].type = type;
> > + *nr_memmap_p = nr_entries + 1;
> >
> > dbgprintf("Memmap after adding segment\n");
> > for (i = 0; i < CRASH_MAX_MEMMAP_NR; i++) {
> > @@ -530,8 +532,8 @@ static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
> >
> > /* Removes a segment from list of memory regions which new kernel can use to
> > * boot. Segment start and end should be aligned to 1K boundary. */
> > -static int delete_memmap(struct memory_range *memmap_p, unsigned long long addr,
> > - size_t size)
> > +static int delete_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
> > + unsigned long long addr, size_t size)
> > {
> > int i, j, nr_entries = 0, tidx = -1, operation = 0, align = 1024;
> > unsigned long long mstart, mend;
> > @@ -593,12 +595,14 @@ static int delete_memmap(struct memory_range *memmap_p, unsigned long long addr,
> > for (j = nr_entries-1; j > tidx; j--)
> > memmap_p[j+1] = memmap_p[j];
> > memmap_p[tidx+1] = temp_region;
> > + *nr_memmap_p = nr_entries + 1;
> > }
> > if ((operation == -1) && tidx >=0) {
> > /* Delete the exact match memory region. */
> > for (j = i+1; j < CRASH_MAX_MEMMAP_NR; j++)
> > memmap_p[j-1] = memmap_p[j];
> > memmap_p[j-1].start = memmap_p[j-1].end = 0;
> > + *nr_memmap_p = nr_entries - 1;
> > }
> >
> > dbgprintf("Memmap after deleting segment\n");
> > @@ -865,7 +869,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
> > {
> > void *tmp;
> > unsigned long sz, bufsz, memsz, elfcorehdr;
> > - int nr_ranges = 0, align = 1024, i;
> > + int nr_ranges = 0, nr_memmap_p = 0, align = 1024, i;
> > struct memory_range *mem_range, *memmap_p;
> > struct crash_elf_info elf_info;
> > unsigned kexec_arch;
> > @@ -941,10 +945,10 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
> > sz = (sizeof(struct memory_range) * CRASH_MAX_MEMMAP_NR);
> > memmap_p = xmalloc(sz);
> > memset(memmap_p, 0, sz);
> > - add_memmap(memmap_p, info->backup_src_start, info->backup_src_size);
> > + add_memmap(memmap_p, &nr_memmap_p, info->backup_src_start, info->backup_src_size, RANGE_RAM);
> > for (i = 0; i < crash_reserved_mem_nr; i++) {
> > sz = crash_reserved_mem[i].end - crash_reserved_mem[i].start +1;
> > - if (add_memmap(memmap_p, crash_reserved_mem[i].start, sz) < 0)
> > + if (add_memmap(memmap_p, &nr_memmap_p, crash_reserved_mem[i].start, sz, RANGE_RAM) < 0)
> > return ENOCRASHKERNEL;
> > }
> >
> > @@ -957,7 +961,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
> > 0, max_addr, -1);
> > dbgprintf("Created backup segment at 0x%lx\n",
> > info->backup_start);
> > - if (delete_memmap(memmap_p, info->backup_start, sz) < 0)
> > + if (delete_memmap(memmap_p, &nr_memmap_p, info->backup_start, sz) < 0)
> > return EFAILED;
> > }
> >
> > @@ -993,7 +997,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
> > elfcorehdr = add_buffer(info, tmp, bufsz, memsz, align, min_base,
> > max_addr, -1);
> > dbgprintf("Created elf header segment at 0x%lx\n", elfcorehdr);
> > - if (delete_memmap(memmap_p, elfcorehdr, memsz) < 0)
> > + if (delete_memmap(memmap_p, &nr_memmap_p, elfcorehdr, memsz) < 0)
> > return -1;
> > cmdline_add_memmap(mod_cmdline, memmap_p);
> > if (!bzImage_support_efi_boot)
> > --
> > 1.8.5.3
> >
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH RESEND v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p
2014-04-11 2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
2014-04-11 2:23 ` [PATCH RESEND v5 01/10] x86, cleanup: fix indent WANG Chao
2014-04-11 2:23 ` [PATCH RESEND v5 02/10] x86, cleanup: add extra arguments to add_memmap() and delete_memmap() WANG Chao
@ 2014-04-11 2:23 ` WANG Chao
2014-04-14 2:12 ` Simon Horman
2014-04-11 2:23 ` [PATCH RESEND v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM WANG Chao
` (6 subsequent siblings)
9 siblings, 1 reply; 19+ messages in thread
From: WANG Chao @ 2014-04-11 2:23 UTC (permalink / raw)
To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec
Now memmap_p contains all the memory range for 2nd kernel boot.
Signed-off-by: WANG Chao <chaowang@redhat.com>
---
kexec/arch/i386/crashdump-x86.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
index e695eaf..43eb8f7 100644
--- a/kexec/arch/i386/crashdump-x86.c
+++ b/kexec/arch/i386/crashdump-x86.c
@@ -1006,12 +1006,15 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
/* Inform second kernel about the presence of ACPI tables. */
for (i = 0; i < CRASH_MAX_MEMORY_RANGES; i++) {
- unsigned long start, end;
+ unsigned long start, end, size, type;
if ( !( mem_range[i].type == RANGE_ACPI
|| mem_range[i].type == RANGE_ACPI_NVS) )
continue;
start = mem_range[i].start;
end = mem_range[i].end;
+ type = mem_range[i].type;
+ size = end - start;
+ add_memmap(memmap_p, &nr_memmap_p, start, size, type);
cmdline_add_memmap_acpi(mod_cmdline, start, end);
}
return 0;
--
1.8.5.3
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH RESEND v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p
2014-04-11 2:23 ` [PATCH RESEND v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p WANG Chao
@ 2014-04-14 2:12 ` Simon Horman
2014-04-14 5:24 ` WANG Chao
0 siblings, 1 reply; 19+ messages in thread
From: Simon Horman @ 2014-04-14 2:12 UTC (permalink / raw)
To: WANG Chao; +Cc: kexec, linn, hpa, dyoung, trenn, vgoyal, ebiederm
On Fri, Apr 11, 2014 at 10:23:24AM +0800, WANG Chao wrote:
> Now memmap_p contains all the memory range for 2nd kernel boot.
Could you please include a fuller explanation of what this patch
achieves and the motivation for it.
>
> Signed-off-by: WANG Chao <chaowang@redhat.com>
> ---
> kexec/arch/i386/crashdump-x86.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
> index e695eaf..43eb8f7 100644
> --- a/kexec/arch/i386/crashdump-x86.c
> +++ b/kexec/arch/i386/crashdump-x86.c
> @@ -1006,12 +1006,15 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
>
> /* Inform second kernel about the presence of ACPI tables. */
> for (i = 0; i < CRASH_MAX_MEMORY_RANGES; i++) {
> - unsigned long start, end;
> + unsigned long start, end, size, type;
> if ( !( mem_range[i].type == RANGE_ACPI
> || mem_range[i].type == RANGE_ACPI_NVS) )
> continue;
> start = mem_range[i].start;
> end = mem_range[i].end;
> + type = mem_range[i].type;
> + size = end - start;
> + add_memmap(memmap_p, &nr_memmap_p, start, size, type);
> cmdline_add_memmap_acpi(mod_cmdline, start, end);
> }
> return 0;
> --
> 1.8.5.3
>
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH RESEND v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p
2014-04-14 2:12 ` Simon Horman
@ 2014-04-14 5:24 ` WANG Chao
0 siblings, 0 replies; 19+ messages in thread
From: WANG Chao @ 2014-04-14 5:24 UTC (permalink / raw)
To: Simon Horman; +Cc: kexec, linn, hpa, dyoung, trenn, vgoyal, ebiederm
On 04/14/14 at 11:12am, Simon Horman wrote:
> On Fri, Apr 11, 2014 at 10:23:24AM +0800, WANG Chao wrote:
> > Now memmap_p contains all the memory range for 2nd kernel boot.
>
> Could you please include a fuller explanation of what this patch
> achieves and the motivation for it.
In load_crashdump_segments(), memmap_p used to contain RANGE_RAM memory
range for booting 2nd kernel. Now adding types of RANGE_ACPI and
RANGE_ACPI_NVS to memmap_p, so later we can pass all the types of memory
range to 2nd kernel. These all types of memory ranges are all stored in
memmap_p.
I'll add above comment to patch description.
Thanks
WANG Chao
>
> >
> > Signed-off-by: WANG Chao <chaowang@redhat.com>
> > ---
> > kexec/arch/i386/crashdump-x86.c | 5 ++++-
> > 1 file changed, 4 insertions(+), 1 deletion(-)
> >
> > diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
> > index e695eaf..43eb8f7 100644
> > --- a/kexec/arch/i386/crashdump-x86.c
> > +++ b/kexec/arch/i386/crashdump-x86.c
> > @@ -1006,12 +1006,15 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
> >
> > /* Inform second kernel about the presence of ACPI tables. */
> > for (i = 0; i < CRASH_MAX_MEMORY_RANGES; i++) {
> > - unsigned long start, end;
> > + unsigned long start, end, size, type;
> > if ( !( mem_range[i].type == RANGE_ACPI
> > || mem_range[i].type == RANGE_ACPI_NVS) )
> > continue;
> > start = mem_range[i].start;
> > end = mem_range[i].end;
> > + type = mem_range[i].type;
> > + size = end - start;
> > + add_memmap(memmap_p, &nr_memmap_p, start, size, type);
> > cmdline_add_memmap_acpi(mod_cmdline, start, end);
> > }
> > return 0;
> > --
> > 1.8.5.3
> >
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH RESEND v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM
2014-04-11 2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
` (2 preceding siblings ...)
2014-04-11 2:23 ` [PATCH RESEND v5 03/10] x86, cleanup: add other types of memory range for 2nd kernel boot to memmap_p WANG Chao
@ 2014-04-11 2:23 ` WANG Chao
2014-04-14 2:13 ` Simon Horman
2014-04-11 2:23 ` [PATCH RESEND v5 05/10] x86, cleanup: use dbgprint_mem_range for memory range debugging WANG Chao
` (5 subsequent siblings)
9 siblings, 1 reply; 19+ messages in thread
From: WANG Chao @ 2014-04-11 2:23 UTC (permalink / raw)
To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec
Signed-off-by: WANG Chao <chaowang@redhat.com>
---
kexec/arch/i386/crashdump-x86.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
index 43eb8f7..4072c10 100644
--- a/kexec/arch/i386/crashdump-x86.c
+++ b/kexec/arch/i386/crashdump-x86.c
@@ -482,8 +482,8 @@ static int add_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
int i, j, nr_entries = 0, tidx = 0, align = 1024;
unsigned long long mstart, mend;
- /* Do alignment check. */
- if ((addr%align) || (size%align))
+ /* Do alignment check if it's RANGE_RAM */
+ if ((type == RANGE_RAM) && ((addr%align) || (size%align)))
return -1;
/* Make sure at least one entry in list is free. */
--
1.8.5.3
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH RESEND v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM
2014-04-11 2:23 ` [PATCH RESEND v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM WANG Chao
@ 2014-04-14 2:13 ` Simon Horman
2014-04-14 5:17 ` WANG Chao
0 siblings, 1 reply; 19+ messages in thread
From: Simon Horman @ 2014-04-14 2:13 UTC (permalink / raw)
To: WANG Chao; +Cc: kexec, linn, hpa, dyoung, trenn, vgoyal, ebiederm
Could you please explain why this is necessary.
Also, it seems to me that it would make sense to move this
patch so that is is immediately after patch 2 in the series.
On Fri, Apr 11, 2014 at 10:23:25AM +0800, WANG Chao wrote:
> Signed-off-by: WANG Chao <chaowang@redhat.com>
> ---
> kexec/arch/i386/crashdump-x86.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
> index 43eb8f7..4072c10 100644
> --- a/kexec/arch/i386/crashdump-x86.c
> +++ b/kexec/arch/i386/crashdump-x86.c
> @@ -482,8 +482,8 @@ static int add_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
> int i, j, nr_entries = 0, tidx = 0, align = 1024;
> unsigned long long mstart, mend;
>
> - /* Do alignment check. */
> - if ((addr%align) || (size%align))
> + /* Do alignment check if it's RANGE_RAM */
> + if ((type == RANGE_RAM) && ((addr%align) || (size%align)))
> return -1;
>
> /* Make sure at least one entry in list is free. */
> --
> 1.8.5.3
>
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH RESEND v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM
2014-04-14 2:13 ` Simon Horman
@ 2014-04-14 5:17 ` WANG Chao
0 siblings, 0 replies; 19+ messages in thread
From: WANG Chao @ 2014-04-14 5:17 UTC (permalink / raw)
To: Simon Horman; +Cc: kexec, linn, hpa, dyoung, trenn, vgoyal, ebiederm
On 04/14/14 at 11:13am, Simon Horman wrote:
> Could you please explain why this is necessary.
add_memmap() will also add memory range with type RANGE_ACPI and
RANGE_ACPI_NVS (RANGE_RESERVED in the future) besides RANGE_RAM to
memmap_p.
Among these types of memory range, only RANGE_RAM needs to
be aligned with certain alignment. RANGE_ACPI, RANGE_ACPI_NVS and
RANGE_RESERVED doesn't have to be aligned.
I'll add above comment to the patch description.
>
> Also, it seems to me that it would make sense to move this
> patch so that is is immediately after patch 2 in the series.
Will do.
>
> On Fri, Apr 11, 2014 at 10:23:25AM +0800, WANG Chao wrote:
> > Signed-off-by: WANG Chao <chaowang@redhat.com>
> > ---
> > kexec/arch/i386/crashdump-x86.c | 4 ++--
> > 1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
> > index 43eb8f7..4072c10 100644
> > --- a/kexec/arch/i386/crashdump-x86.c
> > +++ b/kexec/arch/i386/crashdump-x86.c
> > @@ -482,8 +482,8 @@ static int add_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
> > int i, j, nr_entries = 0, tidx = 0, align = 1024;
> > unsigned long long mstart, mend;
> >
> > - /* Do alignment check. */
> > - if ((addr%align) || (size%align))
> > + /* Do alignment check if it's RANGE_RAM */
> > + if ((type == RANGE_RAM) && ((addr%align) || (size%align)))
> > return -1;
> >
> > /* Make sure at least one entry in list is free. */
> > --
> > 1.8.5.3
> >
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH RESEND v5 05/10] x86, cleanup: use dbgprint_mem_range for memory range debugging
2014-04-11 2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
` (3 preceding siblings ...)
2014-04-11 2:23 ` [PATCH RESEND v5 04/10] x86, cleanup: add_memmap() only do alignment check on RANGE_RAM WANG Chao
@ 2014-04-11 2:23 ` WANG Chao
2014-04-11 2:23 ` [PATCH RESEND v5 06/10] x86, cleanup: increase CRASH_MAX_MEMMAP_NR up to CRASH_MAX_MEMORY_RANGES WANG Chao
` (4 subsequent siblings)
9 siblings, 0 replies; 19+ messages in thread
From: WANG Chao @ 2014-04-11 2:23 UTC (permalink / raw)
To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec
Signed-off-by: WANG Chao <chaowang@redhat.com>
---
kexec/arch/i386/crashdump-x86.c | 26 +++-----------------------
1 file changed, 3 insertions(+), 23 deletions(-)
diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
index 4072c10..2437c30 100644
--- a/kexec/arch/i386/crashdump-x86.c
+++ b/kexec/arch/i386/crashdump-x86.c
@@ -517,15 +517,7 @@ static int add_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
memmap_p[tidx].type = type;
*nr_memmap_p = nr_entries + 1;
- dbgprintf("Memmap after adding segment\n");
- for (i = 0; i < CRASH_MAX_MEMMAP_NR; i++) {
- mstart = memmap_p[i].start;
- mend = memmap_p[i].end;
- if (mstart == 0 && mend == 0)
- break;
- dbgprintf("%016llx - %016llx\n",
- mstart, mend);
- }
+ dbgprint_mem_range("Memmap after adding segment", memmap_p, *nr_memmap_p);
return 0;
}
@@ -605,16 +597,7 @@ static int delete_memmap(struct memory_range *memmap_p, int *nr_memmap_p,
*nr_memmap_p = nr_entries - 1;
}
- dbgprintf("Memmap after deleting segment\n");
- for (i = 0; i < CRASH_MAX_MEMMAP_NR; i++) {
- mstart = memmap_p[i].start;
- mend = memmap_p[i].end;
- if (mstart == 0 && mend == 0) {
- break;
- }
- dbgprintf("%016llx - %016llx\n",
- mstart, mend);
- }
+ dbgprint_mem_range("Memmap after deleting segment", memmap_p, *nr_memmap_p);
return 0;
}
@@ -913,10 +896,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
get_backup_area(info, mem_range, nr_ranges);
- dbgprintf("CRASH MEMORY RANGES\n");
-
- for(i = 0; i < nr_ranges; ++i)
- dbgprintf("%016Lx-%016Lx\n", mem_range[i].start, mem_range[i].end);
+ dbgprint_mem_range("CRASH MEMORY RANGES", mem_range, nr_ranges);
/*
* if the core type has not been set on command line, set it here
--
1.8.5.3
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH RESEND v5 06/10] x86, cleanup: increase CRASH_MAX_MEMMAP_NR up to CRASH_MAX_MEMORY_RANGES
2014-04-11 2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
` (4 preceding siblings ...)
2014-04-11 2:23 ` [PATCH RESEND v5 05/10] x86, cleanup: use dbgprint_mem_range for memory range debugging WANG Chao
@ 2014-04-11 2:23 ` WANG Chao
2014-04-11 2:23 ` [PATCH RESEND v5 07/10] x86, cleanup: Store crash memory ranges kexec_info WANG Chao
` (3 subsequent siblings)
9 siblings, 0 replies; 19+ messages in thread
From: WANG Chao @ 2014-04-11 2:23 UTC (permalink / raw)
To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec
CRASH_MAX_MEMMAP_NR now is defined (KEXEC_MAX_SEGMENTS + 2) which is way
lower than the memmap we can pass to 2nd kernel.
Signed-off-by: WANG Chao <chaowang@redhat.com>
---
kexec/arch/i386/crashdump-x86.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kexec/arch/i386/crashdump-x86.h b/kexec/arch/i386/crashdump-x86.h
index b61cf0a..0edeb27 100644
--- a/kexec/arch/i386/crashdump-x86.h
+++ b/kexec/arch/i386/crashdump-x86.h
@@ -20,8 +20,8 @@ int load_crashdump_segments(struct kexec_info *info, char *mod_cmdline,
/* Kernel text size */
#define X86_64_KERNEL_TEXT_SIZE (512UL*1024*1024)
-#define CRASH_MAX_MEMMAP_NR (KEXEC_MAX_SEGMENTS + 1)
#define CRASH_MAX_MEMORY_RANGES (MAX_MEMORY_RANGES + 2)
+#define CRASH_MAX_MEMMAP_NR CRASH_MAX_MEMORY_RANGES
/* Backup Region, First 640K of System RAM. */
#define BACKUP_SRC_START 0x00000000
--
1.8.5.3
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH RESEND v5 07/10] x86, cleanup: Store crash memory ranges kexec_info
2014-04-11 2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
` (5 preceding siblings ...)
2014-04-11 2:23 ` [PATCH RESEND v5 06/10] x86, cleanup: increase CRASH_MAX_MEMMAP_NR up to CRASH_MAX_MEMORY_RANGES WANG Chao
@ 2014-04-11 2:23 ` WANG Chao
2014-04-11 2:23 ` [PATCH RESEND v5 08/10] x86, cleanup: Add a funtion add_setup_data() WANG Chao
` (2 subsequent siblings)
9 siblings, 0 replies; 19+ messages in thread
From: WANG Chao @ 2014-04-11 2:23 UTC (permalink / raw)
To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec
Add two new members to kexec_info structure:
struct memory_range *crash_range
int nr_crash_ranges;
crash_range contains the memory ranges used to boot 2nd kernel.
nr_crash_ranges contains the count of the crash memory ranges.
Signed-off-by: WANG Chao <chaowang@redhat.com>
---
kexec/arch/i386/crashdump-x86.c | 6 ++++++
kexec/kexec.h | 2 ++
2 files changed, 8 insertions(+)
diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
index 2437c30..2a6871d 100644
--- a/kexec/arch/i386/crashdump-x86.c
+++ b/kexec/arch/i386/crashdump-x86.c
@@ -997,6 +997,12 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
add_memmap(memmap_p, &nr_memmap_p, start, size, type);
cmdline_add_memmap_acpi(mod_cmdline, start, end);
}
+
+ /* Store 2nd kernel boot memory ranges for later reference in
+ * x86-setup-linux.c: setup_linux_system_parameters() */
+ info->crash_range = memmap_p;
+ info->nr_crash_ranges = nr_memmap_p;
+
return 0;
}
diff --git a/kexec/kexec.h b/kexec/kexec.h
index d69bba2..22d4a42 100644
--- a/kexec/kexec.h
+++ b/kexec/kexec.h
@@ -148,6 +148,8 @@ struct kexec_info {
int nr_segments;
struct memory_range *memory_range;
int memory_ranges;
+ struct memory_range *crash_range;
+ int nr_crash_ranges;
void *entry;
struct mem_ehdr rhdr;
unsigned long backup_start;
--
1.8.5.3
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH RESEND v5 08/10] x86, cleanup: Add a funtion add_setup_data()
2014-04-11 2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
` (6 preceding siblings ...)
2014-04-11 2:23 ` [PATCH RESEND v5 07/10] x86, cleanup: Store crash memory ranges kexec_info WANG Chao
@ 2014-04-11 2:23 ` WANG Chao
2014-04-14 2:16 ` Simon Horman
2014-04-11 2:23 ` [PATCH RESEND v5 09/10] x86: add --pass-memmap-cmdline option WANG Chao
2014-04-11 2:23 ` [PATCH RESEND v5 10/10] x86: Pass memory range via E820 for kdump WANG Chao
9 siblings, 1 reply; 19+ messages in thread
From: WANG Chao @ 2014-04-11 2:23 UTC (permalink / raw)
To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec
add_setup_data() is used to add an instance to the single linked list
of setup_data structure.
Signed-off-by: WANG Chao <chaowang@redhat.com>
---
kexec/arch/i386/x86-linux-setup.c | 26 ++++++++++++++++++++------
1 file changed, 20 insertions(+), 6 deletions(-)
diff --git a/kexec/arch/i386/x86-linux-setup.c b/kexec/arch/i386/x86-linux-setup.c
index e04e45d..8ed36cc 100644
--- a/kexec/arch/i386/x86-linux-setup.c
+++ b/kexec/arch/i386/x86-linux-setup.c
@@ -603,6 +603,22 @@ struct efi_info {
};
/*
+ * Add another instance to single linked list of struct setup_data.
+ * Please refer to kernel Documentation/x86/boot.txt for more details
+ * about setup_data structure.
+ */
+static void add_setup_data(struct kexec_info *info,
+ struct x86_linux_param_header *real_mode,
+ struct setup_data *sd)
+{
+ int sdsize = sizeof(struct setup_data) + sd->len;
+
+ sd->next = real_mode->setup_data;
+ real_mode->setup_data = add_buffer(info, sd, sdsize, sdsize, getpagesize(),
+ 0x100000, ULONG_MAX, INT_MAX);
+}
+
+/*
* setup_efi_data will collect below data and pass them to 2nd kernel.
* 1) SMBIOS, fw_vendor, runtime, config_table, they are passed via x86
* setup_data.
@@ -611,11 +627,11 @@ struct efi_info {
static int setup_efi_data(struct kexec_info *info,
struct x86_linux_param_header *real_mode)
{
- int64_t setup_data_paddr, memmap_paddr;
+ int64_t memmap_paddr;
struct setup_data *sd;
struct efi_setup_data *esd;
struct efi_mem_descriptor *maps;
- int nr_maps, size, sdsize, ret = 0;
+ int nr_maps, size, ret = 0;
struct efi_info *ei = (struct efi_info *)real_mode->efi_info;
ret = access("/sys/firmware/efi/systab", F_OK);
@@ -648,10 +664,8 @@ static int setup_efi_data(struct kexec_info *info,
sd->len = sizeof(*esd);
memcpy(sd->data, esd, sizeof(*esd));
free(esd);
- sdsize = sd->len + sizeof(struct setup_data);
- setup_data_paddr = add_buffer(info, sd, sdsize, sdsize, getpagesize(),
- 0x100000, ULONG_MAX, INT_MAX);
- real_mode->setup_data = setup_data_paddr;
+
+ add_setup_data(info, real_mode, sd);
size = nr_maps * sizeof(struct efi_mem_descriptor);
memmap_paddr = add_buffer(info, maps, size, size, getpagesize(),
--
1.8.5.3
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH RESEND v5 08/10] x86, cleanup: Add a funtion add_setup_data()
2014-04-11 2:23 ` [PATCH RESEND v5 08/10] x86, cleanup: Add a funtion add_setup_data() WANG Chao
@ 2014-04-14 2:16 ` Simon Horman
0 siblings, 0 replies; 19+ messages in thread
From: Simon Horman @ 2014-04-14 2:16 UTC (permalink / raw)
To: WANG Chao; +Cc: kexec, linn, hpa, dyoung, trenn, vgoyal, ebiederm
On Fri, Apr 11, 2014 at 10:23:29AM +0800, WANG Chao wrote:
> add_setup_data() is used to add an instance to the single linked list
> of setup_data structure.
>
> Signed-off-by: WANG Chao <chaowang@redhat.com>
Thanks, applied.
> ---
> kexec/arch/i386/x86-linux-setup.c | 26 ++++++++++++++++++++------
> 1 file changed, 20 insertions(+), 6 deletions(-)
>
> diff --git a/kexec/arch/i386/x86-linux-setup.c b/kexec/arch/i386/x86-linux-setup.c
> index e04e45d..8ed36cc 100644
> --- a/kexec/arch/i386/x86-linux-setup.c
> +++ b/kexec/arch/i386/x86-linux-setup.c
> @@ -603,6 +603,22 @@ struct efi_info {
> };
>
> /*
> + * Add another instance to single linked list of struct setup_data.
> + * Please refer to kernel Documentation/x86/boot.txt for more details
> + * about setup_data structure.
> + */
> +static void add_setup_data(struct kexec_info *info,
> + struct x86_linux_param_header *real_mode,
> + struct setup_data *sd)
> +{
> + int sdsize = sizeof(struct setup_data) + sd->len;
> +
> + sd->next = real_mode->setup_data;
> + real_mode->setup_data = add_buffer(info, sd, sdsize, sdsize, getpagesize(),
> + 0x100000, ULONG_MAX, INT_MAX);
> +}
> +
> +/*
> * setup_efi_data will collect below data and pass them to 2nd kernel.
> * 1) SMBIOS, fw_vendor, runtime, config_table, they are passed via x86
> * setup_data.
> @@ -611,11 +627,11 @@ struct efi_info {
> static int setup_efi_data(struct kexec_info *info,
> struct x86_linux_param_header *real_mode)
> {
> - int64_t setup_data_paddr, memmap_paddr;
> + int64_t memmap_paddr;
> struct setup_data *sd;
> struct efi_setup_data *esd;
> struct efi_mem_descriptor *maps;
> - int nr_maps, size, sdsize, ret = 0;
> + int nr_maps, size, ret = 0;
> struct efi_info *ei = (struct efi_info *)real_mode->efi_info;
>
> ret = access("/sys/firmware/efi/systab", F_OK);
> @@ -648,10 +664,8 @@ static int setup_efi_data(struct kexec_info *info,
> sd->len = sizeof(*esd);
> memcpy(sd->data, esd, sizeof(*esd));
> free(esd);
> - sdsize = sd->len + sizeof(struct setup_data);
> - setup_data_paddr = add_buffer(info, sd, sdsize, sdsize, getpagesize(),
> - 0x100000, ULONG_MAX, INT_MAX);
> - real_mode->setup_data = setup_data_paddr;
> +
> + add_setup_data(info, real_mode, sd);
>
> size = nr_maps * sizeof(struct efi_mem_descriptor);
> memmap_paddr = add_buffer(info, maps, size, size, getpagesize(),
> --
> 1.8.5.3
>
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH RESEND v5 09/10] x86: add --pass-memmap-cmdline option
2014-04-11 2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
` (7 preceding siblings ...)
2014-04-11 2:23 ` [PATCH RESEND v5 08/10] x86, cleanup: Add a funtion add_setup_data() WANG Chao
@ 2014-04-11 2:23 ` WANG Chao
2014-04-11 2:23 ` [PATCH RESEND v5 10/10] x86: Pass memory range via E820 for kdump WANG Chao
9 siblings, 0 replies; 19+ messages in thread
From: WANG Chao @ 2014-04-11 2:23 UTC (permalink / raw)
To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec
--pass-memmap-cmdline is used for pass memmap=exactmap cmdline for 2nd
kernel. Later we will use this option to disable passing E820 memmap
method but use the old exactmap method.
Signed-off-by: WANG Chao <chaowang@redhat.com>
Tested-by: Linn Crosetto <linn@hp.com>
---
kexec/arch/i386/include/arch/options.h | 2 ++
kexec/arch/i386/kexec-x86.c | 4 ++++
kexec/arch/i386/kexec-x86.h | 1 +
kexec/arch/x86_64/kexec-x86_64.c | 5 +++++
4 files changed, 12 insertions(+)
diff --git a/kexec/arch/i386/include/arch/options.h b/kexec/arch/i386/include/arch/options.h
index aaac731..e5300b5 100644
--- a/kexec/arch/i386/include/arch/options.h
+++ b/kexec/arch/i386/include/arch/options.h
@@ -30,6 +30,7 @@
#define OPT_VGA (OPT_ARCH_MAX+8)
#define OPT_REAL_MODE (OPT_ARCH_MAX+9)
#define OPT_ENTRY_32BIT (OPT_ARCH_MAX+10)
+#define OPT_PASS_MEMMAP_CMDLINE (OPT_ARCH_MAX+11)
/* Options relevant to the architecture (excluding loader-specific ones): */
#define KEXEC_ARCH_OPTIONS \
@@ -41,6 +42,7 @@
{ "console-serial", 0, 0, OPT_CONSOLE_SERIAL }, \
{ "elf32-core-headers", 0, 0, OPT_ELF32_CORE }, \
{ "elf64-core-headers", 0, 0, OPT_ELF64_CORE }, \
+ { "pass-memmap-cmdline", 0, 0, OPT_PASS_MEMMAP_CMDLINE }, \
#define KEXEC_ARCH_OPT_STR KEXEC_OPT_STR ""
diff --git a/kexec/arch/i386/kexec-x86.c b/kexec/arch/i386/kexec-x86.c
index 014ecd5..0b58dff 100644
--- a/kexec/arch/i386/kexec-x86.c
+++ b/kexec/arch/i386/kexec-x86.c
@@ -54,6 +54,7 @@ void arch_usage(void)
" --console-serial Enable the serial console\n"
" --elf32-core-headers Prepare core headers in ELF32 format\n"
" --elf64-core-headers Prepare core headers in ELF64 format\n"
+ " --pass--memmap-cmdline Pass memory map via command line in kexec on panic case\n"
);
}
@@ -64,6 +65,7 @@ struct arch_options_t arch_options = {
.console_vga = 0,
.console_serial = 0,
.core_header_type = CORE_TYPE_UNDEF,
+ .pass_memmap_cmdline = 0,
};
int arch_process_options(int argc, char **argv)
@@ -133,6 +135,8 @@ int arch_process_options(int argc, char **argv)
case OPT_ELF64_CORE:
arch_options.core_header_type = CORE_TYPE_ELF64;
break;
+ case OPT_PASS_MEMMAP_CMDLINE:
+ arch_options.pass_memmap_cmdline = 1;
}
}
/* Reset getopt for the next pass; called in other source modules */
diff --git a/kexec/arch/i386/kexec-x86.h b/kexec/arch/i386/kexec-x86.h
index 5aa2a46..e8c9188 100644
--- a/kexec/arch/i386/kexec-x86.h
+++ b/kexec/arch/i386/kexec-x86.h
@@ -50,6 +50,7 @@ struct arch_options_t {
uint8_t console_vga;
uint8_t console_serial;
enum coretype core_header_type;
+ uint8_t pass_memmap_cmdline;
};
int multiboot_x86_probe(const char *buf, off_t len);
diff --git a/kexec/arch/x86_64/kexec-x86_64.c b/kexec/arch/x86_64/kexec-x86_64.c
index 5c23e01..f70851d 100644
--- a/kexec/arch/x86_64/kexec-x86_64.c
+++ b/kexec/arch/x86_64/kexec-x86_64.c
@@ -53,6 +53,7 @@ void arch_usage(void)
" --serial-baud=<baud_rate> Specify the serial port baud rate\n"
" --console-vga Enable the vga console\n"
" --console-serial Enable the serial console\n"
+ " --pass-memmap-cmdline Pass memory map via command line in kexec on panic case\n"
);
}
@@ -63,6 +64,7 @@ struct arch_options_t arch_options = {
.console_vga = 0,
.console_serial = 0,
.core_header_type = CORE_TYPE_ELF64,
+ .pass_memmap_cmdline = 0,
};
int arch_process_options(int argc, char **argv)
@@ -126,6 +128,9 @@ int arch_process_options(int argc, char **argv)
}
arch_options.serial_baud = value;
break;
+ case OPT_PASS_MEMMAP_CMDLINE:
+ arch_options.pass_memmap_cmdline = 1;
+ break;
}
}
/* Reset getopt for the next pass; called in other source modules */
--
1.8.5.3
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH RESEND v5 10/10] x86: Pass memory range via E820 for kdump
2014-04-11 2:23 [PATCH RESEND v5 00/10] kexec-tools, x86: E820 memmap pass for kdump WANG Chao
` (8 preceding siblings ...)
2014-04-11 2:23 ` [PATCH RESEND v5 09/10] x86: add --pass-memmap-cmdline option WANG Chao
@ 2014-04-11 2:23 ` WANG Chao
9 siblings, 0 replies; 19+ messages in thread
From: WANG Chao @ 2014-04-11 2:23 UTC (permalink / raw)
To: horms, vgoyal, ebiederm, hpa, trenn, dyoung, linn; +Cc: kexec
command line size is restricted by kernel, sometimes memmap=exactmap has
too many memory ranges to pass to cmdline. And also memmap=exactmap and
kASLR doesn't work together.
A better approach, to pass the memory ranges for crash kernel to boot
into, is filling the memory ranges into E820.
boot_params only got 128 slots for E820 map to fit in, when the number of
memory map exceeds 128, use setup_data to pass the rest as extended E820
memory map.
kexec boot could also benefit from setup_data in case E820 memory map
exceeds 128.
Now this new approach becomes default instead of memmap=exactmap.
saved_max_pfn users can specify --pass-memmap-cmdline to use the
exactmap approach.
Signed-off-by: WANG Chao <chaowang@redhat.com>
Tested-by: Linn Crosetto <linn@hp.com>
Reviewed-by: Linn Crosetto <linn@hp.com>
Signed-off-by: WANG Chao <chaowang@redhat.com>
---
kexec/arch/i386/crashdump-x86.c | 6 +-
kexec/arch/i386/x86-linux-setup.c | 149 +++++++++++++++++++++++++-------------
kexec/arch/i386/x86-linux-setup.h | 1 +
3 files changed, 103 insertions(+), 53 deletions(-)
diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
index 2a6871d..2c0dbe3 100644
--- a/kexec/arch/i386/crashdump-x86.c
+++ b/kexec/arch/i386/crashdump-x86.c
@@ -979,7 +979,8 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
dbgprintf("Created elf header segment at 0x%lx\n", elfcorehdr);
if (delete_memmap(memmap_p, &nr_memmap_p, elfcorehdr, memsz) < 0)
return -1;
- cmdline_add_memmap(mod_cmdline, memmap_p);
+ if (arch_options.pass_memmap_cmdline)
+ cmdline_add_memmap(mod_cmdline, memmap_p);
if (!bzImage_support_efi_boot)
cmdline_add_efi(mod_cmdline);
cmdline_add_elfcorehdr(mod_cmdline, elfcorehdr);
@@ -995,7 +996,8 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
type = mem_range[i].type;
size = end - start;
add_memmap(memmap_p, &nr_memmap_p, start, size, type);
- cmdline_add_memmap_acpi(mod_cmdline, start, end);
+ if (arch_options.pass_memmap_cmdline)
+ cmdline_add_memmap_acpi(mod_cmdline, start, end);
}
/* Store 2nd kernel boot memory ranges for later reference in
diff --git a/kexec/arch/i386/x86-linux-setup.c b/kexec/arch/i386/x86-linux-setup.c
index 8ed36cc..2f9bb97 100644
--- a/kexec/arch/i386/x86-linux-setup.c
+++ b/kexec/arch/i386/x86-linux-setup.c
@@ -36,8 +36,6 @@
#include "x86-linux-setup.h"
#include "../../kexec/kexec-syscall.h"
-#define SETUP_EFI 4
-
void init_linux_parameters(struct x86_linux_param_header *real_mode)
{
/* Fill in the values that are usually provided by the kernel. */
@@ -502,6 +500,11 @@ struct efi_setup_data {
struct setup_data {
uint64_t next;
uint32_t type;
+#define SETUP_NONE 0
+#define SETUP_E820_EXT 1
+#define SETUP_DTB 2
+#define SETUP_PCI 3
+#define SETUP_EFI 4
uint32_t len;
uint8_t data[0];
} __attribute__((packed));
@@ -684,6 +687,98 @@ out:
return ret;
}
+static void add_e820_map_from_mr(struct x86_linux_param_header *real_mode,
+ struct e820entry *e820, struct memory_range *range, int nr_range)
+{
+ int i;
+
+ for (i = 0; i < nr_range; i++) {
+ e820[i].addr = range[i].start;
+ e820[i].size = range[i].end - range[i].start;
+ switch (range[i].type) {
+ case RANGE_RAM:
+ e820[i].type = E820_RAM;
+ break;
+ case RANGE_ACPI:
+ e820[i].type = E820_ACPI;
+ break;
+ case RANGE_ACPI_NVS:
+ e820[i].type = E820_NVS;
+ break;
+ default:
+ case RANGE_RESERVED:
+ e820[i].type = E820_RESERVED;
+ break;
+ }
+ dbgprintf("%016lx-%016lx (%d)\n",
+ e820[i].addr,
+ e820[i].addr + e820[i].size - 1,
+ e820[i].type);
+
+ if (range[i].type != RANGE_RAM)
+ continue;
+ if ((range[i].start <= 0x100000) && range[i].end > 0x100000) {
+ unsigned long long mem_k = (range[i].end >> 10) - (0x100000 >> 10);
+ real_mode->ext_mem_k = mem_k;
+ real_mode->alt_mem_k = mem_k;
+ if (mem_k > 0xfc00) {
+ real_mode->ext_mem_k = 0xfc00; /* 64M */
+ }
+ if (mem_k > 0xffffffff) {
+ real_mode->alt_mem_k = 0xffffffff;
+ }
+ }
+ }
+}
+
+static void setup_e820_ext(struct kexec_info *info, struct x86_linux_param_header *real_mode,
+ struct memory_range *range, int nr_range)
+{
+ struct setup_data *sd;
+ struct e820entry *e820;
+ int nr_range_ext;
+
+ nr_range_ext = nr_range - E820MAX;
+ sd = xmalloc(sizeof(struct setup_data) + nr_range_ext * sizeof(struct e820entry));
+ sd->next = 0;
+ sd->len = nr_range_ext * sizeof(struct e820entry);
+ sd->type = SETUP_E820_EXT;
+
+ e820 = (struct e820entry *) sd->data;
+ dbgprintf("Extended E820 via setup_data:\n");
+ add_e820_map_from_mr(real_mode, e820, range + E820MAX, nr_range_ext);
+ add_setup_data(info, real_mode, sd);
+}
+
+static void setup_e820(struct kexec_info *info, struct x86_linux_param_header *real_mode)
+{
+ struct memory_range *range;
+ int nr_range, nr_range_saved;
+
+
+ if (info->kexec_flags & KEXEC_ON_CRASH && !arch_options.pass_memmap_cmdline) {
+ range = info->crash_range;
+ nr_range = info->nr_crash_ranges;
+ } else {
+ range = info->memory_range;
+ nr_range = info->memory_ranges;
+ }
+
+ nr_range_saved = nr_range;
+ if (nr_range > E820MAX) {
+ nr_range = E820MAX;
+ }
+
+ real_mode->e820_map_nr = nr_range;
+ dbgprintf("E820 memmap:\n");
+ add_e820_map_from_mr(real_mode, real_mode->e820_map, range, nr_range);
+
+ if (nr_range_saved > E820MAX) {
+ dbgprintf("extra E820 memmap are passed via setup_data\n");
+ setup_e820_ext(info, real_mode, range, nr_range_saved);
+ }
+}
+
static int
get_efi_mem_desc_version(struct x86_linux_param_header *real_mode)
{
@@ -725,10 +820,6 @@ out:
void setup_linux_system_parameters(struct kexec_info *info,
struct x86_linux_param_header *real_mode)
{
- /* Fill in information the BIOS would usually provide */
- struct memory_range *range;
- int i, ranges;
-
/* get subarch from running kernel */
setup_subarch(real_mode);
if (bzImage_support_efi_boot)
@@ -769,51 +860,7 @@ void setup_linux_system_parameters(struct kexec_info *info,
/* another safe default */
real_mode->aux_device_info = 0;
- range = info->memory_range;
- ranges = info->memory_ranges;
- if (ranges > E820MAX) {
- if (!(info->kexec_flags & KEXEC_ON_CRASH))
- /*
- * this e820 not used for capture kernel, see
- * do_bzImage_load()
- */
- fprintf(stderr,
- "Too many memory ranges, truncating...\n");
- ranges = E820MAX;
- }
- real_mode->e820_map_nr = ranges;
- for(i = 0; i < ranges; i++) {
- real_mode->e820_map[i].addr = range[i].start;
- real_mode->e820_map[i].size = range[i].end - range[i].start;
- switch (range[i].type) {
- case RANGE_RAM:
- real_mode->e820_map[i].type = E820_RAM;
- break;
- case RANGE_ACPI:
- real_mode->e820_map[i].type = E820_ACPI;
- break;
- case RANGE_ACPI_NVS:
- real_mode->e820_map[i].type = E820_NVS;
- break;
- default:
- case RANGE_RESERVED:
- real_mode->e820_map[i].type = E820_RESERVED;
- break;
- }
- if (range[i].type != RANGE_RAM)
- continue;
- if ((range[i].start <= 0x100000) && range[i].end > 0x100000) {
- unsigned long long mem_k = (range[i].end >> 10) - (0x100000 >> 10);
- real_mode->ext_mem_k = mem_k;
- real_mode->alt_mem_k = mem_k;
- if (mem_k > 0xfc00) {
- real_mode->ext_mem_k = 0xfc00; /* 64M */
- }
- if (mem_k > 0xffffffff) {
- real_mode->alt_mem_k = 0xffffffff;
- }
- }
- }
+ setup_e820(info, real_mode);
/* fill the EDD information */
setup_edd_info(real_mode);
diff --git a/kexec/arch/i386/x86-linux-setup.h b/kexec/arch/i386/x86-linux-setup.h
index 6fb84b4..f5d23d3 100644
--- a/kexec/arch/i386/x86-linux-setup.h
+++ b/kexec/arch/i386/x86-linux-setup.h
@@ -30,5 +30,6 @@ void setup_linux_system_parameters(struct kexec_info *info,
/* command line parameter may be appended by purgatory */
#define PURGATORY_CMDLINE_SIZE 64
extern int bzImage_support_efi_boot;
+extern struct arch_options_t arch_options;
#endif /* X86_LINUX_SETUP_H */
--
1.8.5.3
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 19+ messages in thread