changeset 25715951a4b8 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=25715951a4b8
description:
mem: Do not alter cache block state on uncacheable snoops
This patch ensures we do not respond with a Modified (dirty and
writable) line if the request is uncacheable, and that the cache
responding retains the line without modifying the state (even if
responding).
diffstat:
src/mem/cache/cache.cc | 31 ++++++++++++++++++++++++-------
1 files changed, 24 insertions(+), 7 deletions(-)
diffs (57 lines):
diff -r b3926db25371 -r 25715951a4b8 src/mem/cache/cache.cc
--- a/src/mem/cache/cache.cc Thu Dec 31 09:32:58 2015 -0500
+++ b/src/mem/cache/cache.cc Thu Dec 31 09:33:25 2015 -0500
@@ -1904,6 +1904,13 @@
bool invalidate = pkt->isInvalidate();
bool M5_VAR_USED needs_writable = pkt->needsWritable();
+ // at the moment we could get an uncacheable write which does not
+ // have the invalidate flag, and we need a suitable way of dealing
+ // with this case
+ panic_if(invalidate && pkt->req->isUncacheable(),
+ "%s got an invalidating uncacheable snoop request %s to %#llx",
+ name(), pkt->cmdString(), pkt->getAddr());
+
uint32_t snoop_delay = 0;
if (forwardSnoops) {
@@ -1988,15 +1995,18 @@
return snoop_delay;
}
- if (!pkt->req->isUncacheable() && pkt->isRead() && !invalidate) {
- // reading without requiring the line in a writable state,
- // note that we retain the block as Owned if it is Modified
- // (dirty data), with the response taken care of below, and
- // otherwhise simply downgrade from Exclusive to Shared (or
- // remain in Shared)
+ if (pkt->isRead() && !invalidate) {
+ // reading without requiring the line in a writable state
assert(!needs_writable);
pkt->setHasSharers();
- blk->status &= ~BlkWritable;
+
+ // if the requesting packet is uncacheable, retain the line in
+ // the current state, otherwhise unset the writable flag,
+ // which means we go from Modified to Owned (and will respond
+ // below), remain in Owned (and will respond below), from
+ // Exclusive to Shared, or remain in Shared
+ if (!pkt->req->isUncacheable())
+ blk->status &= ~BlkWritable;
}
if (respond) {
@@ -2020,6 +2030,13 @@
// we already called setHasSharers above
}
+ // if we are returning a writable and dirty (Modified) line,
+ // we should be invalidating the line
+ panic_if(!invalidate && !pkt->hasSharers(),
+ "%s is passing a Modified line through %s to %#llx, "
+ "but keeping the block",
+ name(), pkt->cmdString(), pkt->getAddr());
+
if (is_timing) {
doTimingSupplyResponse(pkt, blk->data, is_deferred, pending_inval);
} else {
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev