Skip to content

Commit 129380c

Browse files
Cleanup host ptr manager
Change-Id: I0fc9df41a08255eef8072666c1c5c16806e0f7cf Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
1 parent e128cb7 commit 129380c

21 files changed

+271
-183
lines changed

runtime/mem_obj/buffer.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "runtime/helpers/ptr_math.h"
1818
#include "runtime/helpers/string.h"
1919
#include "runtime/helpers/validators.h"
20+
#include "runtime/memory_manager/host_ptr_manager.h"
2021
#include "runtime/memory_manager/memory_manager.h"
2122
#include "runtime/memory_manager/svm_memory_manager.h"
2223
#include "runtime/os_interface/debug_settings_manager.h"
@@ -238,19 +239,19 @@ void Buffer::checkMemory(cl_mem_flags flags,
238239
cl_int &errcodeRet,
239240
bool &alignementSatisfied,
240241
bool &copyMemoryFromHostPtr,
241-
MemoryManager *memMngr) {
242+
MemoryManager *memoryManager) {
242243
errcodeRet = CL_SUCCESS;
243244
alignementSatisfied = true;
244245
copyMemoryFromHostPtr = false;
245246
uintptr_t minAddress = 0;
246-
auto memRestrictions = memMngr->getAlignedMallocRestrictions();
247+
auto memRestrictions = memoryManager->getAlignedMallocRestrictions();
247248
if (memRestrictions) {
248249
minAddress = memRestrictions->minAddress;
249250
}
250251

251252
if (flags & CL_MEM_USE_HOST_PTR) {
252253
if (hostPtr) {
253-
auto fragment = memMngr->hostPtrManager.getFragment(hostPtr);
254+
auto fragment = memoryManager->getHostPtrManager()->getFragment(hostPtr);
254255
if (fragment && fragment->driverAllocation) {
255256
errcodeRet = CL_INVALID_HOST_PTR;
256257
return;

runtime/memory_manager/host_ptr_manager.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,12 @@
66
*/
77

88
#include "runtime/command_stream/command_stream_receiver.h"
9-
#include "runtime/helpers/ptr_math.h"
10-
#include "runtime/helpers/abort.h"
9+
#include "runtime/memory_manager/host_ptr_manager.h"
1110
#include "runtime/memory_manager/memory_manager.h"
1211

1312
using namespace OCLRT;
1413

15-
std::map<const void *, FragmentStorage>::iterator HostPtrManager::findElement(const void *ptr) {
14+
HostPtrFragmentsContainer::iterator HostPtrManager::findElement(const void *ptr) {
1615
auto nextElement = partialAllocations.lower_bound(ptr);
1716
auto element = nextElement;
1817
if (element != partialAllocations.end()) {

runtime/memory_manager/host_ptr_manager.h

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,29 @@
77

88
#pragma once
99
#include <map>
10-
#include "runtime/helpers/aligned_memory.h"
11-
#include "runtime/memory_manager/graphics_allocation.h"
10+
#include <mutex>
1211
#include "runtime/memory_manager/host_ptr_defines.h"
1312

1413
namespace OCLRT {
1514

16-
typedef std::map<const void *, FragmentStorage> HostPtrFragmentsContainer;
15+
using HostPtrFragmentsContainer = std::map<const void *, FragmentStorage>;
1716
class MemoryManager;
1817
class HostPtrManager {
1918
public:
20-
static AllocationRequirements getAllocationRequirements(const void *inputPtr, size_t size);
21-
OsHandleStorage populateAlreadyAllocatedFragments(AllocationRequirements &requirements, CheckedFragments *checkedFragments);
22-
void storeFragment(FragmentStorage &fragment);
23-
void storeFragment(AllocationStorageData &storageData);
24-
19+
FragmentStorage *getFragment(const void *inputPtr);
20+
OsHandleStorage prepareOsStorageForAllocation(MemoryManager &memoryManager, size_t size, const void *ptr);
2521
void releaseHandleStorage(OsHandleStorage &fragments);
2622
bool releaseHostPtr(const void *ptr);
23+
void storeFragment(AllocationStorageData &storageData);
24+
void storeFragment(FragmentStorage &fragment);
2725

28-
FragmentStorage *getFragment(const void *inputPtr);
29-
size_t getFragmentCount() { return partialAllocations.size(); }
26+
protected:
27+
static AllocationRequirements getAllocationRequirements(const void *inputPtr, size_t size);
28+
OsHandleStorage populateAlreadyAllocatedFragments(AllocationRequirements &requirements, CheckedFragments *checkedFragments);
3029
FragmentStorage *getFragmentAndCheckForOverlaps(const void *inputPtr, size_t size, OverlapStatus &overlappingStatus);
31-
OsHandleStorage prepareOsStorageForAllocation(MemoryManager &memoryManager, size_t size, const void *ptr);
3230
RequirementsStatus checkAllocationsForOverlapping(MemoryManager &memoryManager, AllocationRequirements *requirements, CheckedFragments *checkedFragments);
3331

34-
private:
35-
std::map<const void *, FragmentStorage>::iterator findElement(const void *ptr);
36-
32+
HostPtrFragmentsContainer::iterator findElement(const void *ptr);
3733
HostPtrFragmentsContainer partialAllocations;
3834
std::recursive_mutex allocationsMutex;
3935
};

runtime/memory_manager/memory_manager.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "runtime/helpers/options.h"
1717
#include "runtime/helpers/timestamp_packet.h"
1818
#include "runtime/memory_manager/deferred_deleter.h"
19+
#include "runtime/memory_manager/host_ptr_manager.h"
1920
#include "runtime/memory_manager/internal_allocation_storage.h"
2021
#include "runtime/os_interface/os_context.h"
2122
#include "runtime/utilities/stackvec.h"
@@ -60,7 +61,8 @@ GraphicsAllocation *AllocationsList::detachAllocationImpl(GraphicsAllocation *,
6061
MemoryManager::MemoryManager(bool enable64kbpages, bool enableLocalMemory,
6162
ExecutionEnvironment &executionEnvironment) : allocator32Bit(nullptr), enable64kbpages(enable64kbpages),
6263
localMemorySupported(enableLocalMemory),
63-
executionEnvironment(executionEnvironment){};
64+
executionEnvironment(executionEnvironment),
65+
hostPtrManager(std::make_unique<HostPtrManager>()){};
6466

6567
MemoryManager::~MemoryManager() {
6668
for (auto osContext : registeredOsContexts) {
@@ -119,15 +121,15 @@ GraphicsAllocation *MemoryManager::allocateGraphicsMemory(size_t size, const voi
119121
deferredDeleter->drain(true);
120122
}
121123
GraphicsAllocation *graphicsAllocation = nullptr;
122-
auto osStorage = hostPtrManager.prepareOsStorageForAllocation(*this, size, ptr);
124+
auto osStorage = hostPtrManager->prepareOsStorageForAllocation(*this, size, ptr);
123125
if (osStorage.fragmentCount > 0) {
124126
graphicsAllocation = createGraphicsAllocation(osStorage, size, ptr);
125127
}
126128
return graphicsAllocation;
127129
}
128130

129131
void MemoryManager::cleanGraphicsMemoryCreatedFromHostPtr(GraphicsAllocation *graphicsAllocation) {
130-
hostPtrManager.releaseHandleStorage(graphicsAllocation->fragmentsStorage);
132+
hostPtrManager->releaseHandleStorage(graphicsAllocation->fragmentsStorage);
131133
cleanOsHandles(graphicsAllocation->fragmentsStorage);
132134
}
133135

runtime/memory_manager/memory_manager.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
#include "runtime/helpers/aligned_memory.h"
1010
#include "runtime/memory_manager/graphics_allocation.h"
1111
#include "runtime/memory_manager/host_ptr_defines.h"
12-
#include "runtime/memory_manager/host_ptr_manager.h"
1312
#include "runtime/os_interface/32bit_memory.h"
1413

1514
#include <cstdint>
@@ -22,6 +21,7 @@ class Device;
2221
class DeferredDeleter;
2322
class ExecutionEnvironment;
2423
class GraphicsAllocation;
24+
class HostPtrManager;
2525
class CommandStreamReceiver;
2626
class OsContext;
2727
class TimestampPacket;
@@ -213,8 +213,6 @@ class MemoryManager {
213213

214214
MOCKABLE_VIRTUAL std::unique_ptr<GraphicsAllocation> obtainReusableAllocation(size_t requiredSize, bool isInternalAllocationRequired);
215215

216-
HostPtrManager hostPtrManager;
217-
218216
virtual GraphicsAllocation *createGraphicsAllocation(OsHandleStorage &handleStorage, size_t hostPtrSize, const void *hostPtr) = 0;
219217

220218
bool peek64kbPagesEnabled() const { return enable64kbpages; }
@@ -252,6 +250,7 @@ class MemoryManager {
252250
void registerOsContext(OsContext *contextToRegister);
253251
size_t getOsContextCount() { return registeredOsContexts.size(); }
254252
CommandStreamReceiver *getCommandStreamReceiver(uint32_t contextId);
253+
HostPtrManager *getHostPtrManager() const { return hostPtrManager.get(); }
255254

256255
protected:
257256
static bool getAllocationData(AllocationData &allocationData, const AllocationFlags &flags, const DevicesBitfield devicesBitfield,
@@ -271,6 +270,7 @@ class MemoryManager {
271270
bool localMemorySupported = false;
272271
ExecutionEnvironment &executionEnvironment;
273272
std::vector<OsContext *> registeredOsContexts;
273+
std::unique_ptr<HostPtrManager> hostPtrManager;
274274
};
275275

276276
std::unique_ptr<DeferredDeleter> createDeferredDeleter();

runtime/memory_manager/os_agnostic_memory_manager.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "runtime/helpers/options.h"
1515
#include "runtime/helpers/ptr_math.h"
1616
#include "runtime/helpers/surface_formats.h"
17+
#include "runtime/memory_manager/host_ptr_manager.h"
1718
#include <cassert>
1819

1920
namespace OCLRT {
@@ -132,16 +133,16 @@ void OsAgnosticMemoryManager::addAllocationToHostPtrManager(GraphicsAllocation *
132133
fragment.fragmentSize = alignUp(gfxAllocation->getUnderlyingBufferSize(), MemoryConstants::pageSize);
133134
fragment.osInternalStorage = new OsHandle();
134135
fragment.residency = new ResidencyData();
135-
hostPtrManager.storeFragment(fragment);
136+
hostPtrManager->storeFragment(fragment);
136137
}
137138

138139
void OsAgnosticMemoryManager::removeAllocationFromHostPtrManager(GraphicsAllocation *gfxAllocation) {
139140
auto buffer = gfxAllocation->getUnderlyingBuffer();
140-
auto fragment = hostPtrManager.getFragment(buffer);
141+
auto fragment = hostPtrManager->getFragment(buffer);
141142
if (fragment && fragment->driverAllocation) {
142143
OsHandle *osStorageToRelease = fragment->osInternalStorage;
143144
ResidencyData *residencyDataToRelease = fragment->residency;
144-
if (hostPtrManager.releaseHostPtr(buffer)) {
145+
if (hostPtrManager->releaseHostPtr(buffer)) {
145146
delete osStorageToRelease;
146147
delete residencyDataToRelease;
147148
}
@@ -210,7 +211,7 @@ MemoryManager::AllocationStatus OsAgnosticMemoryManager::populateOsHandles(OsHan
210211
newFragment.fragmentSize = handleStorage.fragmentStorageData[i].fragmentSize;
211212
newFragment.osInternalStorage = handleStorage.fragmentStorageData[i].osHandleStorage;
212213
newFragment.residency = handleStorage.fragmentStorageData[i].residency;
213-
hostPtrManager.storeFragment(newFragment);
214+
hostPtrManager->storeFragment(newFragment);
214215
}
215216
}
216217
return AllocationStatus::Success;

runtime/os_interface/linux/drm_memory_manager.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "runtime/device/device.h"
99
#include "runtime/helpers/ptr_math.h"
1010
#include "runtime/helpers/options.h"
11+
#include "runtime/memory_manager/host_ptr_manager.h"
1112
#include "runtime/os_interface/32bit_memory.h"
1213
#include "runtime/os_interface/linux/drm_allocation.h"
1314
#include "runtime/os_interface/linux/drm_buffer_object.h"
@@ -406,16 +407,16 @@ void DrmMemoryManager::addAllocationToHostPtrManager(GraphicsAllocation *gfxAllo
406407
fragment.osInternalStorage = new OsHandle();
407408
fragment.residency = new ResidencyData();
408409
fragment.osInternalStorage->bo = drmMemory->getBO();
409-
hostPtrManager.storeFragment(fragment);
410+
hostPtrManager->storeFragment(fragment);
410411
}
411412

412413
void DrmMemoryManager::removeAllocationFromHostPtrManager(GraphicsAllocation *gfxAllocation) {
413414
auto buffer = gfxAllocation->getUnderlyingBuffer();
414-
auto fragment = hostPtrManager.getFragment(buffer);
415+
auto fragment = hostPtrManager->getFragment(buffer);
415416
if (fragment && fragment->driverAllocation) {
416417
OsHandle *osStorageToRelease = fragment->osInternalStorage;
417418
ResidencyData *residencyDataToRelease = fragment->residency;
418-
if (hostPtrManager.releaseHostPtr(buffer)) {
419+
if (hostPtrManager->releaseHostPtr(buffer)) {
419420
delete osStorageToRelease;
420421
delete residencyDataToRelease;
421422
}
@@ -509,7 +510,7 @@ MemoryManager::AllocationStatus DrmMemoryManager::populateOsHandles(OsHandleStor
509510
}
510511

511512
for (uint32_t i = 0; i < numberOfBosAllocated; i++) {
512-
hostPtrManager.storeFragment(handleStorage.fragmentStorageData[indexesOfAllocatedBos[i]]);
513+
hostPtrManager->storeFragment(handleStorage.fragmentStorageData[indexesOfAllocatedBos[i]]);
513514
}
514515
return AllocationStatus::Success;
515516
}

runtime/os_interface/windows/wddm_memory_manager.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "runtime/helpers/surface_formats.h"
1717
#include "runtime/memory_manager/deferrable_deletion.h"
1818
#include "runtime/memory_manager/deferred_deleter.h"
19+
#include "runtime/memory_manager/host_ptr_manager.h"
1920
#include "runtime/os_interface/windows/wddm/wddm.h"
2021
#include "runtime/os_interface/windows/wddm_allocation.h"
2122
#include "runtime/os_interface/windows/wddm_residency_controller.h"
@@ -285,15 +286,15 @@ void WddmMemoryManager::addAllocationToHostPtrManager(GraphicsAllocation *gfxAll
285286
fragment.osInternalStorage->handle = wddmMemory->handle;
286287
fragment.osInternalStorage->gmm = gfxAllocation->gmm;
287288
fragment.residency = &wddmMemory->getResidencyData();
288-
hostPtrManager.storeFragment(fragment);
289+
hostPtrManager->storeFragment(fragment);
289290
}
290291

291292
void WddmMemoryManager::removeAllocationFromHostPtrManager(GraphicsAllocation *gfxAllocation) {
292293
auto buffer = gfxAllocation->getUnderlyingBuffer();
293-
auto fragment = hostPtrManager.getFragment(buffer);
294+
auto fragment = hostPtrManager->getFragment(buffer);
294295
if (fragment && fragment->driverAllocation) {
295296
OsHandle *osStorageToRelease = fragment->osInternalStorage;
296-
if (hostPtrManager.releaseHostPtr(buffer)) {
297+
if (hostPtrManager->releaseHostPtr(buffer)) {
297298
delete osStorageToRelease;
298299
}
299300
}
@@ -406,7 +407,7 @@ MemoryManager::AllocationStatus WddmMemoryManager::populateOsHandles(OsHandleSto
406407
}
407408

408409
for (uint32_t i = 0; i < allocatedFragmentsCounter; i++) {
409-
hostPtrManager.storeFragment(handleStorage.fragmentStorageData[allocatedFragmentIndexes[i]]);
410+
hostPtrManager->storeFragment(handleStorage.fragmentStorageData[allocatedFragmentIndexes[i]]);
410411
}
411412

412413
return AllocationStatus::Success;
@@ -442,7 +443,7 @@ void WddmMemoryManager::cleanOsHandles(OsHandleStorage &handleStorage) {
442443
void WddmMemoryManager::obtainGpuAddresFromFragments(WddmAllocation *allocation, OsHandleStorage &handleStorage) {
443444
if (this->force32bitAllocations && (handleStorage.fragmentCount > 0)) {
444445
auto hostPtr = allocation->getUnderlyingBuffer();
445-
auto fragment = hostPtrManager.getFragment(hostPtr);
446+
auto fragment = hostPtrManager->getFragment(hostPtr);
446447
if (fragment && fragment->driverAllocation) {
447448
auto gpuPtr = handleStorage.fragmentStorageData[0].osHandleStorage->gpuPtr;
448449
for (uint32_t i = 1; i < handleStorage.fragmentCount; i++) {

unit_tests/event/event_tests.cpp

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "unit_tests/mocks/mock_event.h"
2424
#include "unit_tests/mocks/mock_kernel.h"
2525
#include "unit_tests/mocks/mock_mdi.h"
26+
#include "unit_tests/mocks/mock_memory_manager.h"
2627
#include "unit_tests/mocks/mock_program.h"
2728
#include "unit_tests/os_interface/mock_performance_counters.h"
2829
#include <memory>
@@ -382,22 +383,41 @@ TEST_F(EventTest, Event_Wait_NonBlocking) {
382383
EXPECT_FALSE(result);
383384
}
384385

385-
TEST_F(EventTest, givenEventContainingCommandQueueWhenItsStatusIsUpdatedToCompletedThenTemporaryAllocationsAreDeleted) {
386+
struct UpdateEventTest : public ::testing::Test {
386387

387-
auto memoryManager = pCmdQ->getDevice().getMemoryManager();
388+
void SetUp() override {
389+
executionEnvironment = new ExecutionEnvironment;
390+
memoryManager = new MockMemoryManager(*executionEnvironment);
391+
hostPtrManager = static_cast<MockHostPtrManager *>(memoryManager->getHostPtrManager());
392+
executionEnvironment->memoryManager.reset(memoryManager);
393+
device.reset(Device::create<Device>(*platformDevices, executionEnvironment, 0u));
394+
context = std::make_unique<MockContext>(device.get());
395+
cl_int retVal = CL_OUT_OF_RESOURCES;
396+
commandQueue.reset(CommandQueue::create(context.get(), device.get(), nullptr, retVal));
397+
EXPECT_EQ(CL_SUCCESS, retVal);
398+
}
399+
400+
ExecutionEnvironment *executionEnvironment;
401+
MockMemoryManager *memoryManager;
402+
MockHostPtrManager *hostPtrManager;
403+
std::unique_ptr<Device> device;
404+
std::unique_ptr<Context> context;
405+
std::unique_ptr<CommandQueue> commandQueue;
406+
};
388407

408+
TEST_F(UpdateEventTest, givenEventContainingCommandQueueWhenItsStatusIsUpdatedToCompletedThenTemporaryAllocationsAreDeleted) {
389409
void *ptr = (void *)0x1000;
390410
size_t size = 4096;
391411
auto temporary = memoryManager->allocateGraphicsMemory(size, ptr);
392412
temporary->taskCount = 3;
393413
memoryManager->storeAllocation(std::unique_ptr<GraphicsAllocation>(temporary), TEMPORARY_ALLOCATION);
394-
Event event(pCmdQ, CL_COMMAND_NDRANGE_KERNEL, 3, 3);
414+
Event event(commandQueue.get(), CL_COMMAND_NDRANGE_KERNEL, 3, 3);
395415

396-
EXPECT_EQ(1u, memoryManager->hostPtrManager.getFragmentCount());
416+
EXPECT_EQ(1u, hostPtrManager->getFragmentCount());
397417

398418
event.updateExecutionStatus();
399419

400-
EXPECT_EQ(0u, memoryManager->hostPtrManager.getFragmentCount());
420+
EXPECT_EQ(0u, hostPtrManager->getFragmentCount());
401421
}
402422

403423
class SurfaceMock : public Surface {

unit_tests/mem_obj/buffer_tests.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,11 +245,12 @@ TEST(Buffer, givenNullptrPassedToBufferCreateWhenAllocationIsNotSystemMemoryPool
245245
cl_int retVal = 0;
246246
cl_mem_flags flags = CL_MEM_READ_WRITE;
247247

248-
auto hostPtrAllocationCountBefore = memoryManager->hostPtrManager.getFragmentCount();
248+
auto hostPtrManager = static_cast<MockHostPtrManager *>(memoryManager->getHostPtrManager());
249+
auto hostPtrAllocationCountBefore = hostPtrManager->getFragmentCount();
249250
std::unique_ptr<Buffer> buffer(Buffer::create(&ctx, flags, MemoryConstants::pageSize, nullptr, retVal));
250251

251252
ASSERT_NE(nullptr, buffer.get());
252-
auto hostPtrAllocationCountAfter = memoryManager->hostPtrManager.getFragmentCount();
253+
auto hostPtrAllocationCountAfter = hostPtrManager->getFragmentCount();
253254

254255
EXPECT_EQ(hostPtrAllocationCountBefore, hostPtrAllocationCountAfter);
255256
}

0 commit comments

Comments
 (0)