x86: fix table walker assertion
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.
This commit is contained in:
parent
b72c879868
commit
b085db84af
1 changed files with 3 additions and 1 deletions
|
@ -608,9 +608,11 @@ Walker::WalkerState::recvPacket(PacketPtr pkt)
|
||||||
assert(pkt->isResponse());
|
assert(pkt->isResponse());
|
||||||
assert(inflight);
|
assert(inflight);
|
||||||
assert(state == Waiting);
|
assert(state == Waiting);
|
||||||
assert(!read);
|
|
||||||
inflight--;
|
inflight--;
|
||||||
if (pkt->isRead()) {
|
if (pkt->isRead()) {
|
||||||
|
// should not have a pending read it we also had one outstanding
|
||||||
|
assert(!read);
|
||||||
|
|
||||||
// @todo someone should pay for this
|
// @todo someone should pay for this
|
||||||
pkt->busFirstWordDelay = pkt->busLastWordDelay = 0;
|
pkt->busFirstWordDelay = pkt->busLastWordDelay = 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue