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.
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 */
/* 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;
}
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 */