From 0bc5e158e59d1c937ad304def03108e947a4e8f3 Mon Sep 17 00:00:00 2001 From: Igor Venevtsev Date: Tue, 26 May 2020 16:42:35 +0200 Subject: [PATCH] Pass preferred base address to OSMemory::reserveCpuAddressRange() Related-To: NEO-4525 Change-Id: I6d97ae41af1a0fba31993683bfc669f79aa5b77b Signed-off-by: Igor Venevtsev --- .../linux/drm_os_memory_tests.cpp | 24 +++++++++++++++++++ .../os_interface/linux/os_memory_linux.cpp | 4 ++-- .../os_interface/linux/os_memory_linux.h | 2 +- shared/source/os_interface/os_memory.cpp | 6 ++++- shared/source/os_interface/os_memory.h | 3 ++- .../os_interface/windows/os_memory_win.cpp | 4 ++-- .../os_interface/windows/os_memory_win.h | 2 +- 7 files changed, 37 insertions(+), 8 deletions(-) diff --git a/opencl/test/unit_test/os_interface/linux/drm_os_memory_tests.cpp b/opencl/test/unit_test/os_interface/linux/drm_os_memory_tests.cpp index 9791e8662d..905c8f4499 100644 --- a/opencl/test/unit_test/os_interface/linux/drm_os_memory_tests.cpp +++ b/opencl/test/unit_test/os_interface/linux/drm_os_memory_tests.cpp @@ -55,4 +55,28 @@ TEST(OSMemoryLinux, givenOSMemoryLinuxWhenReserveCpuAddressRangeIsCalledThenMinu mockOSMemoryLinux->releaseCpuAddressRange(reservedCpuRange); } +TEST(OSMemoryLinux, givenOSMemoryLinuxWhenReserveCpuAddressRangeIsCalledAndBaseAddressIsSpecifiedThenCorrectValueIsPassedToMmapAsAddrParam) { + auto mockOSMemoryLinux = MockOSMemoryLinux::create(); + + EXPECT_CALL(*mockOSMemoryLinux, mmapWrapper(reinterpret_cast(0x10000000), _, _, _, -1, _)); + + auto reservedCpuRange = mockOSMemoryLinux->reserveCpuAddressRange(reinterpret_cast(0x10000000), MemoryConstants::pageSize, MemoryConstants::pageSize64k); + + EXPECT_CALL(*mockOSMemoryLinux, munmapWrapper(reservedCpuRange.originalPtr, reservedCpuRange.actualReservedSize)); + + mockOSMemoryLinux->releaseCpuAddressRange(reservedCpuRange); +} + +TEST(OSMemoryLinux, givenOSMemoryLinuxWhenReserveCpuAddressRangeIsCalledAndBaseAddressIsNotSpecifiedThenoZeroIsPassedToMmapAsAddrParam) { + auto mockOSMemoryLinux = MockOSMemoryLinux::create(); + + EXPECT_CALL(*mockOSMemoryLinux, mmapWrapper(nullptr, _, _, _, -1, _)); + + auto reservedCpuRange = mockOSMemoryLinux->reserveCpuAddressRange(MemoryConstants::pageSize, MemoryConstants::pageSize64k); + + EXPECT_CALL(*mockOSMemoryLinux, munmapWrapper(reservedCpuRange.originalPtr, reservedCpuRange.actualReservedSize)); + + mockOSMemoryLinux->releaseCpuAddressRange(reservedCpuRange); +} + }; // namespace NEO diff --git a/shared/source/os_interface/linux/os_memory_linux.cpp b/shared/source/os_interface/linux/os_memory_linux.cpp index 1c8f5957cd..906c6d0de2 100644 --- a/shared/source/os_interface/linux/os_memory_linux.cpp +++ b/shared/source/os_interface/linux/os_memory_linux.cpp @@ -13,8 +13,8 @@ std::unique_ptr OSMemory::create() { return std::make_unique(); } -void *OSMemoryLinux::osReserveCpuAddressRange(size_t sizeToReserve) { - return mmapWrapper(0, sizeToReserve, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); +void *OSMemoryLinux::osReserveCpuAddressRange(void *baseAddress, size_t sizeToReserve) { + return mmapWrapper(baseAddress, sizeToReserve, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); } void OSMemoryLinux::osReleaseCpuAddressRange(void *reservedCpuAddressRange, size_t reservedSize) { diff --git a/shared/source/os_interface/linux/os_memory_linux.h b/shared/source/os_interface/linux/os_memory_linux.h index a8abcdc334..0c1bb44086 100644 --- a/shared/source/os_interface/linux/os_memory_linux.h +++ b/shared/source/os_interface/linux/os_memory_linux.h @@ -17,7 +17,7 @@ class OSMemoryLinux : public OSMemory { OSMemoryLinux() = default; protected: - void *osReserveCpuAddressRange(size_t sizeToReserve) override; + void *osReserveCpuAddressRange(void *baseAddress, size_t sizeToReserve) override; void osReleaseCpuAddressRange(void *reservedCpuAddressRange, size_t reservedSize) override; MOCKABLE_VIRTUAL void *mmapWrapper(void *, size_t, int, int, int, off_t); diff --git a/shared/source/os_interface/os_memory.cpp b/shared/source/os_interface/os_memory.cpp index 35cec82050..1f6764a9f2 100644 --- a/shared/source/os_interface/os_memory.cpp +++ b/shared/source/os_interface/os_memory.cpp @@ -12,13 +12,17 @@ namespace NEO { OSMemory::ReservedCpuAddressRange OSMemory::reserveCpuAddressRange(size_t sizeToReserve, size_t alignment) { + return reserveCpuAddressRange(0, sizeToReserve, alignment); +} + +OSMemory::ReservedCpuAddressRange OSMemory::reserveCpuAddressRange(void *baseAddress, size_t sizeToReserve, size_t alignment) { UNRECOVERABLE_IF(0 == alignment); UNRECOVERABLE_IF(0 != (alignment & (alignment - 1))); ReservedCpuAddressRange reservedCpuAddressRange; reservedCpuAddressRange.actualReservedSize = sizeToReserve + alignment; - reservedCpuAddressRange.originalPtr = this->osReserveCpuAddressRange(reservedCpuAddressRange.actualReservedSize); + reservedCpuAddressRange.originalPtr = this->osReserveCpuAddressRange(baseAddress, reservedCpuAddressRange.actualReservedSize); reservedCpuAddressRange.alignedPtr = alignUp(reservedCpuAddressRange.originalPtr, alignment); return reservedCpuAddressRange; diff --git a/shared/source/os_interface/os_memory.h b/shared/source/os_interface/os_memory.h index b7b1a5e59d..914ce3e3d1 100644 --- a/shared/source/os_interface/os_memory.h +++ b/shared/source/os_interface/os_memory.h @@ -25,10 +25,11 @@ struct OSMemory { virtual ~OSMemory() = default; MOCKABLE_VIRTUAL ReservedCpuAddressRange reserveCpuAddressRange(size_t sizeToReserve, size_t alignment); + MOCKABLE_VIRTUAL ReservedCpuAddressRange reserveCpuAddressRange(void *baseAddress, size_t sizeToReserve, size_t alignment); MOCKABLE_VIRTUAL void releaseCpuAddressRange(const ReservedCpuAddressRange &reservedCpuAddressRange); protected: - virtual void *osReserveCpuAddressRange(size_t sizeToReserve) = 0; + virtual void *osReserveCpuAddressRange(void *baseAddress, size_t sizeToReserve) = 0; virtual void osReleaseCpuAddressRange(void *reservedCpuAddressRange, size_t reservedSize) = 0; }; diff --git a/shared/source/os_interface/windows/os_memory_win.cpp b/shared/source/os_interface/windows/os_memory_win.cpp index 405c4b0bc0..7b38d38ca7 100644 --- a/shared/source/os_interface/windows/os_memory_win.cpp +++ b/shared/source/os_interface/windows/os_memory_win.cpp @@ -13,8 +13,8 @@ std::unique_ptr OSMemory::create() { return std::make_unique(); } -void *OSMemoryWindows::osReserveCpuAddressRange(size_t sizeToReserve) { - return virtualAllocWrapper(0, sizeToReserve, MEM_RESERVE, PAGE_READWRITE); +void *OSMemoryWindows::osReserveCpuAddressRange(void *baseAddress, size_t sizeToReserve) { + return virtualAllocWrapper(baseAddress, sizeToReserve, MEM_RESERVE, PAGE_READWRITE); } void OSMemoryWindows::osReleaseCpuAddressRange(void *reservedCpuAddressRange, size_t /* reservedSize */) { diff --git a/shared/source/os_interface/windows/os_memory_win.h b/shared/source/os_interface/windows/os_memory_win.h index 8f688e8a20..f62e5ef423 100644 --- a/shared/source/os_interface/windows/os_memory_win.h +++ b/shared/source/os_interface/windows/os_memory_win.h @@ -16,7 +16,7 @@ class OSMemoryWindows : public OSMemory { OSMemoryWindows() = default; protected: - void *osReserveCpuAddressRange(size_t sizeToReserve) override; + void *osReserveCpuAddressRange(void *baseAddress, size_t sizeToReserve) override; void osReleaseCpuAddressRange(void *reservedCpuAddressRange, size_t reservedSize) override; MOCKABLE_VIRTUAL LPVOID virtualAllocWrapper(LPVOID, SIZE_T, DWORD, DWORD);