changeset 49d9b53b21dc in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=49d9b53b21dc
description:
        mem: Transition away from isSupplyExclusive for writebacks

        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.

diffstat:

 src/mem/cache/cache_impl.hh |  19 ++++++++++++++-----
 src/mem/packet.hh           |   1 -
 2 files changed, 14 insertions(+), 6 deletions(-)

diffs (55 lines):

diff -r 6f23825b091b -r 49d9b53b21dc src/mem/cache/cache_impl.hh
--- a/src/mem/cache/cache_impl.hh       Thu Jul 30 03:41:39 2015 -0400
+++ b/src/mem/cache/cache_impl.hh       Thu Jul 30 03:41:40 2015 -0400
@@ -400,7 +400,9 @@
             }
         }
         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 @@
 
     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 @@
             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
diff -r 6f23825b091b -r 49d9b53b21dc src/mem/packet.hh
--- a/src/mem/packet.hh Thu Jul 30 03:41:39 2015 -0400
+++ b/src/mem/packet.hh Thu Jul 30 03:41:40 2015 -0400
@@ -500,7 +500,6 @@
     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); 
}
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to