diff options
author | Andreas Hansson <andreas.hansson@arm.com> | 2015-12-31 09:33:39 -0500 |
---|---|---|
committer | Andreas Hansson <andreas.hansson@arm.com> | 2015-12-31 09:33:39 -0500 |
commit | 7fca994d04230f1e41b9443b33f891460fc5368d (patch) | |
tree | 3bd62bc958f5c81b68c3517d3ed3251203790036 /src/mem/cache/cache.cc | |
parent | f1ec326be59b137ff0955b4d80e6516754016fd5 (diff) | |
download | gem5-7fca994d04230f1e41b9443b33f891460fc5368d.tar.xz |
mem: Do not allocate space for packet data if not needed
This patch looks at the request and response command to determine if
either actually has any data payload, and if not, we do not allocate
any space for packet data.
The only tricky case is where the command type is changed as part of
the MSHR functionality. In these cases where the original packet had
no data, but the new packet does, we need to explicitly call
allocate().
Diffstat (limited to 'src/mem/cache/cache.cc')
-rw-r--r-- | src/mem/cache/cache.cc | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/mem/cache/cache.cc b/src/mem/cache/cache.cc index 991463d76..9050a1c30 100644 --- a/src/mem/cache/cache.cc +++ b/src/mem/cache/cache.cc @@ -185,7 +185,11 @@ Cache::satisfyCpuSideRequest(PacketPtr pkt, CacheBlk *blk, if (pkt->isLLSC()) { blk->trackLoadLocked(pkt); } + + // all read responses have a data payload + assert(pkt->hasRespData()); pkt->setDataFromBlock(blk->data, blkSize); + // determine if this read is from a (coherent) cache, or not // by looking at the command type; we could potentially add a // packet attribute such as 'FromCache' to make this check a @@ -796,10 +800,7 @@ Cache::recvTimingReq(PacketPtr pkt) } pkt->makeTimingResponse(); - // for debugging, set all the bits in the response data - // (also keeps valgrind from complaining when debugging settings - // print out instruction results) - std::memset(pkt->getPtr<uint8_t>(), 0xFF, pkt->getSize()); + // request_time is used here, taking into account lat and the delay // charged if the packet comes from the xbar. cpuSidePort->schedTimingResp(pkt, request_time, true); @@ -2041,7 +2042,10 @@ Cache::handleSnoop(PacketPtr pkt, CacheBlk *blk, bool is_timing, doTimingSupplyResponse(pkt, blk->data, is_deferred, pending_inval); } else { pkt->makeAtomicResponse(); - pkt->setDataFromBlock(blk->data, blkSize); + // packets such as upgrades do not actually have any data + // payload + if (pkt->hasData()) + pkt->setDataFromBlock(blk->data, blkSize); } } |