Skip to content

Commit 0bc5e15

Browse files
Pass preferred base address to OSMemory::reserveCpuAddressRange()
Related-To: NEO-4525 Change-Id: I6d97ae41af1a0fba31993683bfc669f79aa5b77b Signed-off-by: Igor Venevtsev <igor.venevtsev@intel.com>
1 parent 4e2097e commit 0bc5e15

File tree

7 files changed

+37
-8
lines changed

7 files changed

+37
-8
lines changed

opencl/test/unit_test/os_interface/linux/drm_os_memory_tests.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,28 @@ TEST(OSMemoryLinux, givenOSMemoryLinuxWhenReserveCpuAddressRangeIsCalledThenMinu
5555
mockOSMemoryLinux->releaseCpuAddressRange(reservedCpuRange);
5656
}
5757

58+
TEST(OSMemoryLinux, givenOSMemoryLinuxWhenReserveCpuAddressRangeIsCalledAndBaseAddressIsSpecifiedThenCorrectValueIsPassedToMmapAsAddrParam) {
59+
auto mockOSMemoryLinux = MockOSMemoryLinux::create();
60+
61+
EXPECT_CALL(*mockOSMemoryLinux, mmapWrapper(reinterpret_cast<void *>(0x10000000), _, _, _, -1, _));
62+
63+
auto reservedCpuRange = mockOSMemoryLinux->reserveCpuAddressRange(reinterpret_cast<void *>(0x10000000), MemoryConstants::pageSize, MemoryConstants::pageSize64k);
64+
65+
EXPECT_CALL(*mockOSMemoryLinux, munmapWrapper(reservedCpuRange.originalPtr, reservedCpuRange.actualReservedSize));
66+
67+
mockOSMemoryLinux->releaseCpuAddressRange(reservedCpuRange);
68+
}
69+
70+
TEST(OSMemoryLinux, givenOSMemoryLinuxWhenReserveCpuAddressRangeIsCalledAndBaseAddressIsNotSpecifiedThenoZeroIsPassedToMmapAsAddrParam) {
71+
auto mockOSMemoryLinux = MockOSMemoryLinux::create();
72+
73+
EXPECT_CALL(*mockOSMemoryLinux, mmapWrapper(nullptr, _, _, _, -1, _));
74+
75+
auto reservedCpuRange = mockOSMemoryLinux->reserveCpuAddressRange(MemoryConstants::pageSize, MemoryConstants::pageSize64k);
76+
77+
EXPECT_CALL(*mockOSMemoryLinux, munmapWrapper(reservedCpuRange.originalPtr, reservedCpuRange.actualReservedSize));
78+
79+
mockOSMemoryLinux->releaseCpuAddressRange(reservedCpuRange);
80+
}
81+
5882
}; // namespace NEO

shared/source/os_interface/linux/os_memory_linux.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ std::unique_ptr<OSMemory> OSMemory::create() {
1313
return std::make_unique<OSMemoryLinux>();
1414
}
1515

