mem: Pass shared downstream through caches
authorAndreas Hansson <andreas.hansson@arm.com>
Tue, 5 May 2015 07:22:26 +0000 (03:22 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Tue, 5 May 2015 07:22:26 +0000 (03:22 -0400)
This patch ensures that we pass on information about a packet being
shared (rather than exclusive), when forwarding a packet downstream.

Without this patch there is a risk that a downstream cache considers
the line exclusive when it really isn't.

src/mem/cache/cache_impl.hh

index 5e6eccec87ad077172d9a1a8bed7b7ef4e524b76..ca332697bbcfddaee59219e174276f1ac2d3f67d 100644 (file)
@@ -819,6 +819,18 @@ Cache::getBusPacket(PacketPtr cpu_pkt, CacheBlk *blk,
     }
     PacketPtr pkt = new Packet(cpu_pkt->req, cmd, blkSize);
 
+    // if there are sharers in the upper levels, pass that info downstream
+    if (cpu_pkt->sharedAsserted()) {
+        // note that cpu_pkt may have spent a considerable time in the
+        // MSHR queue and that the information could possibly be out
+        // of date, however, there is no harm in conservatively
+        // assuming the block is shared
+        pkt->assertShared();
+        DPRINTF(Cache, "%s passing shared from %s to %s addr %#llx size %d\n",
+                __func__, cpu_pkt->cmdString(), pkt->cmdString(),
+                pkt->getAddr(), pkt->getSize());
+    }
+
     // the packet should be block aligned
     assert(pkt->getAddr() == blockAlign(pkt->getAddr()));