mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-09 22:43:00 +08:00
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:
committed by
Compute-Runtime-Automation
parent
1abb48c3e0
commit
a8779c2387
@@ -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;
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user