diff --git a/opencl/test/unit_test/mocks/linux/mock_drm_memory_manager.cpp b/opencl/test/unit_test/mocks/linux/mock_drm_memory_manager.cpp index 343504f429..30ca8bc583 100644 --- a/opencl/test/unit_test/mocks/linux/mock_drm_memory_manager.cpp +++ b/opencl/test/unit_test/mocks/linux/mock_drm_memory_manager.cpp @@ -46,10 +46,10 @@ TestedDrmMemoryManager::TestedDrmMemoryManager(bool enableLocalMemory, } void TestedDrmMemoryManager::injectPinBB(BufferObject *newPinBB) { - BufferObject *currentPinBB = pinBBs[newPinBB->peekRootDeviceIndex()]; - pinBBs[newPinBB->peekRootDeviceIndex()] = nullptr; + BufferObject *currentPinBB = pinBBs[0u]; + pinBBs[0u] = nullptr; DrmMemoryManager::unreference(currentPinBB, true); - pinBBs[newPinBB->peekRootDeviceIndex()] = newPinBB; + pinBBs[0u] = newPinBB; } DrmGemCloseWorker *TestedDrmMemoryManager::getgemCloseWorker() { return this->gemCloseWorker.get(); } diff --git a/opencl/test/unit_test/mocks/linux/mock_drm_memory_manager.h b/opencl/test/unit_test/mocks/linux/mock_drm_memory_manager.h index 0f3251fe7f..0fa1b440d1 100644 --- a/opencl/test/unit_test/mocks/linux/mock_drm_memory_manager.h +++ b/opencl/test/unit_test/mocks/linux/mock_drm_memory_manager.h @@ -45,6 +45,7 @@ class TestedDrmMemoryManager : public MemoryManagerCreate { using DrmMemoryManager::eraseSharedBufferObject; using DrmMemoryManager::getDefaultDrmContextId; using DrmMemoryManager::getDrm; + using DrmMemoryManager::getRootDeviceIndex; using DrmMemoryManager::gfxPartitions; using DrmMemoryManager::lockResourceInLocalMemoryImpl; using DrmMemoryManager::pinBBs; diff --git a/opencl/test/unit_test/os_interface/linux/drm_buffer_object_tests.cpp b/opencl/test/unit_test/os_interface/linux/drm_buffer_object_tests.cpp index b99fcc939d..3cab5bef26 100644 --- a/opencl/test/unit_test/os_interface/linux/drm_buffer_object_tests.cpp +++ b/opencl/test/unit_test/os_interface/linux/drm_buffer_object_tests.cpp @@ -159,7 +159,7 @@ TEST(DrmBufferObjectSimpleTest, givenInvalidBoWhenPinIsCalledThenErrorIsReturned TEST(DrmBufferObjectSimpleTest, givenBufferObjectWhenConstructedWithASizeThenTheSizeIsInitialized) { std::unique_ptr drmMock(new DrmMockCustom); - std::unique_ptr bo(new BufferObject(drmMock.get(), 1, 0x1000, 0)); + std::unique_ptr bo(new BufferObject(drmMock.get(), 1, 0x1000)); EXPECT_EQ(0x1000u, bo->peekSize()); } diff --git a/opencl/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp b/opencl/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp index 8fc2b78ab0..90c843c013 100644 --- a/opencl/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp +++ b/opencl/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp @@ -3437,6 +3437,8 @@ TEST(DrmMemoryMangerTest, givenMultipleRootDeviceWhenMemoryManagerGetsDrmThenDrm for (auto i = 0u; i < platform()->peekExecutionEnvironment()->rootDeviceEnvironments.size(); i++) { auto drmFromRootDevice = platform()->peekExecutionEnvironment()->rootDeviceEnvironments[i]->osInterface->get()->getDrm(); EXPECT_EQ(drmFromRootDevice, &drmMemoryManager.getDrm(i)); + EXPECT_EQ(i, drmMemoryManager.getRootDeviceIndex(drmFromRootDevice)); } + EXPECT_EQ(invalidRootDeviceIndex, drmMemoryManager.getRootDeviceIndex(nullptr)); } } // namespace NEO diff --git a/shared/source/os_interface/linux/drm_buffer_object.cpp b/shared/source/os_interface/linux/drm_buffer_object.cpp index 80b177f666..6fa3e52c71 100644 --- a/shared/source/os_interface/linux/drm_buffer_object.cpp +++ b/shared/source/os_interface/linux/drm_buffer_object.cpp @@ -29,13 +29,11 @@ namespace NEO { -BufferObject::BufferObject(Drm *drm, int handle, size_t size, uint32_t rootDeviceIndex) : drm(drm), refCount(1), handle(handle), size(size), rootDeviceIndex(rootDeviceIndex), isReused(false) { +BufferObject::BufferObject(Drm *drm, int handle, size_t size) : drm(drm), refCount(1), handle(handle), size(size), isReused(false) { this->tiling_mode = I915_TILING_NONE; this->lockedAddress = nullptr; } -BufferObject::BufferObject(Drm *drm, int handle, uint32_t rootDeviceIndex) : BufferObject(drm, handle, 0, rootDeviceIndex) {} - uint32_t BufferObject::getRefCount() const { return this->refCount.load(); } diff --git a/shared/source/os_interface/linux/drm_buffer_object.h b/shared/source/os_interface/linux/drm_buffer_object.h index 4ac8adbe6d..2e7ca9e83b 100644 --- a/shared/source/os_interface/linux/drm_buffer_object.h +++ b/shared/source/os_interface/linux/drm_buffer_object.h @@ -22,8 +22,8 @@ class BufferObject { friend DrmMemoryManager; public: - BufferObject(Drm *drm, int handle, uint32_t rootDeviceIndex); - BufferObject(Drm *drm, int handle, size_t size, uint32_t rootDeviceIndex); + BufferObject(Drm *drm, int handle); + BufferObject(Drm *drm, int handle, size_t size); MOCKABLE_VIRTUAL ~BufferObject(){}; bool setTiling(uint32_t mode, uint32_t stride); @@ -49,7 +49,6 @@ class BufferObject { void setUnmapSize(uint64_t unmapSize) { this->unmapSize = unmapSize; } uint64_t peekUnmapSize() const { return unmapSize; } bool peekIsReusableAllocation() const { return this->isReused; } - uint32_t peekRootDeviceIndex() { return rootDeviceIndex; } protected: Drm *drm = nullptr; @@ -58,7 +57,6 @@ class BufferObject { int handle; // i915 gem object handle uint64_t size; - uint32_t rootDeviceIndex = 0; bool isReused; //Tiling diff --git a/shared/source/os_interface/linux/drm_memory_manager.cpp b/shared/source/os_interface/linux/drm_memory_manager.cpp index 355195d2e3..17d7b35179 100644 --- a/shared/source/os_interface/linux/drm_memory_manager.cpp +++ b/shared/source/os_interface/linux/drm_memory_manager.cpp @@ -84,7 +84,7 @@ void DrmMemoryManager::commonCleanup() { void DrmMemoryManager::eraseSharedBufferObject(NEO::BufferObject *bo) { auto it = std::find(sharingBufferObjects.begin(), sharingBufferObjects.end(), bo); DEBUG_BREAK_IF(it == sharingBufferObjects.end()); - releaseGpuRange(reinterpret_cast((*it)->gpuAddress), (*it)->peekUnmapSize(), (*it)->peekRootDeviceIndex()); + releaseGpuRange(reinterpret_cast((*it)->gpuAddress), (*it)->peekUnmapSize(), this->getRootDeviceIndex(bo->drm)); sharingBufferObjects.erase(it); } @@ -736,4 +736,15 @@ Drm &DrmMemoryManager::getDrm(uint32_t rootDeviceIndex) const { return *this->executionEnvironment.rootDeviceEnvironments[rootDeviceIndex]->osInterface->get()->getDrm(); } +uint32_t DrmMemoryManager::getRootDeviceIndex(const Drm *drm) { + auto rootDeviceCount = this->executionEnvironment.rootDeviceEnvironments.size(); + + for (auto rootDeviceIndex = 0u; rootDeviceIndex < rootDeviceCount; rootDeviceIndex++) { + if (&getDrm(rootDeviceIndex) == drm) { + return rootDeviceIndex; + } + } + return std::numeric_limits::max(); +} + } // namespace NEO diff --git a/shared/source/os_interface/linux/drm_memory_manager.h b/shared/source/os_interface/linux/drm_memory_manager.h index c7552af301..52e3ce52b5 100644 --- a/shared/source/os_interface/linux/drm_memory_manager.h +++ b/shared/source/os_interface/linux/drm_memory_manager.h @@ -13,12 +13,14 @@ #include "drm_gem_close_worker.h" +#include #include #include namespace NEO { class BufferObject; class Drm; +constexpr uint32_t invalidRootDeviceIndex = std::numeric_limits::max(); class DrmMemoryManager : public MemoryManager { public: @@ -84,6 +86,7 @@ class DrmMemoryManager : public MemoryManager { GraphicsAllocation *allocateGraphicsMemoryInDevicePool(const AllocationData &allocationData, AllocationStatus &status) override; Drm &getDrm(uint32_t rootDeviceIndex) const; + uint32_t getRootDeviceIndex(const Drm *drm); std::vector pinBBs; std::vector memoryForPinBBs;