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.
This commit is contained in:
Andreas Hansson
2014-12-02 06:07:41 -05:00
parent 0706a25203
commit 5df96cb690
35 changed files with 6 additions and 72 deletions

View File

@@ -111,7 +111,6 @@ AlphaBackdoor::read(PacketPtr pkt)
Addr daddr = pkt->getAddr() - pioAddr;
pkt->allocate();
pkt->makeAtomicResponse();
switch (pkt->getSize())

View 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):

View 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

View 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));

View 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:

View 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",

View 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);

View 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);

View 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>());

View File

@@ -104,8 +104,6 @@ HDLcd::read(PacketPtr pkt)
pkt->getAddr() < pioAddr + pioSize &&
pkt->getSize() == 4);
pkt->allocate();
switch (daddr) {
case Version:
data = version;

View 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;

View 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());

View 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());

View 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) {

View 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:

View 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);

View 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)

View 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();

View 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
///

View File

@@ -183,8 +183,6 @@ IGbE::read(PacketPtr pkt)
DPRINTF(Ethernet, "Read device register %#X\n", daddr);
pkt->allocate();
//
// Handle read of register here
//

View 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());

View File

@@ -53,7 +53,6 @@ IsaFake::IsaFake(Params *p)
Tick
IsaFake::read(PacketPtr pkt)
{
pkt->allocate();
pkt->makeAtomicResponse();
if (params()->warn_access != "")

View File

@@ -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):

View File

@@ -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));

View 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",

View 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());

View 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]);

View 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());

View 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;

View 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);

View 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");

View 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.");

View 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>());
}

View 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 {

View 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()];