kernel/vm: Use DebugGetReverseMappingInfo() in dump_page_long.
Iterating over every single page in a 64-bit address space is far too expensive. Instead, use DebugGetReverseMappingInfo(), which iterates over the page translation map's page tables. (The only thing that implements this at present, however, is X86VMTranslationMapPAE, so it won't be too useful on 64-bit just yet. But at least we won't hang for very long periods of time on 64-bit at least.)
This commit is contained in:
@@ -1010,29 +1010,37 @@ dump_page_long(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (searchMappings) {
|
if (searchMappings) {
|
||||||
kprintf("all mappings:\n");
|
struct Callback : VMTranslationMap::ReverseMappingInfoCallback {
|
||||||
VMAddressSpace* addressSpace = VMAddressSpace::DebugFirst();
|
VMAddressSpace* fAddressSpace;
|
||||||
while (addressSpace != NULL) {
|
|
||||||
size_t pageCount = addressSpace->Size() / B_PAGE_SIZE;
|
virtual bool HandleVirtualAddress(addr_t virtualAddress)
|
||||||
for (addr_t address = addressSpace->Base(); pageCount != 0;
|
{
|
||||||
address += B_PAGE_SIZE, pageCount--) {
|
|
||||||
phys_addr_t physicalAddress;
|
phys_addr_t physicalAddress;
|
||||||
uint32 flags = 0;
|
uint32 flags = 0;
|
||||||
if (addressSpace->TranslationMap()->QueryInterrupt(address,
|
if (fAddressSpace->TranslationMap()->QueryInterrupt(virtualAddress,
|
||||||
&physicalAddress, &flags) == B_OK
|
&physicalAddress, &flags) != B_OK) {
|
||||||
&& (flags & PAGE_PRESENT) != 0
|
kprintf(" aspace %" B_PRId32 ": %#" B_PRIxADDR " (querying failed)\n",
|
||||||
&& physicalAddress / B_PAGE_SIZE
|
fAddressSpace->ID(), virtualAddress);
|
||||||
== page->physical_page_number) {
|
return false;
|
||||||
VMArea* area = addressSpace->LookupArea(address);
|
}
|
||||||
|
VMArea* area = fAddressSpace->LookupArea(virtualAddress);
|
||||||
kprintf(" aspace %" B_PRId32 ", area %" B_PRId32 ": %#"
|
kprintf(" aspace %" B_PRId32 ", area %" B_PRId32 ": %#"
|
||||||
B_PRIxADDR " (%c%c%s%s)\n", addressSpace->ID(),
|
B_PRIxADDR " (%c%c%s%s)\n", fAddressSpace->ID(),
|
||||||
area != NULL ? area->id : -1, address,
|
area != NULL ? area->id : -1, virtualAddress,
|
||||||
(flags & B_KERNEL_READ_AREA) != 0 ? 'r' : '-',
|
(flags & B_KERNEL_READ_AREA) != 0 ? 'r' : '-',
|
||||||
(flags & B_KERNEL_WRITE_AREA) != 0 ? 'w' : '-',
|
(flags & B_KERNEL_WRITE_AREA) != 0 ? 'w' : '-',
|
||||||
(flags & PAGE_MODIFIED) != 0 ? " modified" : "",
|
(flags & PAGE_MODIFIED) != 0 ? " modified" : "",
|
||||||
(flags & PAGE_ACCESSED) != 0 ? " accessed" : "");
|
(flags & PAGE_ACCESSED) != 0 ? " accessed" : "");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
} callback;
|
||||||
|
|
||||||
|
kprintf("all mappings:\n");
|
||||||
|
VMAddressSpace* addressSpace = VMAddressSpace::DebugFirst();
|
||||||
|
while (addressSpace != NULL) {
|
||||||
|
callback.fAddressSpace = addressSpace;
|
||||||
|
addressSpace->TranslationMap()->DebugGetReverseMappingInfo(
|
||||||
|
page->physical_page_number * B_PAGE_SIZE, callback);
|
||||||
addressSpace = VMAddressSpace::DebugNext(addressSpace);
|
addressSpace = VMAddressSpace::DebugNext(addressSpace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user