All of lore.kernel.org
 help / color / mirror / Atom feed
* [Makedumpfile PATCH V2] elf_info: fix file_size if segment is excluded
@ 2017-05-09 13:53 Pratyush Anand
  2017-05-10  3:28 ` Xunlei Pang
  0 siblings, 1 reply; 3+ messages in thread
From: Pratyush Anand @ 2017-05-09 13:53 UTC (permalink / raw)
  To: ats-kumagai; +Cc: Pratyush Anand, dyoung, kexec, bhe

I received following on a specific x86_64 hp virtual machine while
executing `makedumpfile --mem-usage /proc/kcore`.

vtop4_x86_64: Can't get a valid pte.
readmem: Can't convert a virtual address(ffffffff88115860) to physical address.
readmem: type_addr: 0, addr:ffffffff88115860, size:128
get_nodes_online: Can't get the node online map.

With some debug print in vtop4_x86_64() I noticed that pte value is read
as 0, while crash reads the value correctly:

from makedumpfile:
vaddr=ffffffff88115860
page_dir=59eaff8
pml4=59ed067
pgd_paddr=59edff0
pgd_pte=59ee063
pmd_paddr=59ee200
pmd_pte=3642f063
pte_paddr=3642f8a8
pte=0

from crash
crash> vtop ffffffff88115860
VIRTUAL           PHYSICAL
ffffffff88115860  5b15860

PML4 DIRECTORY: ffffffff87fea000
PAGE DIRECTORY: 59ed067
   PUD: 59edff0 => 59ee063
   PMD: 59ee200 => 3642f063
   PTE: 3642f8a8 => 5b15163
  PAGE: 5b15000

With some more debug prints in elf_info.c

Before calling exclude_segment()

LOAD (2)
  phys_start : 100000
  phys_end   : dfffd000
  virt_start : ffff8a5a40100000
  virt_end   : ffff8a5b1fffd000
  file_offset: a5a40102000
  file_size  : dfefd000

exclude_segment() is called for Crash Kernel whose range is
2b000000-350fffff.

We see following after exclude_segment()

LOAD (2)
  phys_start : 100000
  phys_end   : 2affffff
  virt_start : ffff8a5a40100000
  virt_end   : ffff8a5a6affffff
  file_offset: a5a40102000
  file_size  : dfefd000
LOAD (3)
  phys_start : 35100000
  phys_end   : dfffd000
  virt_start : ffff8a5a75100000
  virt_end   : ffff8a5b1fffd000
  file_offset: a5a75102000
  file_size  : 0

Since file_size is calculated wrong therefore readpage_elf() does not
behave correctly.

This patch fixes above wrong behavior.

Signed-off-by: Pratyush Anand <panand@redhat.com>
---
v1->v2 : subtracted (end - start) from file_size as well

 elf_info.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/elf_info.c b/elf_info.c
index 8e2437622141..5494c4dcbebe 100644
--- a/elf_info.c
+++ b/elf_info.c
@@ -826,9 +826,13 @@ static int exclude_segment(struct pt_load_segment **pt_loads,
 				temp_seg.virt_end = vend;
 				temp_seg.file_offset = (*pt_loads)[i].file_offset
 					+ temp_seg.virt_start - (*pt_loads)[i].virt_start;
+				temp_seg.file_size = temp_seg.phys_end
+					- temp_seg.phys_start;
 
 				(*pt_loads)[i].virt_end = kvstart - 1;
 				(*pt_loads)[i].phys_end =  start - 1;
+				(*pt_loads)[i].file_size -= (temp_seg.file_size
+					+ end - start);
 
 				tidx = i+1;
 			} else if (kvstart != vstart) {
-- 
2.9.3


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

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

* Re: [Makedumpfile PATCH V2] elf_info: fix file_size if segment is excluded
  2017-05-09 13:53 [Makedumpfile PATCH V2] elf_info: fix file_size if segment is excluded Pratyush Anand
@ 2017-05-10  3:28 ` Xunlei Pang
  2017-05-10  4:43   ` Pratyush Anand
  0 siblings, 1 reply; 3+ messages in thread
From: Xunlei Pang @ 2017-05-10  3:28 UTC (permalink / raw)
  To: Pratyush Anand, ats-kumagai; +Cc: kexec, dyoung, bhe

On 05/09/2017 at 09:53 PM, Pratyush Anand wrote:
> I received following on a specific x86_64 hp virtual machine while
> executing `makedumpfile --mem-usage /proc/kcore`.
>
> vtop4_x86_64: Can't get a valid pte.
> readmem: Can't convert a virtual address(ffffffff88115860) to physical address.
> readmem: type_addr: 0, addr:ffffffff88115860, size:128
> get_nodes_online: Can't get the node online map.
>
> With some debug print in vtop4_x86_64() I noticed that pte value is read
> as 0, while crash reads the value correctly:
>
> from makedumpfile:
> vaddr=ffffffff88115860
> page_dir=59eaff8
> pml4=59ed067
> pgd_paddr=59edff0
> pgd_pte=59ee063
> pmd_paddr=59ee200
> pmd_pte=3642f063
> pte_paddr=3642f8a8
> pte=0
>
> from crash
> crash> vtop ffffffff88115860
> VIRTUAL           PHYSICAL
> ffffffff88115860  5b15860
>
> PML4 DIRECTORY: ffffffff87fea000
> PAGE DIRECTORY: 59ed067
>    PUD: 59edff0 => 59ee063
>    PMD: 59ee200 => 3642f063
>    PTE: 3642f8a8 => 5b15163
>   PAGE: 5b15000
>
> With some more debug prints in elf_info.c
>
> Before calling exclude_segment()
>
> LOAD (2)
>   phys_start : 100000
>   phys_end   : dfffd000
>   virt_start : ffff8a5a40100000
>   virt_end   : ffff8a5b1fffd000
>   file_offset: a5a40102000
>   file_size  : dfefd000
>
> exclude_segment() is called for Crash Kernel whose range is
> 2b000000-350fffff.
>
> We see following after exclude_segment()
>
> LOAD (2)
>   phys_start : 100000
>   phys_end   : 2affffff
>   virt_start : ffff8a5a40100000
>   virt_end   : ffff8a5a6affffff
>   file_offset: a5a40102000
>   file_size  : dfefd000
> LOAD (3)
>   phys_start : 35100000
>   phys_end   : dfffd000
>   virt_start : ffff8a5a75100000
>   virt_end   : ffff8a5b1fffd000
>   file_offset: a5a75102000
>   file_size  : 0
>
> Since file_size is calculated wrong therefore readpage_elf() does not
> behave correctly.
>
> This patch fixes above wrong behavior.
>
> Signed-off-by: Pratyush Anand <panand@redhat.com>
> ---
> v1->v2 : subtracted (end - start) from file_size as well
>
>  elf_info.c | 4 ++++
>  1 file changed, 4 insertions(+)
>
> diff --git a/elf_info.c b/elf_info.c
> index 8e2437622141..5494c4dcbebe 100644
> --- a/elf_info.c
> +++ b/elf_info.c
> @@ -826,9 +826,13 @@ static int exclude_segment(struct pt_load_segment **pt_loads,
>  				temp_seg.virt_end = vend;
>  				temp_seg.file_offset = (*pt_loads)[i].file_offset
>  					+ temp_seg.virt_start - (*pt_loads)[i].virt_start;
> +				temp_seg.file_size = temp_seg.phys_end
> +					- temp_seg.phys_start;
>  
>  				(*pt_loads)[i].virt_end = kvstart - 1;
>  				(*pt_loads)[i].phys_end =  start - 1;
> +				(*pt_loads)[i].file_size -= (temp_seg.file_size
> +					+ end - start);

Hi Pratyush,

Don't we need to move the "(*pt_loads)[i].file_size" minus "(end - start)" down
to the tail of "if (kvstart <  vend && kvend > vstart)" condition for all cases?

Regards,
Xunlei

>  
>  				tidx = i+1;
>  			} else if (kvstart != vstart) {


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

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

* Re: [Makedumpfile PATCH V2] elf_info: fix file_size if segment is excluded
  2017-05-10  3:28 ` Xunlei Pang
@ 2017-05-10  4:43   ` Pratyush Anand
  0 siblings, 0 replies; 3+ messages in thread
From: Pratyush Anand @ 2017-05-10  4:43 UTC (permalink / raw)
  To: xlpang, ats-kumagai; +Cc: kexec, dyoung, bhe



On Wednesday 10 May 2017 08:58 AM, Xunlei Pang wrote:
>> +				(*pt_loads)[i].file_size -= (temp_seg.file_size
>> +					+ end - start);
> Hi Pratyush,
>
> Don't we need to move the "(*pt_loads)[i].file_size" minus "(end - start)" down
> to the tail of "if (kvstart <  vend && kvend > vstart)" condition for all cases?

Yes..sent v3.

Thanks for review.

~Pratyush

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

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

end of thread, other threads:[~2017-05-10  4:43 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-05-09 13:53 [Makedumpfile PATCH V2] elf_info: fix file_size if segment is excluded Pratyush Anand
2017-05-10  3:28 ` Xunlei Pang
2017-05-10  4:43   ` Pratyush Anand

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.