fix: report ZE_MEMORY_ACCESS_CAP_FLAG_CONCURRENT correctly

At the moment the capability is returned only based on the value
returned by the `productHelper`, which is too liberal. The capability
must also consider the support reported by `memoryManager`. Only then
the support reported is aligned with actual logic of handling
USM-allocations.

Related-To: NEO-10040
Signed-off-by: Maciej Bielski <maciej.bielski@intel.com>
This commit is contained in:
Maciej Bielski
2025-01-24 16:39:50 +00:00
committed by Compute-Runtime-Automation
parent 1abb48c3e0
commit a8779c2387
16 changed files with 112 additions and 39 deletions

View File

@@ -768,21 +768,23 @@ ze_result_t DeviceImp::getMemoryProperties(uint32_t *pCount, ze_device_memory_pr
ze_result_t DeviceImp::getMemoryAccessProperties(ze_device_memory_access_properties_t *pMemAccessProperties) {
auto &hwInfo = this->getHwInfo();
auto &productHelper = this->getProductHelper();
pMemAccessProperties->hostAllocCapabilities =
static_cast<ze_memory_access_cap_flags_t>(productHelper.getHostMemCapabilities(&hwInfo));
pMemAccessProperties->deviceAllocCapabilities =
static_cast<ze_memory_access_cap_flags_t>(productHelper.getDeviceMemCapabilities());
auto memoryManager{this->getDriverHandle()->getMemoryManager()};
const bool isKmdMigrationAvailable{memoryManager->isKmdMigrationAvailable(this->getRootDeviceIndex())};
pMemAccessProperties->sharedSingleDeviceAllocCapabilities =
static_cast<ze_memory_access_cap_flags_t>(productHelper.getSingleDeviceSharedMemCapabilities());
static_cast<ze_memory_access_cap_flags_t>(productHelper.getSingleDeviceSharedMemCapabilities(isKmdMigrationAvailable));
pMemAccessProperties->sharedCrossDeviceAllocCapabilities = {};
if (this->getNEODevice()->getHardwareInfo().capabilityTable.p2pAccessSupported) {
pMemAccessProperties->sharedCrossDeviceAllocCapabilities = ZE_MEMORY_ACCESS_CAP_FLAG_RW;
auto memoryManager = this->getDriverHandle()->getMemoryManager();
if (memoryManager->isKmdMigrationAvailable(this->getRootDeviceIndex()) &&
if (isKmdMigrationAvailable &&
memoryManager->hasPageFaultsEnabled(*this->getNEODevice()) &&
NEO::debugManager.flags.EnableConcurrentSharedCrossP2PDeviceAccess.get() == 1) {
pMemAccessProperties->sharedCrossDeviceAllocCapabilities |= ZE_MEMORY_ACCESS_CAP_FLAG_CONCURRENT;

View File

@@ -1,5 +1,5 @@
#
# Copyright (C) 2021-2024 Intel Corporation
# Copyright (C) 2021-2025 Intel Corporation
#
# SPDX-License-Identifier: MIT
#
@@ -10,5 +10,6 @@ if(UNIX)
${CMAKE_CURRENT_SOURCE_DIR}/test_device_uuid.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_device_pci_bus_info_linux.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_device_pci_speed_info_linux.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_l0_drm_device.cpp
)
endif()

View File

@@ -0,0 +1,52 @@
/*
* Copyright (C) 2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/test/common/libult/linux/drm_mock.h"
#include "shared/test/common/mocks/linux/mock_drm_memory_manager.h"
#include "shared/test/common/test_macros/test.h"
#include "level_zero/core/test/unit_tests/fixtures/device_fixture.h"
#include "gtest/gtest.h"
namespace L0 {
namespace ult {
using DrmDeviceTests = Test<DeviceFixture>;
TEST_F(DrmDeviceTests, whenMemoryAccessPropertiesQueriedThenConcurrentDeviceSharedMemSupportDependsOnMemoryManagerHelper) {
constexpr auto rootDeviceIndex{0U};
execEnv->rootDeviceEnvironments[rootDeviceIndex]->osInterface.reset(new NEO::OSInterface);
auto drm{new DrmMock{*execEnv->rootDeviceEnvironments[rootDeviceIndex]}};
execEnv->rootDeviceEnvironments[rootDeviceIndex]->osInterface->setDriverModel(std::unique_ptr<DriverModel>{drm});
auto *origMemoryManager{device->getDriverHandle()->getMemoryManager()};
auto *proxyMemoryManager{new TestedDrmMemoryManager{*execEnv}};
device->getDriverHandle()->setMemoryManager(proxyMemoryManager);
auto &productHelper = device->getProductHelper();
ze_device_memory_access_properties_t properties;
for (auto pfSupported : std::array{false, true}) {
drm->pageFaultSupported = pfSupported;
bool isKmdMigrationAvailable{proxyMemoryManager->isKmdMigrationAvailable(rootDeviceIndex)};
proxyMemoryManager->isKmdMigrationAvailableCalled = 0U;
auto result = device->getMemoryAccessProperties(&properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_EQ(proxyMemoryManager->isKmdMigrationAvailableCalled, 1U);
auto expectedSharedSingleDeviceAllocCapabilities = static_cast<ze_memory_access_cap_flags_t>(productHelper.getSingleDeviceSharedMemCapabilities(isKmdMigrationAvailable));
EXPECT_EQ(expectedSharedSingleDeviceAllocCapabilities, properties.sharedSingleDeviceAllocCapabilities);
}
device->getDriverHandle()->setMemoryManager(origMemoryManager);
delete proxyMemoryManager;
}
} // namespace ult
} // namespace L0

View File

@@ -2801,7 +2801,8 @@ TEST_F(DeviceTests, WhenGettingMemoryAccessPropertiesThenSuccessIsReturned) {
auto expectedDeviceAllocCapabilities = static_cast<ze_memory_access_cap_flags_t>(productHelper.getDeviceMemCapabilities());
EXPECT_EQ(expectedDeviceAllocCapabilities, properties.deviceAllocCapabilities);
auto expectedSharedSingleDeviceAllocCapabilities = static_cast<ze_memory_access_cap_flags_t>(productHelper.getSingleDeviceSharedMemCapabilities());
bool isKmdMigrationSupported{false};
auto expectedSharedSingleDeviceAllocCapabilities = static_cast<ze_memory_access_cap_flags_t>(productHelper.getSingleDeviceSharedMemCapabilities(isKmdMigrationSupported));
EXPECT_EQ(expectedSharedSingleDeviceAllocCapabilities, properties.sharedSingleDeviceAllocCapabilities);
auto expectedSharedSystemAllocCapabilities = static_cast<ze_memory_access_cap_flags_t>(productHelper.getSharedSystemMemCapabilities(&hwInfo));

View File

@@ -1105,7 +1105,7 @@ TEST_F(MemoryTest, whenCallingSetAtomicAccessAttributeWithInsufficientCapability
uint64_t getHostMemCapabilities(const HardwareInfo *hwInfo) const override {
return 0;
}
uint64_t getSingleDeviceSharedMemCapabilities() const override {
uint64_t getSingleDeviceSharedMemCapabilities(bool) const override {
return 0;
}
};
@@ -1218,7 +1218,7 @@ TEST_F(MemoryTest, whenCallingSetAtomicAccessAttributeForSystemAccessSharedSingl
struct MockProductHelperAtomic : NEO::ProductHelperHw<IGFX_UNKNOWN> {
MockProductHelperAtomic() = default;
uint64_t getSingleDeviceSharedMemCapabilities() const override {
uint64_t getSingleDeviceSharedMemCapabilities(bool) const override {
return 15;
}
};