From 55401cde54ca769a382a9c64f1db13b87bc24ea0 Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Thu, 12 Apr 2012 22:11:51 -0500 Subject: Optimize PageTableManager and associated VMM. - Changed overall page table behavior to no longer use C bits in page table entries. Instead, individual blocks mark pages as dirty based on stores during page faults. Initially all writable pages are marked read-only until the first store to it. At that time the block gets an exception and changes the permission on the page table entry to writable and marks its own SPTE to dirty. - Greatly reduced the number of tlbie's and page table accesses. Accomplished this by: * Skipping many of the page table manipulations, such as LRU updates, when the PTE is invalid. * Converting most of the previously general-case of "Modifying a PTE" to specific cases such as "Resetting the Reference Bit" and "Modifying the SW field". - Fixed the LRU-flush algorithm so that it is O(n) instead of O(n^2), where n = size of page table. Change-Id: I2520fa88970fd7f656e6348bf6b34d5db82fd3db Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/892 Tested-by: Jenkins Server Reviewed-by: Douglas R. Gilbert Reviewed-by: Daniel M. Crowell Reviewed-by: A. Patrick Williams III --- src/kernel/stacksegment.C | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/kernel/stacksegment.C') diff --git a/src/kernel/stacksegment.C b/src/kernel/stacksegment.C index f7ced0f1f..fdc6c7a8f 100644 --- a/src/kernel/stacksegment.C +++ b/src/kernel/stacksegment.C @@ -61,7 +61,8 @@ StackSegment::~StackSegment() } while (l_node != NULL); /*using deallocated*/ // BEAM invalid error. } -bool StackSegment::handlePageFault(task_t* i_task, uint64_t i_addr) +bool StackSegment::handlePageFault(task_t* i_task, uint64_t i_addr, + bool i_store) { uint64_t l_addr_8mb = i_addr & ~((8*MEGABYTE) - 1); @@ -69,7 +70,7 @@ bool StackSegment::handlePageFault(task_t* i_task, uint64_t i_addr) return (NULL == l_node ? false : - l_node->block->handlePageFault(i_task, i_addr)); + l_node->block->handlePageFault(i_task, i_addr, i_store)); } uint64_t StackSegment::findPhysicalAddress(uint64_t i_vaddr) const -- cgit v1.2.3