gpu-compute: Fix valgrind memleak complaints

Fixes several memory leaks, mostly of small and medium severity. Fixes
mismatched new/new[] and delete/delete[] calls.

Change-Id: Iedafc409389bd94e45f330bc587d6d72d1971219
This commit is contained in:
Matthew Poremba
2024-05-02 11:39:48 -07:00
parent 386fb3d1cc
commit 2703fb5699
6 changed files with 31 additions and 10 deletions

View File

@@ -453,6 +453,8 @@ AMDGPUDevice::writeFrame(PacketPtr pkt, Addr offset)
auto system = cp->shader()->gpuCmdProc.system();
system->getDeviceMemory(writePkt)->access(writePkt);
delete writePkt;
}
void
@@ -671,7 +673,10 @@ AMDGPUDevice::getRegVal(uint64_t addr)
DPRINTF(AMDGPUDevice, "Getting register 0x%lx = %x\n",
fixup_addr, pkt->getLE<uint32_t>());
return pkt->getLE<uint32_t>();
pkt_data = pkt->getLE<uint32_t>();
delete pkt;
return pkt_data;
}
void
@@ -686,6 +691,7 @@ AMDGPUDevice::setRegVal(uint64_t addr, uint32_t value)
PacketPtr pkt = Packet::createWrite(request);
pkt->dataStatic((uint8_t *)&pkt_data);
writeMMIO(pkt, addr);
delete pkt;
}
void

View File

@@ -130,6 +130,10 @@ AMDGPUInterruptHandler::DmaEvent::process()
} else {
fatal("Interrupt Handler DMA event returned bad value: %d\n", data);
}
if (dataPtr) {
delete [] dataPtr;
}
}
void
@@ -140,7 +144,7 @@ AMDGPUInterruptHandler::submitWritePointer()
Addr paddr = regs.WptrAddr;
std::memcpy(dataPtr, &regs.IH_Wptr, sizeof(uint32_t));
dmaEvent = new AMDGPUInterruptHandler::DmaEvent(this, 2);
dmaEvent = new AMDGPUInterruptHandler::DmaEvent(this, 2, dataPtr);
dmaWrite(paddr, sizeof(uint32_t), dmaEvent, dataPtr);
}
@@ -157,7 +161,7 @@ AMDGPUInterruptHandler::submitInterruptCookie()
DPRINTF(AMDGPUDevice, "InterruptHandler rptr: 0x%x wptr: 0x%x\n",
regs.IH_Rptr, regs.IH_Wptr);
dmaEvent = new AMDGPUInterruptHandler::DmaEvent(this, 1);
dmaEvent = new AMDGPUInterruptHandler::DmaEvent(this, 1, dataPtr);
dmaWrite(paddr, cookieSize, dmaEvent, dataPtr);
interruptQueue.pop();

View File

@@ -136,10 +136,12 @@ class AMDGPUInterruptHandler : public DmaDevice
private:
AMDGPUInterruptHandler *deviceIh;
uint32_t data;
uint8_t *dataPtr;
public:
DmaEvent(AMDGPUInterruptHandler *deviceIh, uint32_t data)
: Event(), deviceIh(deviceIh), data(data)
DmaEvent(AMDGPUInterruptHandler *deviceIh, uint32_t data,
uint8_t* _dataPtr)
: Event(), deviceIh(deviceIh), data(data), dataPtr(_dataPtr)
{
setFlags(Event::AutoDelete);
}

View File

@@ -456,8 +456,6 @@ PM4PacketProcessor::mapQueues(PM4Queue *q, PM4MapQueues *pkt)
} else {
panic("Unknown engine for MQD: %d\n", pkt->engineSel);
}
decodeNext(q);
}
void
@@ -494,6 +492,9 @@ PM4PacketProcessor::processMQD(PM4MapQueues *pkt, PM4Queue *q, Addr addr,
"hqdAQL %d.\n", mqd->base, mqd->mqdBase, mqd->aql);
gpuDevice->processPendingDoorbells(offset);
delete pkt;
decodeNext(q);
}
void
@@ -524,6 +525,9 @@ PM4PacketProcessor::processSDMAMQD(PM4MapQueues *pkt, PM4Queue *q, Addr addr,
gpuDevice->setDoorbellType(pkt->doorbellOffset << 2, RLC, getIpId());
gpuDevice->processPendingDoorbells(pkt->doorbellOffset << 2);
delete pkt;
decodeNext(q);
}
void
@@ -656,6 +660,7 @@ PM4PacketProcessor::unmapQueues(PM4Queue *q, PM4UnmapQueues *pkt)
dmaWriteVirt(addr, sizeof(QueueDesc), cb, mqd);
queues.erase(id);
hsa_pp.unsetDeviceQueueDesc(id, 8);
delete mqd;
}
}
gpuDevice->deallocateAllQueues();
@@ -754,6 +759,7 @@ PM4PacketProcessor::indirectBuffer(PM4Queue *q, PM4IndirectBuf *pkt)
q->ibBase(pkt->ibBase);
q->wptr(pkt->ibSize * sizeof(uint32_t));
delete pkt;
decodeNext(q);
}
@@ -766,6 +772,7 @@ PM4PacketProcessor::switchBuffer(PM4Queue *q, PM4SwitchBuf *pkt)
DPRINTF(PM4PacketProcessor, "PM4 switching buffer, rptr: %p.\n",
q->wptr());
delete pkt;
decodeNext(q);
}
@@ -784,6 +791,7 @@ PM4PacketProcessor::setUconfigReg(PM4Queue *q, PM4SetUconfigReg *pkt)
reg_addr += 0x40000 * getIpId();
gpuDevice->setRegVal(reg_addr, pkt->data);
delete pkt;
decodeNext(q);
}
@@ -800,6 +808,7 @@ PM4PacketProcessor::waitRegMem(PM4Queue *q, PM4WaitRegMem *pkt)
DPRINTF(PM4PacketProcessor, " Mask: %lx\n", pkt->mask);
DPRINTF(PM4PacketProcessor, " Poll Interval: %lx\n", pkt->pollInterval);
delete pkt;
decodeNext(q);
}

View File

@@ -1132,7 +1132,7 @@ SDMAEngine::constFillDone(SDMAQueue *q, sdmaConstFill *pkt, uint8_t *fill_data)
{
DPRINTF(SDMAEngine, "ConstFill to %lx done\n", pkt->addr);
delete fill_data;
delete [] fill_data;
delete pkt;
decodeNext(q);
}

View File

@@ -1735,7 +1735,7 @@ ComputeUnit::DataPort::processMemReqEvent(PacketPtr pkt)
SystemHubEvent *resp_event = new SystemHubEvent(pkt, this);
compute_unit->shader->systemHub->sendRequest(pkt, resp_event);
} else if (!(sendTimingReq(pkt))) {
retries.push_back(std::make_pair(pkt, gpuDynInst));
retries.emplace_back(pkt, gpuDynInst);
if (gpuDynInst) {
DPRINTF(GPUPort,
@@ -1772,7 +1772,7 @@ ComputeUnit::ScalarDataPort::MemReqEvent::process()
SystemHubEvent *resp_event = new SystemHubEvent(pkt, &scalarDataPort);
compute_unit->shader->systemHub->sendRequest(pkt, resp_event);
} else if (!(scalarDataPort.sendTimingReq(pkt))) {
scalarDataPort.retries.push_back(pkt);
scalarDataPort.retries.emplace_back(pkt);
DPRINTF(GPUPort,
"CU%d: WF[%d][%d]: addr %#x data req failed!\n",