Dont create multiple page table managers within single root device

Resolves: NEO-4090
Change-Id: I148b9a5a2755edbcd15ead5f4a0d5d799ee815e1
Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
Mateusz Jablonski
2019-12-27 11:32:12 +01:00
committed by Jablonski, Mateusz
parent b5dd3abf85
commit 14c013f53b
5 changed files with 67 additions and 12 deletions

View File

@ -8,9 +8,10 @@
#include "runtime/command_stream/command_stream_receiver.h"
#include "core/command_stream/preemption.h"
#include "core/execution_environment/root_device_environment.h"
#include "core/helpers/cache_policy.h"
#include "core/helpers/hw_helper.h"
#include "core/helpers/string.h"
#include "runtime/aub_mem_dump/aub_services.h"
#include "runtime/built_ins/built_ins.h"
#include "runtime/command_stream/experimental_command_buffer.h"
#include "runtime/command_stream/scratch_space_controller.h"
@ -445,9 +446,22 @@ TagAllocator<TimestampPacketStorage> *CommandStreamReceiver::getTimestampPacketA
cl_int CommandStreamReceiver::expectMemory(const void *gfxAddress, const void *srcAddress,
size_t length, uint32_t compareOperation) {
auto isMemoryEqual = (memcmp(gfxAddress, srcAddress, length) == 0);
auto isEqualMemoryExpected = (compareOperation == CmdServicesMemTraceMemoryCompare::CompareOperationValues::CompareEqual);
auto isEqualMemoryExpected = (compareOperation == AubMemDump::CmdServicesMemTraceMemoryCompare::CompareOperationValues::CompareEqual);
return (isMemoryEqual == isEqualMemoryExpected) ? CL_SUCCESS : CL_INVALID_VALUE;
}
bool CommandStreamReceiver::needsPageTableManager(aub_stream::EngineType engineType) const {
auto hwInfo = executionEnvironment.getHardwareInfo();
auto defaultEngineType = getChosenEngineType(*hwInfo);
if (engineType != defaultEngineType) {
return false;
}
auto rootDeviceEnvironment = executionEnvironment.rootDeviceEnvironments[rootDeviceIndex].get();
if (rootDeviceEnvironment->pageTableManager.get() != nullptr) {
return false;
}
return HwHelper::get(hwInfo->platform.eRenderCoreFamily).isPageTableManagerSupported(*hwInfo);
}
} // namespace NEO

View File

