Hello Pratysh, >Currently we translate some of the VA areas using linear mapping while some >other(which can not be linearly mapped) using page table. > >However, we will have entry of a page in the page table irrespective of its >virtual region. So, we can always look into page table for any VA to PA >translation. This approach will solve lot of complexity in makedumpfile. It >will in turn remove dependency over variables like VMALLOC_START, >MODULES_VADDR etc whose definition keeps changing in newer kernel version. > >Moreover, I do not see any side effect of this approach in terms of >execution timing. I tested with IBM x3950 X6 machine having 4136359 MB of >memory. These are the results of makedumpfile execution time: > >Without this patch: >=================== >With -d 31: >Trial 1: 237.59526248 S >Trial 2: 235.236914962 S >Trail 3: 237.678712045 S > >With -d 1: >Trial 1: 2548.905296877 S >Trial 2: 2549.759881756 S > >With this patch: >=================== >With -d 31: >Trial 1: 232.713841516 S >Trial 2: 228.45697177 S >Trail 3: 232.942262441 S > >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 ? 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 ? Thanks, Atsushi Kumagai > page_dir += pml4_index(vaddr) * sizeof(unsigned long); >- if (!readmem(VADDR, page_dir, &pml4, sizeof pml4)) { >+ if (!readmem(PADDR, page_dir, &pml4, sizeof pml4)) { > ERRMSG("Can't get pml4 (page_dir:%lx).\n", page_dir); > return NOT_PADDR; > } >@@ -285,38 +291,6 @@ vtop4_x86_64(unsigned long vaddr) > return (pte & ENTRY_MASK) + PAGEOFFSET(vaddr); > } > >-unsigned long long >-vaddr_to_paddr_x86_64(unsigned long vaddr) >-{ >- unsigned long phys_base; >- unsigned long long paddr; >- >- /* >- * Check the relocatable kernel. >- */ >- if (SYMBOL(phys_base) != NOT_FOUND_SYMBOL) >- phys_base = info->phys_base; >- else >- phys_base = 0; >- >- if (is_vmalloc_addr_x86_64(vaddr)) { >- if ((paddr = vtop4_x86_64(vaddr)) == NOT_PADDR) { >- ERRMSG("Can't convert a virtual address(%lx) to " \ >- "physical address.\n", vaddr); >- return NOT_PADDR; >- } >- } else if (vaddr >= __START_KERNEL_map) { >- paddr = vaddr - __START_KERNEL_map + phys_base; >- >- } else { >- if (is_xen_memory()) >- paddr = vaddr - PAGE_OFFSET_XEN_DOM0; >- else >- paddr = vaddr - PAGE_OFFSET; >- } >- return paddr; >-} >- > /* > * for Xen extraction > */ >diff --git a/makedumpfile.h b/makedumpfile.h >index a5955ff750e5..13559651feb6 100644 >--- a/makedumpfile.h >+++ b/makedumpfile.h >@@ -863,12 +863,12 @@ int is_vmalloc_addr_x86_64(ulong vaddr); > int get_phys_base_x86_64(void); > int get_machdep_info_x86_64(void); > int get_versiondep_info_x86_64(void); >-unsigned long long vaddr_to_paddr_x86_64(unsigned long vaddr); >+unsigned long long vtop4_x86_64(unsigned long vaddr); > #define find_vmemmap() find_vmemmap_x86_64() > #define get_phys_base() get_phys_base_x86_64() > #define get_machdep_info() get_machdep_info_x86_64() > #define get_versiondep_info() get_versiondep_info_x86_64() >-#define vaddr_to_paddr(X) vaddr_to_paddr_x86_64(X) >+#define vaddr_to_paddr(X) vtop4_x86_64(X) > #define is_phys_addr(X) (!is_vmalloc_addr_x86_64(X)) > #endif /* x86_64 */ > >-- >2.7.4 > > >_______________________________________________ >kexec mailing list >kexec at lists.infradead.org >http://lists.infradead.org/mailman/listinfo/kexec