diff -r 419dea20b1a1 -r a12bce848e83 src/mem/cache/cache.cc --- a/src/mem/cache/cache.cc Fri Nov 18 16:46:12 2016 +0000 +++ b/src/mem/cache/cache.cc Fri Nov 18 16:46:41 2016 +0000 @@ -1783,9 +1783,6 @@ // dirty as part of satisfyRequest if (pkt->cmd == MemCmd::WriteLineReq) { assert(!pkt->hasSharers()); - // at the moment other caches do not respond to the - // invalidation requests corresponding to a whole-line write - assert(!pkt->cacheResponding()); } // here we deal with setting the appropriate state of the line, @@ -1985,11 +1982,10 @@ // We may end up modifying both the block state and the packet (if // we respond in atomic mode), so just figure out what to do now - // and then do it later. If we find dirty data while snooping for - // an invalidate, we don't need to send a response. The + // and then do it later. We respond to all snoops that need + // responses provided we have the block in dirty state. The // invalidation itself is taken care of below. - bool respond = blk->isDirty() && pkt->needsResponse() && - pkt->cmd != MemCmd::InvalidateReq; + bool respond = blk->isDirty() && pkt->needsResponse(); bool have_writable = blk->isWritable(); // Invalidate any prefetch's from below that would strip write permissions @@ -2160,7 +2156,7 @@ // state to determine if it is dirty and writable, we use the // command and fields of the writeback packet bool respond = wb_pkt->cmd == MemCmd::WritebackDirty && - pkt->needsResponse() && pkt->cmd != MemCmd::InvalidateReq; + pkt->needsResponse(); bool have_writable = !wb_pkt->hasSharers(); bool invalidate = pkt->isInvalidate(); diff -r 419dea20b1a1 -r a12bce848e83 src/mem/cache/mshr.cc --- a/src/mem/cache/mshr.cc Fri Nov 18 16:46:12 2016 +0000 +++ b/src/mem/cache/mshr.cc Fri Nov 18 16:46:41 2016 +0000 @@ -402,8 +402,7 @@ // Start by determining if we will eventually respond or not, // matching the conditions checked in Cache::handleSnoop - bool will_respond = isPendingModified() && pkt->needsResponse() && - pkt->cmd != MemCmd::InvalidateReq; + bool will_respond = isPendingModified() && pkt->needsResponse(); // The packet we are snooping may be deleted by the time we // actually process the target, and we consequently need to