From 2703fb56991f034bd7c633ae3ec367dcc7af7073 Mon Sep 17 00:00:00 2001 From: Matthew Poremba Date: Thu, 2 May 2024 11:39:48 -0700 Subject: [PATCH] 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 --- src/dev/amdgpu/amdgpu_device.cc | 8 +++++++- src/dev/amdgpu/interrupt_handler.cc | 8 ++++++-- src/dev/amdgpu/interrupt_handler.hh | 6 ++++-- src/dev/amdgpu/pm4_packet_processor.cc | 13 +++++++++++-- src/dev/amdgpu/sdma_engine.cc | 2 +- src/gpu-compute/compute_unit.cc | 4 ++-- 6 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/dev/amdgpu/amdgpu_device.cc b/src/dev/amdgpu/amdgpu_device.cc index f5bf0192bc..6bb5f9c2c5 100644 --- a/src/dev/amdgpu/amdgpu_device.cc +++ b/src/dev/amdgpu/amdgpu_device.cc @@ -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()); - return pkt->getLE(); + pkt_data = pkt->getLE(); + 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 diff --git a/src/dev/amdgpu/interrupt_handler.cc b/src/dev/amdgpu/interrupt_handler.cc index cb99ba7a39..4ad2527108 100644 --- a/src/dev/amdgpu/interrupt_handler.cc +++ b/src/dev/amdgpu/interrupt_handler.cc @@ -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, ®s.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(); diff --git a/src/dev/amdgpu/interrupt_handler.hh b/src/dev/amdgpu/interrupt_handler.hh index a895eabafc..b7ac4b29ee 100644 --- a/src/dev/amdgpu/interrupt_handler.hh +++ b/src/dev/amdgpu/interrupt_handler.hh @@ -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); } diff --git a/src/dev/amdgpu/pm4_packet_processor.cc b/src/dev/amdgpu/pm4_packet_processor.cc index 62e817aa98..a921942678 100644 --- a/src/dev/amdgpu/pm4_packet_processor.cc +++ b/src/dev/amdgpu/pm4_packet_processor.cc @@ -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); } diff --git a/src/dev/amdgpu/sdma_engine.cc b/src/dev/amdgpu/sdma_engine.cc index 070c04fe64..dcf0acac1a 100644 --- a/src/dev/amdgpu/sdma_engine.cc +++ b/src/dev/amdgpu/sdma_engine.cc @@ -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); } diff --git a/src/gpu-compute/compute_unit.cc b/src/gpu-compute/compute_unit.cc index daad5e9b40..f12293500d 100644 --- a/src/gpu-compute/compute_unit.cc +++ b/src/gpu-compute/compute_unit.cc @@ -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",