cpu: Fix memory access in Minor not setting parent Request flags

This patch fixes cases where uncacheable/memory type flags are not set
correctly on a memory op which is split in the LSQ.  Without this
patch, request->request if freely used to check flags where the flags
should actually come from the accumulation of request fragment flags.

This patch also fixes a bug where an uncacheable access which passes
through tryToSendRequest more than once can increment
LSQ::numAccessesInMemorySystem more than once.
This commit is contained in:
Andrew Bardsley 2014-09-12 10:22:49 -04:00
parent c8b919aba2
commit 1a45a8c5d3
2 changed files with 8 additions and 2 deletions

View file

@ -476,6 +476,8 @@ LSQ::SplitDataRequest::makeFragmentPackets()
makePacketForRequest(*fragment, isLoad, this, request_data);
fragmentPackets.push_back(fragment_packet);
/* Accumulate flags in parent request */
request.setFlags(fragment->getFlags());
}
/* Might as well make the overall/response packet here */
@ -1029,7 +1031,7 @@ LSQ::tryToSendToTransfers(LSQRequestPtr request)
/* Remember if this is an access which can't be idly
* discarded by an interrupt */
if (!bufferable) {
if (!bufferable && !request->issuedToMemory) {
numAccessesIssuedToMemory++;
request->issuedToMemory = true;
}

View file

@ -585,7 +585,11 @@ class LSQ : public Named
protected:
/** Count of the number of mem. accesses which have left the
* requests queue and are in the 'wild' in the memory system. */
* requests queue and are in the 'wild' in the memory system and who
* *must not* be interrupted as they are not normal cacheable
* accesses. This is a count of the number of in-flight requests
* with issuedToMemory set who have visited tryToSendRequest at least
* once */
unsigned int numAccessesInMemorySystem;
/** Number of requests in the DTLB in the requests queue */