Fix pagefault Cpu transfers in TBX mode

Related-To: NEO-5286

Signed-off-by: Mateusz Hoppe <mateusz.hoppe@intel.com>
This commit is contained in:
Mateusz Hoppe
2021-03-08 11:39:07 +00:00
committed by Compute-Runtime-Automation
parent 07eb59d400
commit c994bf6f00
6 changed files with 146 additions and 12 deletions

View File

@@ -8,6 +8,7 @@
#include "shared/source/memory_manager/graphics_allocation.h"
#include "shared/source/memory_manager/unified_memory_manager.h"
#include "shared/source/unified_memory/unified_memory.h"
#include "shared/test/common/helpers/debug_manager_state_restore.h"
#include "shared/test/common/mocks/mock_graphics_allocation.h"
#include "shared/test/common/test_macros/test_checks_shared.h"
#include "shared/test/unit_test/page_fault_manager/cpu_page_fault_manager_tests_fixture.h"
@@ -271,6 +272,54 @@ TEST_F(PageFaultManagerTest, givenInitialPlacementGpuWhenVerifyingPagefaultThenF
EXPECT_TRUE(pageFaultManager->isAubWritable);
}
TEST_F(PageFaultManagerTest, givenTbxWhenVerifyingPagefaultThenVerifyPagefaultUnprotectsAndTransfersMemory) {
void *alloc = reinterpret_cast<void *>(0x1);
pageFaultManager->gpuDomainHandler = &MockPageFaultManager::handleGpuDomainTransferForTbx;
MemoryProperties memoryProperties{};
memoryProperties.allocFlags.usmInitialPlacementGpu = 1;
pageFaultManager->insertAllocation(alloc, 10, reinterpret_cast<SVMAllocsManager *>(unifiedMemoryManager), nullptr, memoryProperties);
pageFaultManager->moveAllocationToGpuDomain(alloc);
EXPECT_EQ(pageFaultManager->protectMemoryCalled, 1);
EXPECT_EQ(pageFaultManager->transferToGpuCalled, 0);
EXPECT_EQ(pageFaultManager->protectedMemoryAccessAddress, alloc);
EXPECT_EQ(pageFaultManager->protectedSize, 10u);
pageFaultManager->verifyPageFault(alloc);
EXPECT_EQ(pageFaultManager->allowMemoryAccessCalled, 1);
EXPECT_EQ(pageFaultManager->transferToCpuCalled, 1);
EXPECT_EQ(pageFaultManager->allowedMemoryAccessAddress, alloc);
EXPECT_EQ(pageFaultManager->accessAllowedSize, 10u);
EXPECT_TRUE(pageFaultManager->isAubWritable);
}
TEST_F(PageFaultManagerTest, givenTbxAndInitialPlacementGpuWhenVerifyingPagefaultThenMemoryIsUnprotectedOnly) {
void *alloc = reinterpret_cast<void *>(0x1);
pageFaultManager->gpuDomainHandler = &MockPageFaultManager::handleGpuDomainTransferForTbx;
MemoryProperties memoryProperties{};
memoryProperties.allocFlags.usmInitialPlacementGpu = 1;
pageFaultManager->insertAllocation(alloc, 10, reinterpret_cast<SVMAllocsManager *>(unifiedMemoryManager), nullptr, memoryProperties);
EXPECT_EQ(pageFaultManager->protectMemoryCalled, 1);
EXPECT_EQ(pageFaultManager->transferToGpuCalled, 0);
EXPECT_EQ(pageFaultManager->protectedMemoryAccessAddress, alloc);
EXPECT_EQ(pageFaultManager->protectedSize, 10u);
pageFaultManager->verifyPageFault(alloc);
EXPECT_EQ(pageFaultManager->allowMemoryAccessCalled, 1);
EXPECT_EQ(pageFaultManager->transferToCpuCalled, 0);
EXPECT_EQ(pageFaultManager->allowedMemoryAccessAddress, alloc);
EXPECT_EQ(pageFaultManager->accessAllowedSize, 10u);
EXPECT_TRUE(pageFaultManager->isAubWritable);
}
TEST_F(PageFaultManagerTest, givenInitialPlacementCpuWhenMovingToGpuDomainThenFirstAccessInvokesTransfer) {
void *cmdQ = reinterpret_cast<void *>(0xFFFF);
@@ -369,3 +418,42 @@ TEST_F(PageFaultManagerTest, givenUnifiedMemoryAllocWhenSetAubWritableIsCalledTh
unifiedMemoryManager->freeSVMAlloc(alloc1);
}
TEST(PageFaultManager, givenTbxCsrWhenSelectingHandlerThenTbxGpuDomainHandlerIsSet) {
DebugManagerStateRestore restorer;
auto pageFaultManager = std::make_unique<MockPageFaultManager>();
DebugManager.flags.SetCommandStreamReceiver.set(2);
pageFaultManager = std::make_unique<MockPageFaultManager>();
pageFaultManager->selectGpuDomainHandler();
EXPECT_EQ(pageFaultManager->getTbxHandlerAddress(), reinterpret_cast<void *>(pageFaultManager->gpuDomainHandler));
DebugManager.flags.SetCommandStreamReceiver.set(4);
pageFaultManager->selectGpuDomainHandler();
EXPECT_EQ(pageFaultManager->getTbxHandlerAddress(), reinterpret_cast<void *>(pageFaultManager->gpuDomainHandler));
}
TEST(PageFaultManager, givenNonTbxCsrWhenSelectingHandlerThenHwGpuDomainHandlerIsSet) {
DebugManagerStateRestore restorer;
DebugManager.flags.SetCommandStreamReceiver.set(0);
auto pageFaultManager = std::make_unique<MockPageFaultManager>();
auto defaultHandler = pageFaultManager->gpuDomainHandler;
EXPECT_EQ(pageFaultManager->getHwHandlerAddress(), reinterpret_cast<void *>(pageFaultManager->gpuDomainHandler));
pageFaultManager->selectGpuDomainHandler();
EXPECT_EQ(defaultHandler, pageFaultManager->gpuDomainHandler);
DebugManager.flags.SetCommandStreamReceiver.set(3);
pageFaultManager = std::make_unique<MockPageFaultManager>();
pageFaultManager->selectGpuDomainHandler();
EXPECT_EQ(defaultHandler, pageFaultManager->gpuDomainHandler);
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019-2020 Intel Corporation
* Copyright (C) 2019-2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -13,9 +13,13 @@ using namespace NEO;
class MockPageFaultManager : public PageFaultManager {
public:
using PageFaultManager::gpuDomainHandler;
using PageFaultManager::handleGpuDomainTransferForHw;
using PageFaultManager::handleGpuDomainTransferForTbx;
using PageFaultManager::memoryData;
using PageFaultManager::PageFaultData;
using PageFaultManager::PageFaultManager;
using PageFaultManager::selectGpuDomainHandler;
using PageFaultManager::verifyPageFault;
void allowCPUMemoryAccess(void *ptr, size_t size) override {
@@ -51,6 +55,14 @@ class MockPageFaultManager : public PageFaultManager {
}
void evictMemoryAfterImplCopy(GraphicsAllocation *allocation, Device *device) override {}
void *getHwHandlerAddress() {
return reinterpret_cast<void *>(PageFaultManager::handleGpuDomainTransferForHw);
}
void *getTbxHandlerAddress() {
return reinterpret_cast<void *>(PageFaultManager::handleGpuDomainTransferForTbx);
}
int allowMemoryAccessCalled = 0;
int protectMemoryCalled = 0;
int transferToCpuCalled = 0;