[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