diff options
author | Andreas Hansson <andreas.hansson@arm.com> | 2014-12-02 06:07:41 -0500 |
---|---|---|
committer | Andreas Hansson <andreas.hansson@arm.com> | 2014-12-02 06:07:41 -0500 |
commit | 5df96cb690168d750ab0fafffd11fb51624374d2 (patch) | |
tree | b8345b3c1b9f5a998a6eca8d68aa0022086b604d /src/mem | |
parent | 0706a252031b3f160bac65fac00b22f8a5ebf4f9 (diff) | |
download | gem5-5df96cb690168d750ab0fafffd11fb51624374d2.tar.xz |
mem: Remove redundant Packet::allocate calls
This patch cleans up the packet memory allocation confusion. The data
is always allocated at the requesting side, when a packet is created
(or copied), and there is never a need for any device to allocate any
space if it is merely responding to a paket. This behaviour is in line
with how SystemC and TLM works as well, thus increasing
interoperability, and matching established conventions.
The redundant calls to Packet::allocate are removed, and the checks in
the function are tightened up to make sure data is only ever allocated
once. There are still some oddities in the packet copy constructor
where we copy the data pointer if it is static (without ownership),
and allocate new space if the data is dynamic (with ownership). The
latter is being worked on further in a follow-on patch.
Diffstat (limited to 'src/mem')
-rw-r--r-- | src/mem/cache/cache_impl.hh | 2 | ||||
-rw-r--r-- | src/mem/packet.cc | 1 | ||||
-rw-r--r-- | src/mem/packet.hh | 12 |
3 files changed, 6 insertions, 9 deletions
diff --git a/src/mem/cache/cache_impl.hh b/src/mem/cache/cache_impl.hh index f4099c0ef..2eb38805c 100644 --- a/src/mem/cache/cache_impl.hh +++ b/src/mem/cache/cache_impl.hh @@ -1566,7 +1566,6 @@ doTimingSupplyResponse(PacketPtr req_pkt, const uint8_t *blk_data, // already made a copy... PacketPtr pkt = already_copied ? req_pkt : new Packet(req_pkt); assert(req_pkt->isInvalidate() || pkt->sharedAsserted()); - pkt->allocate(); pkt->makeTimingResponse(); // @todo Make someone pay for this pkt->firstWordDelay = pkt->lastWordDelay = 0; @@ -2018,7 +2017,6 @@ Cache<TagStore>::getTimingPacket() // make copy of current packet to forward, keep current // copy for response handling pkt = new Packet(tgt_pkt); - pkt->allocate(); if (pkt->isWrite()) { pkt->setData(tgt_pkt->getConstPtr<uint8_t>()); } diff --git a/src/mem/packet.cc b/src/mem/packet.cc index 9dd67746b..758770824 100644 --- a/src/mem/packet.cc +++ b/src/mem/packet.cc @@ -204,7 +204,6 @@ Packet::checkFunctional(Printable *obj, Addr addr, bool is_secure, int size, if (isRead()) { if (func_start >= val_start && func_end <= val_end) { - allocate(); memcpy(getPtr<uint8_t>(), data + offset, getSize()); return true; } else { diff --git a/src/mem/packet.hh b/src/mem/packet.hh index b540ef6ca..e8fb00680 100644 --- a/src/mem/packet.hh +++ b/src/mem/packet.hh @@ -659,6 +659,11 @@ class Packet : public Printable flags.set(pkt->flags & (VALID_ADDR|VALID_SIZE)); flags.set(pkt->flags & STATIC_DATA); + + // if we did not copy the static data pointer, allocate data + // dynamically instead + if (!data) + allocate(); } /** @@ -942,15 +947,10 @@ class Packet : public Printable data = NULL; } - /** If there isn't data in the packet, allocate some. */ + /** Allocate memory for the packet. */ void allocate() { - if (data) { - assert(flags.isSet(STATIC_DATA|DYNAMIC_DATA)); - return; - } - assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA)); flags.set(DYNAMIC_DATA|ARRAY_DATA); data = new uint8_t[getSize()]; |