@ -87,6 +87,7 @@ class CommandStreamReceiver {
ResidencyContainer &getEvictionAllocations();
virtual GmmPageTableMngr *createPageTableManager() { return nullptr; }
bool needsPageTableManager(aub_stream::EngineType engineType) const;
void waitForTaskCountAndCleanAllocationList(uint32_t requiredTaskCount, uint32_t allocationUsage);
MOCKABLE_VIRTUAL void waitForTaskCountAndCleanTemporaryAllocationList(uint32_t requiredTaskCount);

View File

@ -147,7 +147,7 @@ bool Device::createEngine(uint32_t deviceCsrIndex, aub_stream::EngineType engine
if (!commandStreamReceiver) {
return false;
}
if (HwHelper::get(hwInfo.platform.eRenderCoreFamily).isPageTableManagerSupported(hwInfo)) {
if (commandStreamReceiver->needsPageTableManager(engineType)) {
commandStreamReceiver->createPageTableManager();
}

View File

@ -8,11 +8,12 @@
#include "core/command_stream/linear_stream.h"
#include "core/command_stream/preemption.h"
#include "core/helpers/cache_policy.h"
#include "core/helpers/hw_helper.h"
#include "core/memory_manager/graphics_allocation.h"
#include "core/unit_tests/helpers/debug_manager_state_restore.h"
#include "runtime/aub_mem_dump/aub_services.h"
#include "runtime/command_stream/command_stream_receiver.h"
#include "runtime/command_stream/scratch_space_controller.h"
#include "runtime/gmm_helper/page_table_mngr.h"
#include "runtime/helpers/timestamp_packet.h"
#include "runtime/mem_obj/buffer.h"
#include "runtime/memory_manager/internal_allocation_storage.h"
@ -388,8 +389,8 @@ TEST(CommandStreamReceiverSimpleTest, givenVariousDataSetsWhenVerifyingMemoryThe
uint8_t setB1[setSize] = {40, 15, 3, 11, 17, 4};
uint8_t setB2[setSize] = {40, 15, 3, 11, 17, 4};
constexpr auto compareEqual = CmdServicesMemTraceMemoryCompare::CompareOperationValues::CompareEqual;
constexpr auto compareNotEqual = CmdServicesMemTraceMemoryCompare::CompareOperationValues::CompareNotEqual;
constexpr auto compareEqual = AubMemDump::CmdServicesMemTraceMemoryCompare::CompareOperationValues::CompareEqual;
constexpr auto compareNotEqual = AubMemDump::CmdServicesMemTraceMemoryCompare::CompareOperationValues::CompareNotEqual;
EXPECT_EQ(CL_SUCCESS, csr.expectMemory(setA1, setA2, setSize, compareEqual));
EXPECT_EQ(CL_SUCCESS, csr.expectMemory(setB1, setB2, setSize, compareEqual));
@ -747,3 +748,41 @@ TEST_F(CommandStreamReceiverMultiRootDeviceTest, commandStreamGraphicsAllocation
ASSERT_NE(nullptr, surface.getAllocation());
EXPECT_EQ(expectedRootDeviceIndex, surface.getAllocation()->getRootDeviceIndex());
}
using CommandStreamReceiverPageTableManagerTest = ::testing::Test;
TEST_F(CommandStreamReceiverPageTableManagerTest, givenNonDefaultEngineTypeWhenNeedsPageTableManagerIsCalledThenFalseIsReturned) {
MockExecutionEnvironment executionEnvironment;
executionEnvironment.initializeMemoryManager();
MockCommandStreamReceiver commandStreamReceiver(executionEnvironment, 0u);
auto hwInfo = executionEnvironment.getHardwareInfo();
auto defaultEngineType = getChosenEngineType(*hwInfo);
auto engineType = aub_stream::EngineType::ENGINE_BCS;
EXPECT_NE(defaultEngineType, engineType);
EXPECT_EQ(nullptr, executionEnvironment.rootDeviceEnvironments[0]->pageTableManager.get());
EXPECT_FALSE(commandStreamReceiver.needsPageTableManager(engineType));
}
TEST_F(CommandStreamReceiverPageTableManagerTest, givenDefaultEngineTypeAndExistingPageTableManagerWhenNeedsPageTableManagerIsCalledThenFalseIsReturned) {
MockExecutionEnvironment executionEnvironment;
executionEnvironment.initializeMemoryManager();
MockCommandStreamReceiver commandStreamReceiver(executionEnvironment, 0u);
auto hwInfo = executionEnvironment.getHardwareInfo();
auto defaultEngineType = getChosenEngineType(*hwInfo);
GmmPageTableMngr *dummyPageTableManager = reinterpret_cast<GmmPageTableMngr *>(0x1234);
executionEnvironment.rootDeviceEnvironments[0]->pageTableManager.reset(dummyPageTableManager);
EXPECT_FALSE(commandStreamReceiver.needsPageTableManager(defaultEngineType));
executionEnvironment.rootDeviceEnvironments[0]->pageTableManager.release();
}
TEST_F(CommandStreamReceiverPageTableManagerTest, givenDefaultEngineTypeAndNonExisitingPageTableManagerWhenNeedsPageTableManagerIsCalledThenSupportOfPageTableManagerIsReturned) {
MockExecutionEnvironment executionEnvironment;
executionEnvironment.initializeMemoryManager();
MockCommandStreamReceiver commandStreamReceiver(executionEnvironment, 0u);
auto hwInfo = executionEnvironment.getHardwareInfo();
auto defaultEngineType = getChosenEngineType(*hwInfo);
bool supportsPageTableManager = HwHelper::get(hwInfo->platform.eRenderCoreFamily).isPageTableManagerSupported(*hwInfo);
EXPECT_EQ(nullptr, executionEnvironment.rootDeviceEnvironments[0]->pageTableManager.get());
EXPECT_EQ(supportsPageTableManager, commandStreamReceiver.needsPageTableManager(defaultEngineType));
}

View File

@ -262,16 +262,17 @@ TEST(DeviceCreation, givenDeviceWhenCheckingEnginesCountThenNumberGreaterThanZer
using DeviceHwTest = ::testing::Test;
HWTEST_F(DeviceHwTest, givenHwHelperInputWhenInitializingCsrThenCreatePageTableManagerIfAllowed) {
HWTEST_F(DeviceHwTest, givenHwHelperInputWhenInitializingCsrThenCreatePageTableManagerIfNeeded) {
HardwareInfo localHwInfo = *platformDevices[0];
localHwInfo.capabilityTable.ftrRenderCompressedBuffers = false;
localHwInfo.capabilityTable.ftrRenderCompressedImages = false;
ExecutionEnvironment executionEnvironment;
executionEnvironment.prepareRootDeviceEnvironments(1);
executionEnvironment.prepareRootDeviceEnvironments(3);
executionEnvironment.incRefInternal();
executionEnvironment.initializeMemoryManager();
executionEnvironment.setHwInfo(&localHwInfo);
auto defaultEngineType = getChosenEngineType(localHwInfo);
std::unique_ptr<MockDevice> device;
device.reset(MockDevice::createWithExecutionEnvironment<MockDevice>(&localHwInfo, &executionEnvironment, 0));
auto &csr0 = device->getUltCommandStreamReceiver<FamilyType>();
@ -280,13 +281,13 @@ HWTEST_F(DeviceHwTest, givenHwHelperInputWhenInitializingCsrThenCreatePageTableM
auto hwInfo = executionEnvironment.getMutableHardwareInfo();
hwInfo->capabilityTable.ftrRenderCompressedBuffers = true;
hwInfo->capabilityTable.ftrRenderCompressedImages = false;
device.reset(MockDevice::createWithExecutionEnvironment<MockDevice>(&localHwInfo, &executionEnvironment, 0));
device.reset(MockDevice::createWithExecutionEnvironment<MockDevice>(&localHwInfo, &executionEnvironment, 1));
auto &csr1 = device->getUltCommandStreamReceiver<FamilyType>();
EXPECT_EQ(UnitTestHelper<FamilyType>::isPageTableManagerSupported(*hwInfo), csr1.createPageTableManagerCalled);
EXPECT_EQ(csr1.needsPageTableManager(defaultEngineType), csr1.createPageTableManagerCalled);
hwInfo->capabilityTable.ftrRenderCompressedBuffers = false;
hwInfo->capabilityTable.ftrRenderCompressedImages = true;
device.reset(MockDevice::createWithExecutionEnvironment<MockDevice>(&localHwInfo, &executionEnvironment, 0));
device.reset(MockDevice::createWithExecutionEnvironment<MockDevice>(&localHwInfo, &executionEnvironment, 2));
auto &csr2 = device->getUltCommandStreamReceiver<FamilyType>();
EXPECT_EQ(UnitTestHelper<FamilyType>::isPageTableManagerSupported(*hwInfo), csr2.createPageTableManagerCalled);
EXPECT_EQ(csr2.needsPageTableManager(defaultEngineType), csr2.createPageTableManagerCalled);
}