[PATCH Makedumpfile 2/4] x86_64: translate all VA to PA using page table values

Atsushi Kumagai ats-kumagai at wm.jp.nec.com
Tue Oct 25 23:24:43 PDT 2016


>On 10/25/16 at 08:42pm, Pratyush Anand wrote:
>> > > With -d 1:
>> > > Trial 1: 2768.424565806 S
>> > > Trial 2: 2749.622115455 S
>> > > Trail 3: 2537.770359073 S
>> >
>> > Could you increase the number of trials ?
>>
>> OK, I can do that. Might take some time, as I will have to arrange that high
>> memory machine again.
>>
>> > If the average time is close to the results of Trial 1 (2768s) and 2 (2749s),
>> > the regression rate is 8% and it sounds neither large nor small.
>> > If the average is a level of 2500s like Trial 3, it's ideal.
>> >
>> > > Signed-off-by: Pratyush Anand <panand at redhat.com>
>> > > ---
>> > > arch/x86_64.c  | 42 ++++++++----------------------------------
>> > > makedumpfile.h |  4 ++--
>> > > 2 files changed, 10 insertions(+), 36 deletions(-)
>> > >
>> > > diff --git a/arch/x86_64.c b/arch/x86_64.c
>> > > index a96fd8ae00a1..fe2764a8bec2 100644
>> > > --- a/arch/x86_64.c
>> > > +++ b/arch/x86_64.c
>> > > @@ -203,6 +203,12 @@ vtop4_x86_64(unsigned long vaddr)
>> > > {
>> > > 	unsigned long page_dir, pml4, pgd_paddr, pgd_pte, pmd_paddr, pmd_pte;
>> > > 	unsigned long pte_paddr, pte;
>> > > +	unsigned long phys_base;
>> > > +
>> > > +	if (SYMBOL(phys_base) != NOT_FOUND_SYMBOL)
>> > > +		phys_base = info->phys_base;
>> > > +	else
>> > > +		phys_base = 0;
>> > >
>> > > 	if (SYMBOL(init_level4_pgt) == NOT_FOUND_SYMBOL) {
>> > > 		ERRMSG("Can't get the symbol of init_level4_pgt.\n");
>> > > @@ -212,9 +218,9 @@ vtop4_x86_64(unsigned long vaddr)
>> > > 	/*
>> > > 	 * Get PGD.
>> > > 	 */
>> > > -	page_dir  = SYMBOL(init_level4_pgt);
>> > > +	page_dir = SYMBOL(init_level4_pgt) - __START_KERNEL_map + phys_base;
>> >
>> > I want to confirm that this VA to PA translation is always safe,
>> > otherwise we should do the condition check which was done in
>> > vaddr_to_paddr_x86_64(), isn't it ?
>> >
>>
>> I think this should be safe, however x86 expert can comment better. Baoquan
>> any comment here?
>
>Yes, I think this is safe. Below is the physical to virtual address
>translation function in x86 64. And init_level4_pgt is a global variable
>located in kernel text region.
>
>arch/x86/include/asm/page_64.h
>
>static inline unsigned long __phys_addr_nodebug(unsigned long x)
>{
>        unsigned long y = x - __START_KERNEL_map;
>
>        /* use the carry flag to determine if x was < __START_KERNEL_map */
>        x = y + ((x > y) ? phys_base : (__START_KERNEL_map - PAGE_OFFSET));
>
>        return x;
>}

Good, thanks for your comment.
I'll wait for the result of the benchmark.

Regards,
Atsushi Kumagai



More information about the kexec mailing list