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