diff --git a/shared/source/os_interface/linux/os_interface_linux.cpp b/shared/source/os_interface/linux/os_interface_linux.cpp index 124e057a39..a64d8c8266 100644 --- a/shared/source/os_interface/linux/os_interface_linux.cpp +++ b/shared/source/os_interface/linux/os_interface_linux.cpp @@ -7,6 +7,7 @@ #include "shared/source/debug_settings/debug_settings_manager.h" #include "shared/source/execution_environment/root_device_environment.h" +#include "shared/source/helpers/aligned_memory.h" #include "shared/source/os_interface/linux/drm_memory_operations_handler.h" #include "shared/source/os_interface/linux/drm_neo.h" #include "shared/source/os_interface/linux/hw_device_id.h" @@ -58,8 +59,11 @@ bool initDrmOsInterface(std::unique_ptr &&hwDeviceId, uint32_t rootD return true; } -bool OSInterface::isSizeWithinThresholdForStaging(size_t size) const { - return size < 64 * MemoryConstants::megaByte; +bool OSInterface::isSizeWithinThresholdForStaging(const void *ptr, size_t size) const { + if (isAligned(ptr)) { + return size < 64 * MemoryConstants::megaByte; + } + return size < 512 * MemoryConstants::megaByte; } uint32_t OSInterface::getAggregatedProcessCount() const { diff --git a/shared/source/os_interface/os_interface.h b/shared/source/os_interface/os_interface.h index 904f90e26a..1da07eac90 100644 --- a/shared/source/os_interface/os_interface.h +++ b/shared/source/os_interface/os_interface.h @@ -117,7 +117,7 @@ class OSInterface : public NonCopyableClass { MOCKABLE_VIRTUAL bool isDebugAttachAvailable() const; MOCKABLE_VIRTUAL bool isLockablePointer(bool isLockable) const; - MOCKABLE_VIRTUAL bool isSizeWithinThresholdForStaging(size_t size) const; + MOCKABLE_VIRTUAL bool isSizeWithinThresholdForStaging(const void *ptr, size_t size) const; MOCKABLE_VIRTUAL uint32_t getAggregatedProcessCount() const; static bool osEnabled64kbPages; diff --git a/shared/source/os_interface/windows/os_interface_win.cpp b/shared/source/os_interface/windows/os_interface_win.cpp index 950019160b..7d2a31e903 100644 --- a/shared/source/os_interface/windows/os_interface_win.cpp +++ b/shared/source/os_interface/windows/os_interface_win.cpp @@ -26,7 +26,7 @@ bool OSInterface::isLockablePointer(bool isLockable) const { return isLockable; } -bool OSInterface::isSizeWithinThresholdForStaging(size_t size) const { +bool OSInterface::isSizeWithinThresholdForStaging(const void *ptr, size_t size) const { return true; } diff --git a/shared/source/utilities/staging_buffer_manager.cpp b/shared/source/utilities/staging_buffer_manager.cpp index 8d45e2c313..8d17df6fed 100644 --- a/shared/source/utilities/staging_buffer_manager.cpp +++ b/shared/source/utilities/staging_buffer_manager.cpp @@ -408,7 +408,7 @@ bool StagingBufferManager::isValidForStaging(const Device &device, const void *p stagingCopyEnabled = debugManager.flags.EnableCopyWithStagingBuffers.get(); } auto osInterface = device.getRootDeviceEnvironment().osInterface.get(); - bool sizeWithinThreshold = osInterface ? osInterface->isSizeWithinThresholdForStaging(size) : true; + bool sizeWithinThreshold = osInterface ? osInterface->isSizeWithinThresholdForStaging(ptr, size) : true; return stagingCopyEnabled && !hasDependencies && sizeWithinThreshold && !this->registerHostPtr(ptr); } diff --git a/shared/test/unit_test/os_interface/linux/os_interface_linux_tests.cpp b/shared/test/unit_test/os_interface/linux/os_interface_linux_tests.cpp index c326b50aea..db98572e1d 100644 --- a/shared/test/unit_test/os_interface/linux/os_interface_linux_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/os_interface_linux_tests.cpp @@ -101,8 +101,13 @@ TEST(OsInterfaceTest, GivenLinuxOsInterfaceWhenGetThresholdForStagingCalledThenR DrmMock *drm = new DrmMock(*executionEnvironment->rootDeviceEnvironments[0]); osInterface.setDriverModel(std::unique_ptr(drm)); - EXPECT_TRUE(osInterface.isSizeWithinThresholdForStaging(16 * MemoryConstants::megaByte)); - EXPECT_FALSE(osInterface.isSizeWithinThresholdForStaging(64 * MemoryConstants::megaByte)); + auto alignedPtr = reinterpret_cast(2 * MemoryConstants::megaByte); + EXPECT_TRUE(osInterface.isSizeWithinThresholdForStaging(alignedPtr, 16 * MemoryConstants::megaByte)); + EXPECT_FALSE(osInterface.isSizeWithinThresholdForStaging(alignedPtr, 64 * MemoryConstants::megaByte)); + + auto misalignedPtr = reinterpret_cast(3 * MemoryConstants::megaByte); + EXPECT_TRUE(osInterface.isSizeWithinThresholdForStaging(misalignedPtr, 64 * MemoryConstants::megaByte)); + EXPECT_FALSE(osInterface.isSizeWithinThresholdForStaging(misalignedPtr, 512 * MemoryConstants::megaByte)); } } // namespace NEO diff --git a/shared/test/unit_test/os_interface/windows/os_interface_win_tests.cpp b/shared/test/unit_test/os_interface/windows/os_interface_win_tests.cpp index 9578ec8a4b..9b891834b4 100644 --- a/shared/test/unit_test/os_interface/windows/os_interface_win_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/os_interface_win_tests.cpp @@ -157,5 +157,6 @@ TEST_F(OsInterfaceTest, whenGetThresholdForStagingCalledThenReturnNoThreshold) { EXPECT_EQ(nullptr, rootDeviceEnvironment.osInterface.get()); wddm->init(); EXPECT_NE(nullptr, rootDeviceEnvironment.osInterface.get()); - EXPECT_TRUE(rootDeviceEnvironment.osInterface->isSizeWithinThresholdForStaging(MemoryConstants::gigaByte)); + auto alignedPtr = reinterpret_cast(2 * MemoryConstants::megaByte); + EXPECT_TRUE(rootDeviceEnvironment.osInterface->isSizeWithinThresholdForStaging(alignedPtr, MemoryConstants::gigaByte)); } \ No newline at end of file diff --git a/shared/test/unit_test/utilities/staging_buffer_manager_tests.cpp b/shared/test/unit_test/utilities/staging_buffer_manager_tests.cpp index 218e4ffa1f..fcd41dc607 100644 --- a/shared/test/unit_test/utilities/staging_buffer_manager_tests.cpp +++ b/shared/test/unit_test/utilities/staging_buffer_manager_tests.cpp @@ -21,7 +21,7 @@ using namespace NEO; struct MockOSIface : OSInterface { - bool isSizeWithinThresholdForStaging(size_t size) const override { + bool isSizeWithinThresholdForStaging(const void *ptr, size_t size) const override { return isSizeWithinThresholdValue; } bool isSizeWithinThresholdValue = true;