diff -r 21eede796ebc -r 30307bfe1e8c src/arch/x86/pagetable_walker.hh --- a/src/arch/x86/pagetable_walker.hh Mon Jan 05 16:43:24 2015 +0000 +++ b/src/arch/x86/pagetable_walker.hh Mon Jan 05 16:44:25 2015 +0000 @@ -183,6 +183,11 @@ // Wrapper for checking for squashes before starting a translation. void startWalkWrapper(); + /** + * Event used to call startWalkWrapper. + **/ + EventWrapper startWalkWrapperEvent; + // Functions for dealing with packets. bool recvTimingResp(PacketPtr pkt); void recvRetry(); @@ -207,7 +212,8 @@ MemObject(params), port(name() + ".port", this), funcState(this, NULL, NULL, true), tlb(NULL), sys(params->system), masterId(sys->getMasterId(name())), - numSquashable(params->num_squash_per_cycle) + numSquashable(params->num_squash_per_cycle), + startWalkWrapperEvent(this) { } }; diff -r 21eede796ebc -r 30307bfe1e8c src/arch/x86/pagetable_walker.cc --- a/src/arch/x86/pagetable_walker.cc Mon Jan 05 16:43:24 2015 +0000 +++ b/src/arch/x86/pagetable_walker.cc Mon Jan 05 16:44:25 2015 +0000 @@ -124,8 +124,10 @@ delete senderWalk; // Since we block requests when another is outstanding, we // need to check if there is a waiting request to be serviced - if (currStates.size()) - startWalkWrapper(); + if (currStates.size() && !startWalkWrapperEvent.scheduled()) + // delay sending any new requests until we are finished + // with the responses + schedule(startWalkWrapperEvent, clockEdge()); } return true; }