149 lines
4.5 KiB
Diff
149 lines
4.5 KiB
Diff
|
From: Pratyush Anand <panand@redhat.com>
|
||
|
To: ats-kumagai@wm.jp.nec.com
|
||
|
Subject: [PATCH Makedumpfile 2/4] x86_64: translate all VA to PA using page
|
||
|
table values
|
||
|
Date: Mon, 24 Oct 2016 22:18:44 +0530
|
||
|
Cc: Pratyush Anand <panand@redhat.com>, dyoung@redhat.com,
|
||
|
kexec@lists.infradead.org, bhe@redhat.com
|
||
|
MIME-Version: 1.0
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
Content-Type: text/plain; charset=utf-8
|
||
|
|
||
|
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
|
||
|
|
||
|
Signed-off-by: Pratyush Anand <panand@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/makedumpfile-1.6.0/arch/x86_64.c
|
||
|
+++ b/makedumpfile-1.6.0/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;
|
||
|
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-1.6.0/makedumpfile.h
|
||
|
+++ b/makedumpfile-1.6.0/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@lists.infradead.org
|
||
|
http://lists.infradead.org/mailman/listinfo/kexec
|