From 8e55d51aaa71d71c7058e8ee15c89d3482991ba2 Mon Sep 17 00:00:00 2001 From: Andreas Hansson Date: Fri, 6 Nov 2015 03:26:33 -0500 Subject: [PATCH] mem: Do not treat CleanEvict as a write operation This patch changes the CleanEvict command type to not be considered a write. Initially it was made a zero-sized write to match the writeback command, but as things developed it became clear that it causes more problems than it solves. For example, the memory modules (and bridge) should not consider the CleanEvict as a write, but instead discard it. With this patch it will be neither a read, nor write, and as it does not need a response the slave will simply sink it. --- src/mem/cache/base.hh | 9 ++++++--- src/mem/packet.cc | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/mem/cache/base.hh b/src/mem/cache/base.hh index 3baec36d9..a992583fe 100644 --- a/src/mem/cache/base.hh +++ b/src/mem/cache/base.hh @@ -508,9 +508,12 @@ class BaseCache : public MemObject MSHR *allocateWriteBuffer(PacketPtr pkt, Tick time) { - // should only see clean evictions in a read-only cache - assert(!isReadOnly || pkt->cmd == MemCmd::CleanEvict); - assert(pkt->isWrite() && !pkt->isRead()); + // should only see writes or clean evicts here + assert(pkt->isWrite() || pkt->cmd == MemCmd::CleanEvict); + + // if this is a read-only cache we should never see any writes + assert(!(isReadOnly && pkt->isWrite())); + return allocateBufferInternal(&writeBuffer, blockAlign(pkt->getAddr()), blkSize, pkt, time, true); diff --git a/src/mem/packet.cc b/src/mem/packet.cc index b1e6dcd63..80b079138 100644 --- a/src/mem/packet.cc +++ b/src/mem/packet.cc @@ -88,7 +88,7 @@ MemCmd::commandInfo[] = { SET4(IsWrite, NeedsExclusive, IsRequest, HasData), InvalidCmd, "Writeback" }, /* CleanEvict */ - { SET2(IsWrite, IsRequest), InvalidCmd, "CleanEvict" }, + { SET1(IsRequest), InvalidCmd, "CleanEvict" }, /* SoftPFReq */ { SET4(IsRead, IsRequest, IsSWPrefetch, NeedsResponse), SoftPFResp, "SoftPFReq" }, -- 2.30.2