mem: Transition away from isSupplyExclusive for writebacks
authorAndreas Hansson <andreas.hansson@arm.com>
Thu, 30 Jul 2015 07:41:40 +0000 (03:41 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Thu, 30 Jul 2015 07:41:40 +0000 (03:41 -0400)
This patch changes how writebacks communicate whether the line is
passed as modified or owned. Previously we relied on the
isSupplyExclusive mechanism, which was originally designed to avoid
unecessary snoops.

For normal cache requests we use the sharedAsserted mechanism to
determine if a block should be marked writeable or not, and with this
patch we transition the writebacks to also use this
mechanism. Conceptually this is cleaner and more consistent.

src/mem/cache/cache_impl.hh
src/mem/packet.hh

index 03593554a53100a73962d09925c956289bb82b1d..040b49464babd8f728980f3221d3af35100a4bd6 100644 (file)
@@ -400,7 +400,9 @@ Cache::access(PacketPtr pkt, CacheBlk *&blk, Cycles &lat,
             }
         }
         blk->status |= BlkDirty;
-        if (pkt->isSupplyExclusive()) {
+        // if shared is not asserted we got the writeback in modified
+        // state, if it is asserted we are in the owned state
+        if (!pkt->sharedAsserted()) {
             blk->status |= BlkWritable;
         }
         // nothing else to do; writeback doesn't expect response
@@ -1475,8 +1477,14 @@ Cache::writebackBlk(CacheBlk *blk)
 
     PacketPtr writeback = new Packet(writebackReq, MemCmd::Writeback);
     if (blk->isWritable()) {
-        writeback->setSupplyExclusive();
+        // not asserting shared means we pass the block in modified
+        // state, mark our own block non-writeable
+        blk->status &= ~BlkWritable;
+    } else {
+        // we are in the owned state, tell the receiver
+        writeback->assertShared();
     }
+
     writeback->allocate();
     std::memcpy(writeback->getPtr<uint8_t>(), blk->data, blkSize);
 
@@ -1998,9 +2006,10 @@ Cache::recvTimingSnoopReq(PacketPtr pkt)
             pkt->assertMemInhibit();
             if (!pkt->needsExclusive()) {
                 pkt->assertShared();
-                // the writeback is no longer the exclusive copy in
-                // the system
-                wb_pkt->clearSupplyExclusive();
+                // the writeback is no longer passing exclusivity (the
+                // receiving cache should consider the block owned
+                // rather than modified)
+                wb_pkt->assertShared();
             } else {
                 // if we're not asserting the shared line, we need to
                 // invalidate our copy.  we'll do that below as long as
index fe5e10d0a28708c84d9b0b3afc4352f0c2ae8282..d1774e5a8126ee74d860d91d2fb8510dda2465b8 100644 (file)
@@ -500,7 +500,6 @@ class Packet : public Printable
     void setExpressSnoop()          { flags.set(EXPRESS_SNOOP); }
     bool isExpressSnoop() const     { return flags.isSet(EXPRESS_SNOOP); }
     void setSupplyExclusive()       { flags.set(SUPPLY_EXCLUSIVE); }
-    void clearSupplyExclusive()     { flags.clear(SUPPLY_EXCLUSIVE); }
     bool isSupplyExclusive() const  { return flags.isSet(SUPPLY_EXCLUSIVE); }
     void setSuppressFuncError()     { flags.set(SUPPRESS_FUNC_ERROR); }
     bool suppressFuncError() const  { return flags.isSet(SUPPRESS_FUNC_ERROR); }