x86: fix table walker assertion
authorBinh Pham <binhpham@cs.rutgers.edu>
Sat, 21 Jun 2014 17:39:44 +0000 (10:39 -0700)
committerBinh Pham <binhpham@cs.rutgers.edu>
Sat, 21 Jun 2014 17:39:44 +0000 (10:39 -0700)
In a cycle, we could see a R and W requests corresponding to the same
page walk being sent to the memory. During the cycle that assertion
happens, we have 2 responses corresponding to the R and W above. We
also have a 'read' variable to keep track of the inflight Read
request, this gets reset to NULL right after we send out any R
request; and gets set to the next R in the page walk when a response
comes back.

The issue we are seeing here is when we get a response for W request,
assert(!read) fires because we got a response for R request right
before this, hence we set 'read' to NOT NULL value, pointing to the
next R request in the pagewalk!

This work was done while Binh was an intern at AMD Research.

src/arch/x86/pagetable_walker.cc

index 0c8dcd442ddbc30a321aade06e2fa5a13b5862b4..e75f2edc4ef38fbb9e33b2c3b611d3e894476146 100644 (file)
@@ -608,9 +608,11 @@ Walker::WalkerState::recvPacket(PacketPtr pkt)
     assert(pkt->isResponse());
     assert(inflight);
     assert(state == Waiting);
-    assert(!read);
     inflight--;
     if (pkt->isRead()) {
+        // should not have a pending read it we also had one outstanding
+        assert(!read);
+
         // @todo someone should pay for this
         pkt->busFirstWordDelay = pkt->busLastWordDelay = 0;