From: Nikos Nikoleris Date: Mon, 26 Sep 2016 15:43:59 +0000 (+0100) Subject: mem: Handle CMO responses in the snoop filter X-Git-Tag: v19.0.0.0~2466 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=eb2722609a11c992b55bf20dec1823b4118382c6;p=gem5.git mem: Handle CMO responses in the snoop filter Previously responses would either transfer the ownership of the line or the actual data to the cache that send out the original request. Cache clean operations are different since they bring neither data nor ownership. When they are also invalidating the cache that send out the original request will invalidate any existing copies. This patch makes the snoop filter handle the cache clean responses accordingly. Change-Id: I27165cb45b9dc57882526329c62db35f100d23df Reviewed-by: Stephan Diestelhorst Reviewed-by: Sudhanshu Jha Reviewed-by: Anouk Van Laer Reviewed-on: https://gem5-review.googlesource.com/5053 Maintainer: Nikos Nikoleris Reviewed-by: Jason Lowe-Power --- diff --git a/src/mem/snoop_filter.cc b/src/mem/snoop_filter.cc index 252fbb524..3e1dae6c7 100755 --- a/src/mem/snoop_filter.cc +++ b/src/mem/snoop_filter.cc @@ -362,10 +362,22 @@ SnoopFilter::updateResponse(const Packet* cpkt, const SlavePort& slave_port) panic_if(!(sf_item.requested & slave_mask), "SF value %x.%x missing "\ "request bit\n", sf_item.requested, sf_item.holder); - // Update the residency of the cache line. - sf_item.holder |= slave_mask; sf_item.requested &= ~slave_mask; - assert(sf_item.holder | sf_item.requested); + // Update the residency of the cache line. + + if (cpkt->req->isCacheMaintenance()) { + // A cache clean response does not carry any data so it + // shouldn't change the holders, unless it is invalidating. + if (cpkt->isInvalidate()) { + sf_item.holder &= ~slave_mask; + } + eraseIfNullEntry(sf_it); + } else { + // Any other response implies that a cache above will have the + // block. + sf_item.holder |= slave_mask; + assert(sf_item.holder | sf_item.requested); + } DPRINTF(SnoopFilter, "%s: new SF value %x.%x\n", __func__, sf_item.requested, sf_item.holder); }