cpu: Fix memory access in Minor not setting parent Request flags
authorAndrew Bardsley <Andrew.Bardsley@arm.com>
Fri, 12 Sep 2014 14:22:49 +0000 (10:22 -0400)
committerAndrew Bardsley <Andrew.Bardsley@arm.com>
Fri, 12 Sep 2014 14:22:49 +0000 (10:22 -0400)
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.

src/cpu/minor/lsq.cc
src/cpu/minor/lsq.hh

index c5e38c78d774e0aa258080ffe6788895c8164f31..b05ae514c4a94837e26ce642e2d5f7f8ee659a2e 100644 (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;
         }
index 0998395e01dbd0b0acc3521881d91a38ae6a293f..183986826dbf79cc3d2bf8277cf0506ee470045f 100644 (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 */