mem: Align the snoop behavior in the XBar for atomic and timing
authorNikos Nikoleris <nikos.nikoleris@arm.com>
Wed, 1 Jun 2016 11:23:54 +0000 (12:23 +0100)
committerNikos Nikoleris <nikos.nikoleris@arm.com>
Thu, 9 Nov 2017 20:49:15 +0000 (20:49 +0000)
When the XBar receives a Writeback/WriteClean packet, it doesn't need
to snoop the upstream caches. It only queries the snoop filter and
sets the blockCached flag accordingly. This is in line with the
recvTimingReq.

Change-Id: I0ae22f21491d75a111019124bb95bac7b16d3cd3
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Anouk Van Laer <anouk.vanlaer@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/5043
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>

src/mem/coherent_xbar.cc

index 7c3a4e31410de7d85b789d2bcfdac417721718b3..ef0620822be0cf8edcd0224643fdf3b3413265ab 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2016 ARM Limited
+ * Copyright (c) 2011-2017 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -661,8 +661,18 @@ CoherentXBar::recvAtomic(PacketPtr pkt, PortID slave_port_id)
             // between and change the filter state
             snoopFilter->finishRequest(false, pkt->getAddr(), pkt->isSecure());
 
-            snoop_result = forwardAtomic(pkt, slave_port_id, InvalidPortID,
-                                         sf_res.first);
+            if (pkt->isEviction()) {
+                // for block-evicting packets, i.e. writebacks and
+                // clean evictions, there is no need to snoop up, as
+                // all we do is determine if the block is cached or
+                // not, instead just set it here based on the snoop
+                // filter result
+                if (!sf_res.first.empty())
+                    pkt->setBlockCached();
+            } else {
+                snoop_result = forwardAtomic(pkt, slave_port_id, InvalidPortID,
+                                             sf_res.first);
+            }
         } else {
             snoop_result = forwardAtomic(pkt, slave_port_id);
         }