On 01/11/2012 06:53 AM, Petr Tesarik wrote:
Dne Út 10. ledna 2012 19:23:24 Petr Tesarik napsal(a):
Dne Út 10. ledna 2012 19:14:32 Petr Tesarik napsal(a):
... [ cut ] ...
crash> vtop f2800080
VIRTUAL PHYSICAL
f2800080 1fde00080
PAGE DIRECTORY: c08ed000
PGD: c08ed018 => 8ea001
PMD: 8eaca0 => 80000001fde001e3
PAGE: 1fde00000 (2MB)
PTE PHYSICAL FLAGS
80000001fde001e3 1fde00000 (PRESENT|RW|ACCESSED|DIRTY|PSE|GLOBAL|NX)
PAGE PHYSICAL MAPPING INDEX CNT FLAGS
BTW the data from struct page is really missing here. I traced this down to an
integer overflow in dump_memory_nodes():
... [ cut ] ...
David (Mair), could you address this, as already discussed in private mails,
please?
The attached patch fixes this for me.
--
David Mair
SUSE Linux
In dump_memory_nodes() node_start_paddr is too small for all NUMA x86
addresses. Those are 44 bits derived from a 32 bit read and PTOB() expands
the result neatly to 64 bits. Standard x86 pages require a 32 bit read of
the physical address so a 32 bit local, temp_node_start_paddr, was added to
retain the 32 bit read for the page-table field type and compiler expansion
to 64 bits into the common local in dump_memory_nodes(). Another use of
node_start_paddr was modified to assume 64 bits. I also modified the indent
of node_start_paddr to use tabs like the preceding lines. Using the same crash
dump Petr used in his test case I see that the vtop f2800080 output now
includes struct page data in the last table that does not appear before this
patch was added.
This patch is based on crash-6.0.2
Signed-off-by: David Mair <dmair@xxxxxxxx>
---
diff --git a/memory.c b/memory.c
index 95eefc9..f56fa47 100755
--- a/memory.c
+++ b/memory.c
@@ -13192,7 +13192,8 @@ dump_memory_nodes(int initialize)
int i, j;
int n, id, node, flen, slen, badaddr;
ulong node_mem_map;
- ulong node_start_paddr;
+ ulong temp_node_start_paddr;
+ ulonglong node_start_paddr;
ulong node_start_pfn;
ulong node_start_mapnr;
ulong node_spanned_pages, node_present_pages;
@@ -13286,10 +13287,12 @@ dump_memory_nodes(int initialize)
badaddr = TRUE;
}
- if (VALID_MEMBER(pglist_data_node_start_paddr))
+ if (VALID_MEMBER(pglist_data_node_start_paddr)) {
readmem(pgdat+OFFSET(pglist_data_node_start_paddr),
- KVADDR, &node_start_paddr, sizeof(ulong),
+ KVADDR, &temp_node_start_paddr, sizeof(ulong),
"pglist node_start_paddr", FAULT_ON_ERROR);
+ node_start_paddr = temp_node_start_paddr;
+ }
else if (VALID_MEMBER(pglist_data_node_start_pfn)) {
readmem(pgdat+OFFSET(pglist_data_node_start_pfn),
KVADDR, &node_start_pfn, sizeof(ulong),
@@ -13394,14 +13397,14 @@ dump_memory_nodes(int initialize)
fprintf(fp, "%lx\n", node_zones);
}
- fprintf(fp, "%s START_PADDR START_MAPNR\n",
+ fprintf(fp, "%s START_PADDR START_MAPNR\n",
mkstring(buf1, VADDR_PRLEN, CENTER|LJUST,
"MEM_MAP"));
- fprintf(fp, "%s %s %s\n",
+ fprintf(fp, "%s %s %s\n",
mkstring(buf1, VADDR_PRLEN,
CENTER|LONG_HEX, MKSTR(node_mem_map)),
- mkstring(buf2, strlen("START_PADDR"),
- CENTER|LONG_HEX|RJUST, MKSTR(node_start_paddr)),
+ mkstring(buf2, strlen(" START_PADDR "),
+ CENTER|LONGLONG_HEX|RJUST, MKSTR(node_start_paddr)),
mkstring(buf3, strlen("START_MAPNR"),
CENTER|LONG_DEC|RJUST,
MKSTR(node_start_mapnr)));
--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/crash-utility