mem: Remove redundant Packet::allocate calls
authorAndreas Hansson <andreas.hansson@arm.com>
Tue, 2 Dec 2014 11:07:41 +0000 (06:07 -0500)
committerAndreas Hansson <andreas.hansson@arm.com>
Tue, 2 Dec 2014 11:07:41 +0000 (06:07 -0500)
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.

35 files changed:
src/dev/alpha/backdoor.cc
src/dev/alpha/tsunami_cchip.cc
src/dev/alpha/tsunami_io.cc
src/dev/alpha/tsunami_pchip.cc
src/dev/arm/a9scu.cc
src/dev/arm/amba_device.cc
src/dev/arm/amba_fake.cc
src/dev/arm/energy_ctrl.cc
src/dev/arm/gic_pl390.cc
src/dev/arm/hdlcd.cc
src/dev/arm/kmi.cc
src/dev/arm/pl011.cc
src/dev/arm/pl111.cc
src/dev/arm/rtc_pl031.cc
src/dev/arm/rv_ctrl.cc
src/dev/arm/timer_cpulocal.cc
src/dev/arm/timer_sp804.cc
src/dev/arm/vgic.cc
src/dev/copy_engine.cc
src/dev/i8254xGBe.cc
src/dev/ide_ctrl.cc
src/dev/isa_fake.cc
src/dev/mips/malta_cchip.cc
src/dev/mips/malta_pchip.cc
src/dev/ns_gige.cc
src/dev/pciconfigall.cc
src/dev/pcidev.cc
src/dev/sinic.cc
src/dev/sparc/dtod.cc
src/dev/uart8250.cc
src/dev/virtio/base.cc
src/dev/virtio/pci.cc
src/mem/cache/cache_impl.hh
src/mem/packet.cc
src/mem/packet.hh

index dc0e8e49f6abfacb4220dc1e0a3e20d89b659896..59862089359dedfc72f4c96b511e74dbb2f0a908 100644 (file)
@@ -111,7 +111,6 @@ AlphaBackdoor::read(PacketPtr pkt)
 
     Addr daddr = pkt->getAddr() - pioAddr;
 
-    pkt->allocate();
     pkt->makeAtomicResponse();
 
     switch (pkt->getSize())
index 203325e75cee92af10a40de5a32dbfd790a441d0..7416de403036481c42599cc396ca19be01714b1a 100644 (file)
@@ -83,7 +83,6 @@ TsunamiCChip::read(PacketPtr pkt)
     Addr regnum = (pkt->getAddr() - pioAddr) >> 6;
     Addr daddr = (pkt->getAddr() - pioAddr);
 
