diff options
-rwxr-xr-x | src/mem/snoop_filter.cc | 18 |
1 files changed, 15 insertions, 3 deletions
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); } |