260,264c260,266
< // Update the residency of the cache line.
< if (cpkt->needsWritable() || !cpkt->hasSharers()) {
< DPRINTF(SnoopFilter, "%s: dropping %x because needs: %i writable: %i "\
< "SF val: %x.%x\n", __func__, rsp_mask,
< cpkt->needsWritable(), !cpkt->hasSharers(),
---
> // If the snoop response has no sharers the line is passed in
> // Modified state, and we know that there are no other copies, or
> // they will all be invalidated imminently
> if (!cpkt->hasSharers()) {
> DPRINTF(SnoopFilter,
> "%s: dropping %x because non-shared snoop "
> "response SF val: %x.%x\n", __func__, rsp_mask,
266,270d267
<
< sf_item.holder &= ~rsp_mask;
< // The snoop filter does not see any ACKs from non-responding sharers
< // that have been invalidated :( So below assert would be nice, but..
< //assert(sf_item.holder == 0);
305,312c302,305
< // Remote (to this snoop filter) snoops update the filter
< // already when they arrive from below, because we may not see
< // any response.
< if (cpkt->needsWritable()) {
< // If the request to this snoop response hit an in-flight
< // transaction,
< // the holder was not reset -> no assertion & do that here, now!
< //assert(sf_item.holder == 0);
---
> // If the snoop response has no sharers the line is passed in
> // Modified state, and we know that there are no other copies, or
> // they will all be invalidated imminently
> if (!cpkt->hasSharers()) {
346,348c339,342
< // Update the residency of the cache line. Here we assume that the
< // line has been zapped in all caches that are not the responder.
< if (cpkt->needsWritable() || !cpkt->hasSharers())
---
> // Update the residency of the cache line. If the response has no
> // sharers we know that the line has been invalidated in all
> // branches that are not where we are responding to.
> if (!cpkt->hasSharers())