-    pkt->allocate();
     switch (pkt->getSize()) {
 
       case sizeof(uint64_t):
index 6586cd9809fcf920462003d7396392819f9dcb08..2c503880ff07a600aea37b588bdbaaeb54a1bbbc 100644 (file)
@@ -96,8 +96,6 @@ TsunamiIO::read(PacketPtr pkt)
     DPRINTF(Tsunami, "io read  va=%#x size=%d IOPorrt=%#x\n", pkt->getAddr(),
             pkt->getSize(), daddr);
 
-    pkt->allocate();
-
     if (pkt->getSize() == sizeof(uint8_t)) {
         switch(daddr) {
           // PIC1 mask read
index 3ddc0f1b3686553d39a66e1973f9aee093f37fb9..328699f9fcdedad09516c01bd15add656a389291 100644 (file)
@@ -72,7 +72,6 @@ TsunamiPChip::read(PacketPtr pkt)
 {
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
 
-    pkt->allocate();
     Addr daddr = (pkt->getAddr() - pioAddr) >> 6;;
     assert(pkt->getSize() == sizeof(uint64_t));
 
index dc012a036b18e8f61f120978e622282af427dead..26b2a452285d5ed78768511cba3578ee964e8bff 100644 (file)
@@ -55,7 +55,6 @@ A9SCU::read(PacketPtr pkt)
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
     assert(pkt->getSize() == 4);
     Addr daddr = pkt->getAddr() - pioAddr;
-    pkt->allocate();
 
     switch(daddr) {
       case Control:
index d2333417f82c782687940625233a8a26064ba758..0ba20d0875a038b1d0ded2a586d0fd2ad2f1e0c7 100644 (file)
@@ -76,8 +76,6 @@ AmbaDevice::readId(PacketPtr pkt, uint64_t amba_id, Addr pio_addr)
     if (daddr < AMBA_PER_ID0 || daddr > AMBA_CEL_ID3)
         return false;
 
-    pkt->allocate();
-
     int byte = (daddr - AMBA_PER_ID0) << 1;
     // Too noisy right now
     DPRINTF(AMBA, "Returning %#x for offset %#x(%d)\n",
index 3ca705c6cce674db30c59ed43adfba21763078be..d415ab2fa7424256dd8bb2965f46d8ead0ec0424 100644 (file)
@@ -57,7 +57,6 @@ AmbaFake::read(PacketPtr pkt)
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
 
     Addr daddr = pkt->getAddr() - pioAddr;
-    pkt->allocate();
 
     DPRINTF(AMBA, " read register %#x\n", daddr);
 
@@ -74,7 +73,6 @@ AmbaFake::write(PacketPtr pkt)
 {
 
     Addr daddr = pkt->getAddr() - pioAddr;
-    pkt->allocate();
 
     if (!params()->ignore_access)
         panic("Tried to write AmbaFake at offset %#x that doesn't exist\n", daddr);
index cbfa5aa79272bcd9995258e782ebb07342a8c3aa..b77eaba3bff3c76a57dd445a7d1e18ceda4e387a 100644 (file)
@@ -64,7 +64,6 @@ EnergyCtrl::read(PacketPtr pkt)
 {
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
     assert(pkt->getSize() == 4);
-    pkt->allocate();
 
     Addr daddr = pkt->getAddr() - pioAddr;
     assert((daddr & 3) == 0);
index b93cdd028a5ffa112dfa637b99a0c942b03311e3..019b3ee8bcc8fba06f34e8b14a6dff2de8e83575 100644 (file)
@@ -150,7 +150,6 @@ Tick
 Pl390::readDistributor(PacketPtr pkt)
 {
     Addr daddr = pkt->getAddr() - distAddr;
-    pkt->allocate();
 
     int ctx_id = pkt->req->contextId();
 
@@ -284,7 +283,6 @@ Tick
 Pl390::readCpu(PacketPtr pkt)
 {
     Addr daddr = pkt->getAddr() - cpuAddr;
-    pkt->allocate();
 
     assert(pkt->req->hasContextId());
     int ctx_id = pkt->req->contextId();
@@ -369,7 +367,6 @@ Tick
 Pl390::readMsix(PacketPtr pkt)
 {
     Addr daddr = pkt->getAddr() - msixRegAddr;
-    pkt->allocate();
 
     DPRINTF(GIC, "Gic MSIX read register %#x\n", daddr);
 
@@ -390,7 +387,6 @@ Tick
 Pl390::writeDistributor(PacketPtr pkt)
 {
     Addr daddr = pkt->getAddr() - distAddr;
-    pkt->allocate();
 
     assert(pkt->req->hasContextId());
     int ctx_id = pkt->req->contextId();
@@ -531,7 +527,6 @@ Tick
 Pl390::writeCpu(PacketPtr pkt)
 {
     Addr daddr = pkt->getAddr() - cpuAddr;
-    pkt->allocate();
 
     assert(pkt->req->hasContextId());
     int ctx_id = pkt->req->contextId();
@@ -586,7 +581,6 @@ Tick
 Pl390::writeMsix(PacketPtr pkt)
 {
     Addr daddr = pkt->getAddr() - msixRegAddr;
-    pkt->allocate();
 
     DPRINTF(GIC, "Gic MSI-X write register %#x data %d\n",
                  daddr, pkt->get<uint32_t>());
index 349b246c263fae202e1cfb7a50e6e5594eff8c13..37569b22b32d099b7adbe0509c9bd5c0b92ce83e 100644 (file)
@@ -104,8 +104,6 @@ HDLcd::read(PacketPtr pkt)
             pkt->getAddr() < pioAddr + pioSize &&
             pkt->getSize() == 4);
 
-    pkt->allocate();
-
     switch (daddr) {
       case Version:
         data = version;
index 99d61c610c61ab4e09f77198053cf1382aecf198..2344b4cb566b3aa093f370fb126a29439c9bceb3 100644 (file)
@@ -69,8 +69,6 @@ Pl050::read(PacketPtr pkt)
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
 
     Addr daddr = pkt->getAddr() - pioAddr;
-    pkt->allocate();
-
 
     uint32_t data = 0;
 
index b47d0e9fb4174cbe3d6f26e6f875fc6ab6988887..d690ee9cbe89d80fc571f02035f61f286b2b14b3 100644 (file)
@@ -64,7 +64,6 @@ Pl011::read(PacketPtr pkt)
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
 
     Addr daddr = pkt->getAddr() - pioAddr;
-    pkt->allocate();
 
     DPRINTF(Uart, " read register %#x size=%d\n", daddr, pkt->getSize());
 
index 4d1bcba1e548d043da38bc687ec2f7dcd1c699c0..a5b9b412c45c1626a461aef041f10b97031d649f 100644 (file)
@@ -104,7 +104,6 @@ Pl111::read(PacketPtr pkt)
            pkt->getAddr() < pioAddr + pioSize);
 
     Addr daddr = pkt->getAddr() - pioAddr;
-    pkt->allocate();
 
     DPRINTF(PL111, " read register %#x size=%d\n", daddr, pkt->getSize());
 
index 8f421a1da64c93d0600543d003ed0e11e83a79d3..a43ac6271683edb83dd5543fbc6200b8ac9baabf 100644 (file)
@@ -62,7 +62,6 @@ PL031::read(PacketPtr pkt)
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
     assert(pkt->getSize() == 4);
     Addr daddr = pkt->getAddr() - pioAddr;
-    pkt->allocate();
     uint32_t data;
 
     DPRINTF(Timer, "Reading from RTC at offset: %#x\n", daddr);
@@ -125,7 +124,6 @@ PL031::write(PacketPtr pkt)
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
     assert(pkt->getSize() == 4);
     Addr daddr = pkt->getAddr() - pioAddr;
-    pkt->allocate();
     DPRINTF(Timer, "Writing to RTC at offset: %#x\n", daddr);
 
     switch (daddr) {
index af121861c9852be07bf6c923a444d81f734fc3b3..f2b85d513fa816fee1178fde559374c62af42795 100644 (file)
@@ -54,7 +54,6 @@ RealViewCtrl::read(PacketPtr pkt)
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
     assert(pkt->getSize() == 4);
     Addr daddr = pkt->getAddr() - pioAddr;
-    pkt->allocate();
 
     switch(daddr) {
       case ProcId0:
index ae341e2be97ef0a6fd40c4bc587895cd49f7eba9..de2f99f0aa549be1d71454579a93aadb9e99e2c7 100644 (file)
@@ -75,7 +75,6 @@ CpuLocalTimer::read(PacketPtr pkt)
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
     assert(pkt->getSize() == 4);
     Addr daddr = pkt->getAddr() - pioAddr;
-    pkt->allocate();
     int cpu_id = pkt->req->contextId();
     DPRINTF(Timer, "Reading from CpuLocalTimer at offset: %#x\n", daddr);
     assert(cpu_id >= 0);
@@ -154,7 +153,6 @@ CpuLocalTimer::write(PacketPtr pkt)
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
     assert(pkt->getSize() == 4);
     Addr daddr = pkt->getAddr() - pioAddr;
-    pkt->allocate();
     int cpu_id = pkt->req->contextId();
     DPRINTF(Timer, "Writing to CpuLocalTimer at offset: %#x\n", daddr);
     assert(cpu_id >= 0);
index 25bc08003e777b988b5dca1a667519d1c3faf244..9f7867107c423cb8a51704ddd4f58b1413290c8b 100644 (file)
@@ -66,7 +66,6 @@ Sp804::read(PacketPtr pkt)
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
     assert(pkt->getSize() == 4);
     Addr daddr = pkt->getAddr() - pioAddr;
-    pkt->allocate();
     DPRINTF(Timer, "Reading from DualTimer at offset: %#x\n", daddr);
 
     if (daddr < Timer::Size)
@@ -121,7 +120,6 @@ Sp804::write(PacketPtr pkt)
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
     assert(pkt->getSize() == 4);
     Addr daddr = pkt->getAddr() - pioAddr;
-    pkt->allocate();
     DPRINTF(Timer, "Writing to DualTimer at offset: %#x\n", daddr);
 
     if (daddr < Timer::Size)
index 2faf2030e577025f3984413fe9cde65c363ee691..4a63c796a9fbffd3af08c7f3a3f5ff7d15a79ff6 100644 (file)
@@ -92,7 +92,6 @@ Tick
 VGic::readVCpu(PacketPtr pkt)
 {
     Addr daddr = pkt->getAddr() - vcpuAddr;
-    pkt->allocate();
 
     int ctx_id = pkt->req->contextId();
     assert(ctx_id < VGIC_CPU_MAX);
@@ -137,7 +136,6 @@ Tick
 VGic::readCtrl(PacketPtr pkt)
 {
     Addr daddr = pkt->getAddr() - hvAddr;
-    pkt->allocate();
 
     int ctx_id = pkt->req->contextId();
 
@@ -232,7 +230,6 @@ Tick
 VGic::writeVCpu(PacketPtr pkt)
 {
     Addr daddr = pkt->getAddr() - vcpuAddr;
-    pkt->allocate();
 
     int ctx_id = pkt->req->contextId();
     assert(ctx_id < VGIC_CPU_MAX);
@@ -280,7 +277,6 @@ Tick
 VGic::writeCtrl(PacketPtr pkt)
 {
     Addr daddr = pkt->getAddr() - hvAddr;
-    pkt->allocate();
 
     int ctx_id = pkt->req->contextId();
 
index e4cd90c1c39b78c90dd51d46b039c5418eea2c2c..a3d73b634a71226a8adecbb96f70c6288e388824 100644 (file)
@@ -182,8 +182,6 @@ CopyEngine::read(PacketPtr pkt)
 
     DPRINTF(DMACopyEngine, "Read device register %#X size: %d\n", daddr, size);
 
-    pkt->allocate();
-
     ///
     /// Handle read of register here
     ///
index af973476102542fcb03bd2b071766df2d2ad95a1..70dba7c22cfbf9c682597a70e21fbea57b78313f 100644 (file)
@@ -183,8 +183,6 @@ IGbE::read(PacketPtr pkt)
 
     DPRINTF(Ethernet, "Read device register %#X\n", daddr);
 
-    pkt->allocate();
-
     //
     // Handle read of register here
     //
index bbc0e379d60cbf99ad4997ed2d217469123cdbba..27757529a09711de7e7768781aeaaabdf8dde697 100644 (file)
@@ -172,8 +172,6 @@ IdeController::readConfig(PacketPtr pkt)
         return PciDevice::readConfig(pkt);
     }
 
-    pkt->allocate();
-
     switch (pkt->getSize()) {
       case sizeof(uint8_t):
         switch (offset) {
@@ -462,7 +460,6 @@ IdeController::Channel::accessBMI(Addr offset,
 void
 IdeController::dispatchAccess(PacketPtr pkt, bool read)
 {
-    pkt->allocate();
     if (pkt->getSize() != 1 && pkt->getSize() != 2 && pkt->getSize() !=4)
          panic("Bad IDE read size: %d\n", pkt->getSize());
 
index 235dc3098c864c8fc3366cd69a091fc91aba201a..0871fecbbe6d84c099d6d5941abe7d8dbdd8d170 100644 (file)
@@ -53,7 +53,6 @@ IsaFake::IsaFake(Params *p)
 Tick
 IsaFake::read(PacketPtr pkt)
 {
-    pkt->allocate();
     pkt->makeAtomicResponse();
 
     if (params()->warn_access != "")
index fe333643500a06437b88e0d7c8a69d42bb10f2c1..dc521112298cc04573f8742e606e784cb8bc8eff 100755 (executable)
@@ -78,7 +78,6 @@ MaltaCChip::read(PacketPtr pkt)
     Addr regnum = (pkt->getAddr() - pioAddr) >> 6;
     Addr daddr = (pkt->getAddr() - pioAddr);
 
-    pkt->allocate();
     switch (pkt->getSize()) {
 
       case sizeof(uint64_t):
index 37aaa1b5a555e4aa094770f2d2c4d8739403b7ed..bee61fddd5744bdc6103e838c576c390bce24999 100755 (executable)
@@ -71,7 +71,6 @@ MaltaPChip::read(PacketPtr pkt)
 {
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
 
-    pkt->allocate();
     Addr daddr = (pkt->getAddr() - pioAddr) >> 6;;
     assert(pkt->getSize() == sizeof(uint64_t));
 
index 239babe708b3e205e4728d99334b6f3429898830..d87975759f9b526ac5e48b98dc236949898b070f 100644 (file)
@@ -186,8 +186,6 @@ NSGigE::read(PacketPtr pkt)
 {
     assert(ioEnable);
 
-    pkt->allocate();
-
     //The mask is to give you only the offset into the device register file
     Addr daddr = pkt->getAddr() & 0xfff;
     DPRINTF(EthernetPIO, "read  da=%#x pa=%#x size=%d\n",
index b0da01f0ba963edabfde8464ad5504f4ab8c736c..882366a426c65d12df03d3101e703ce2ee5d4633 100644 (file)
@@ -55,9 +55,6 @@ PciConfigAll::PciConfigAll(const Params *p)
 Tick
 PciConfigAll::read(PacketPtr pkt)
 {
-
-    pkt->allocate();
-
     DPRINTF(PciConfigAll, "read  va=%#x size=%d\n", pkt->getAddr(),
             pkt->getSize());
 
index 232aa9e8b24d0e7e33e9b601ffb729b19c4e6b0a..715b67603e4224983b55050f21aa1ad10d3a19a6 100644 (file)
@@ -294,10 +294,6 @@ PciDevice::readConfig(PacketPtr pkt)
         panic("Out-of-range access to PCI config space!\n");
     }
 
-
-
-    pkt->allocate();
-
     switch (pkt->getSize()) {
       case sizeof(uint8_t):
         pkt->set<uint8_t>(config.data[offset]);
index 798fb17ef7eb9724003ff7be958c86bf62aebf7f..a5608fb36384eaed90b86dbd131f196c759c97c0 100644 (file)
@@ -225,8 +225,6 @@ Device::read(PacketPtr pkt)
     Addr index = daddr >> Regs::VirtualShift;
     Addr raddr = daddr & Regs::VirtualMask;
 
-    pkt->allocate();
-
     if (!regValid(raddr))
         panic("invalid register: cpu=%d vnic=%d da=%#x pa=%#x size=%d",
               cpu, index, daddr, pkt->getAddr(), pkt->getSize());
index 94a32bed461d7ce4ec03190e415f3bb0739299c0..3853abb16b7dbd61845a4d0b7dcb3c04b2822a53 100644 (file)
@@ -65,7 +65,6 @@ DumbTOD::read(PacketPtr pkt)
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
     assert(pkt->getSize() == 8);
 
-    pkt->allocate();
     pkt->set(todTime);
     todTime += 1000;
 
index 40ee7d38f223cb27d4f4e5055b63aa1638606eb6..e840d2a56a52cbb0e633abb49b5fcf870ec9cd69 100644 (file)
@@ -113,7 +113,6 @@ Uart8250::read(PacketPtr pkt)
     assert(pkt->getSize() == 1);
 
     Addr daddr = pkt->getAddr() - pioAddr;
-    pkt->allocate();
 
     DPRINTF(Uart, " read register %#x\n", daddr);
 
index 44cce65c4a984fa0cdd12a2f63ec0fb259e6e8d9..06c6e34521dcb571ec7f148aab663caf2f3f0989 100644 (file)
@@ -422,7 +422,6 @@ void
 VirtIODeviceBase::readConfigBlob(PacketPtr pkt, Addr cfgOffset, const uint8_t *cfg)
 {
     const unsigned size(pkt->getSize());
-    pkt->allocate();
 
     if (cfgOffset + size > configSize)
         panic("Config read out of bounds.\n");
@@ -434,7 +433,6 @@ void
 VirtIODeviceBase::writeConfigBlob(PacketPtr pkt, Addr cfgOffset, uint8_t *cfg)
 {
     const unsigned size(pkt->getSize());
-    pkt->allocate();
 
     if (cfgOffset + size > configSize)
         panic("Config write out of bounds.\n");
index 1f99d7fe4eae0b947030bb9e7a803c9e5daf4d65..c77b61934d1e6ea97fc301c731dce386eec3661a 100644 (file)
@@ -75,8 +75,6 @@ PciVirtIO::read(PacketPtr pkt)
         return 0;
     }
 
-    pkt->allocate();
-
     switch(offset) {
       case OFF_DEVICE_FEATURES:
         DPRINTF(VIOPci, "   DEVICE_FEATURES request\n");
@@ -153,8 +151,6 @@ PciVirtIO::write(PacketPtr pkt)
         return 0;
     }
 
-    pkt->allocate();
-
     switch(offset) {
       case OFF_DEVICE_FEATURES:
         warn("Guest tried to write device features.");
index f4099c0ef437ffad849293cce4e8671ec02ce88e..2eb38805c2f454d95c49ea10ff4644d0888b72a7 100644 (file)
@@ -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>());
             }
index 9dd67746b291aa59dc2241f40087a001a9571fbd..758770824ba3285dbf6617454cbaace0258fcbb9 100644 (file)
@@ -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 {
index b540ef6cad19e5702f7116f6825fd15140d1ab49..e8fb00680829760e1c0a4278f352a72e22d61958 100644 (file)
@@ -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()];