16-
void *OSMemoryLinux::osReserveCpuAddressRange(size_t sizeToReserve) {
17-
return mmapWrapper(0, sizeToReserve, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0);
16+
void *OSMemoryLinux::osReserveCpuAddressRange(void *baseAddress, size_t sizeToReserve) {
17+
return mmapWrapper(baseAddress, sizeToReserve, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0);
1818
}
1919

2020
void OSMemoryLinux::osReleaseCpuAddressRange(void *reservedCpuAddressRange, size_t reservedSize) {

shared/source/os_interface/linux/os_memory_linux.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class OSMemoryLinux : public OSMemory {
1717
OSMemoryLinux() = default;
1818

1919
protected:
20-
void *osReserveCpuAddressRange(size_t sizeToReserve) override;
20+
void *osReserveCpuAddressRange(void *baseAddress, size_t sizeToReserve) override;
2121
void osReleaseCpuAddressRange(void *reservedCpuAddressRange, size_t reservedSize) override;
2222

2323
MOCKABLE_VIRTUAL void *mmapWrapper(void *, size_t, int, int, int, off_t);

shared/source/os_interface/os_memory.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,17 @@
1212
namespace NEO {
1313

1414
OSMemory::ReservedCpuAddressRange OSMemory::reserveCpuAddressRange(size_t sizeToReserve, size_t alignment) {
15+
return reserveCpuAddressRange(0, sizeToReserve, alignment);
16+
}
17+
18+
OSMemory::ReservedCpuAddressRange OSMemory::reserveCpuAddressRange(void *baseAddress, size_t sizeToReserve, size_t alignment) {
1519
UNRECOVERABLE_IF(0 == alignment);
1620
UNRECOVERABLE_IF(0 != (alignment & (alignment - 1)));
1721

1822
ReservedCpuAddressRange reservedCpuAddressRange;
1923

2024
reservedCpuAddressRange.actualReservedSize = sizeToReserve + alignment;
21-
reservedCpuAddressRange.originalPtr = this->osReserveCpuAddressRange(reservedCpuAddressRange.actualReservedSize);
25+
reservedCpuAddressRange.originalPtr = this->osReserveCpuAddressRange(baseAddress, reservedCpuAddressRange.actualReservedSize);
2226
reservedCpuAddressRange.alignedPtr = alignUp(reservedCpuAddressRange.originalPtr, alignment);
2327

2428
return reservedCpuAddressRange;

shared/source/os_interface/os_memory.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,11 @@ struct OSMemory {
2525
virtual ~OSMemory() = default;
2626

2727
MOCKABLE_VIRTUAL ReservedCpuAddressRange reserveCpuAddressRange(size_t sizeToReserve, size_t alignment);
28+
MOCKABLE_VIRTUAL ReservedCpuAddressRange reserveCpuAddressRange(void *baseAddress, size_t sizeToReserve, size_t alignment);
2829
MOCKABLE_VIRTUAL void releaseCpuAddressRange(const ReservedCpuAddressRange &reservedCpuAddressRange);
2930

3031
protected:
31-
virtual void *osReserveCpuAddressRange(size_t sizeToReserve) = 0;
32+
virtual void *osReserveCpuAddressRange(void *baseAddress, size_t sizeToReserve) = 0;
3233
virtual void osReleaseCpuAddressRange(void *reservedCpuAddressRange, size_t reservedSize) = 0;
3334
};
3435

shared/source/os_interface/windows/os_memory_win.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ std::unique_ptr<OSMemory> OSMemory::create() {
1313
return std::make_unique<OSMemoryWindows>();
1414
}
1515

16-
void *OSMemoryWindows::osReserveCpuAddressRange(size_t sizeToReserve) {
17-
return virtualAllocWrapper(0, sizeToReserve, MEM_RESERVE, PAGE_READWRITE);
16+
void *OSMemoryWindows::osReserveCpuAddressRange(void *baseAddress, size_t sizeToReserve) {
17+
return virtualAllocWrapper(baseAddress, sizeToReserve, MEM_RESERVE, PAGE_READWRITE);
1818
}
1919

2020
void OSMemoryWindows::osReleaseCpuAddressRange(void *reservedCpuAddressRange, size_t /* reservedSize */) {

shared/source/os_interface/windows/os_memory_win.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class OSMemoryWindows : public OSMemory {
1616
OSMemoryWindows() = default;
1717

1818
protected:
19-
void *osReserveCpuAddressRange(size_t sizeToReserve) override;
19+
void *osReserveCpuAddressRange(void *baseAddress, size_t sizeToReserve) override;
2020
void osReleaseCpuAddressRange(void *reservedCpuAddressRange, size_t reservedSize) override;
2121

2222
MOCKABLE_VIRTUAL LPVOID virtualAllocWrapper(LPVOID, SIZE_T, DWORD, DWORD);

0 commit comments

Comments
 (0)