diff --git a/Jenkinsfile b/Jenkinsfile index 7a11084221..92ffa7a38b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,5 +1,5 @@ #!groovy dependenciesRevision='42bc9ab3a399b043aa54824c449d5d7a96b7ea82-1354' strategy='EQUAL' -allowedCD=259 +allowedCD=258 allowedF=11 diff --git a/runtime/command_stream/command_stream_receiver.h b/runtime/command_stream/command_stream_receiver.h index e3d5ea1083..c65f3166c0 100644 --- a/runtime/command_stream/command_stream_receiver.h +++ b/runtime/command_stream/command_stream_receiver.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2019 Intel Corporation + * Copyright (C) 2018-2020 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -265,6 +265,7 @@ class CommandStreamReceiver { bool requiresInstructionCacheFlush = false; bool localMemoryEnabled = false; + bool pageTableManagerInitialized = false; }; typedef CommandStreamReceiver *(*CommandStreamReceiverCreateFunc)(bool withAubDump, ExecutionEnvironment &executionEnvironment, uint32_t rootDeviceIndex); diff --git a/runtime/command_stream/command_stream_receiver_hw_base.inl b/runtime/command_stream/command_stream_receiver_hw_base.inl index 2ffadaec54..02e5a8d157 100644 --- a/runtime/command_stream/command_stream_receiver_hw_base.inl +++ b/runtime/command_stream/command_stream_receiver_hw_base.inl @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Intel Corporation + * Copyright (C) 2019-2020 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -261,8 +261,8 @@ CompletionStamp CommandStreamReceiverHw::flushTask( } programEngineModeCommands(commandStreamCSR, dispatchFlags); - if (executionEnvironment.rootDeviceEnvironments[device.getRootDeviceIndex()]->pageTableManager.get()) { - executionEnvironment.rootDeviceEnvironments[device.getRootDeviceIndex()]->pageTableManager->initPageTableManagerRegisters(); + if (executionEnvironment.rootDeviceEnvironments[device.getRootDeviceIndex()]->pageTableManager.get() && !pageTableManagerInitialized) { + pageTableManagerInitialized = executionEnvironment.rootDeviceEnvironments[device.getRootDeviceIndex()]->pageTableManager->initPageTableManagerRegisters(this); } programComputeMode(commandStreamCSR, dispatchFlags); programL3(commandStreamCSR, dispatchFlags, newL3Config); diff --git a/runtime/gmm_helper/page_table_mngr.h b/runtime/gmm_helper/page_table_mngr.h index 21e373f8f7..0fea50171e 100644 --- a/runtime/gmm_helper/page_table_mngr.h +++ b/runtime/gmm_helper/page_table_mngr.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017-2019 Intel Corporation + * Copyright (C) 2017-2020 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -16,8 +16,6 @@ namespace NEO { class Gmm; class LinearStream; - -void gmmSetCsrHandle(GMM_PAGETABLE_MGR *pageTableManager, HANDLE csrHandle); class GmmPageTableMngr { public: MOCKABLE_VIRTUAL ~GmmPageTableMngr(); @@ -27,9 +25,7 @@ class GmmPageTableMngr { MOCKABLE_VIRTUAL void setCsrHandle(void *csrHandle); bool updateAuxTable(uint64_t gpuVa, Gmm *gmm, bool map); - void initPageTableManagerRegisters(); - - bool initialized = false; + bool initPageTableManagerRegisters(void *csrHandle); protected: GmmPageTableMngr() = default; @@ -45,7 +41,5 @@ class GmmPageTableMngr { GmmPageTableMngr(unsigned int translationTableFlags, GMM_TRANSLATIONTABLE_CALLBACKS *translationTableCb); GMM_CLIENT_CONTEXT *clientContext = nullptr; GMM_PAGETABLE_MGR *pageTableManager = nullptr; - decltype(&gmmSetCsrHandle) gmmSetCsrHandleFunc = gmmSetCsrHandle; - void *csrHandle = nullptr; }; } // namespace NEO diff --git a/runtime/gmm_helper/page_table_mngr_impl.cpp b/runtime/gmm_helper/page_table_mngr_impl.cpp index 46dd33de22..6bef068a08 100644 --- a/runtime/gmm_helper/page_table_mngr_impl.cpp +++ b/runtime/gmm_helper/page_table_mngr_impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2019 Intel Corporation + * Copyright (C) 2018-2020 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -29,17 +29,9 @@ bool GmmPageTableMngr::updateAuxTable(uint64_t gpuVa, Gmm *gmm, bool map) { return updateAuxTable(&ddiUpdateAuxTable) == GMM_STATUS::GMM_SUCCESS; } -void GmmPageTableMngr::initPageTableManagerRegisters() { - if (!initialized) { - initContextAuxTableRegister(csrHandle, GMM_ENGINE_TYPE::ENGINE_TYPE_RCS); - - initialized = true; - } -} - -void GmmPageTableMngr::setCsrHandle(void *csrHandleIn) { - csrHandle = csrHandleIn; - gmmSetCsrHandleFunc(pageTableManager, csrHandle); +bool GmmPageTableMngr::initPageTableManagerRegisters(void *csrHandle) { + auto status = initContextAuxTableRegister(csrHandle, GMM_ENGINE_TYPE::ENGINE_TYPE_RCS); + return status == GMM_SUCCESS; } } // namespace NEO diff --git a/runtime/os_interface/linux/page_table_manager_functions.cpp b/runtime/os_interface/linux/page_table_manager_functions.cpp index 97512e2ecd..e96969007e 100644 --- a/runtime/os_interface/linux/page_table_manager_functions.cpp +++ b/runtime/os_interface/linux/page_table_manager_functions.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Intel Corporation + * Copyright (C) 2019-2020 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -12,12 +12,10 @@ #include "gmm_client_context.h" namespace NEO { - -void gmmSetCsrHandle(GMM_PAGETABLE_MGR *pageTableManager, HANDLE csrHandle) { -} - GmmPageTableMngr::GmmPageTableMngr(unsigned int translationTableFlags, GMM_TRANSLATIONTABLE_CALLBACKS *translationTableCb) { clientContext = platform()->peekGmmClientContext()->getHandle(); pageTableManager = clientContext->CreatePageTblMgrObject(translationTableFlags); } + +void GmmPageTableMngr::setCsrHandle(void *csrHandle) {} } // namespace NEO diff --git a/runtime/os_interface/windows/page_table_manager_functions.cpp b/runtime/os_interface/windows/page_table_manager_functions.cpp index 85ab8a6081..15a8491bb5 100644 --- a/runtime/os_interface/windows/page_table_manager_functions.cpp +++ b/runtime/os_interface/windows/page_table_manager_functions.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Intel Corporation + * Copyright (C) 2019-2020 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -12,13 +12,12 @@ #include "gmm_client_context.h" namespace NEO { - -void gmmSetCsrHandle(GMM_PAGETABLE_MGR *pageTableManager, HANDLE csrHandle) { - pageTableManager->GmmSetCsrHandle(csrHandle); -} - GmmPageTableMngr::GmmPageTableMngr(unsigned int translationTableFlags, GMM_TRANSLATIONTABLE_CALLBACKS *translationTableCb) { clientContext = platform()->peekGmmClientContext()->getHandle(); pageTableManager = clientContext->CreatePageTblMgrObject(translationTableCb, translationTableFlags); } + +void GmmPageTableMngr::setCsrHandle(void *csrHandle) { + pageTableManager->GmmSetCsrHandle(csrHandle); +} } // namespace NEO diff --git a/unit_tests/command_stream/command_stream_receiver_flush_task_3_tests.cpp b/unit_tests/command_stream/command_stream_receiver_flush_task_3_tests.cpp index 59b80dcce5..214e81ad6c 100644 --- a/unit_tests/command_stream/command_stream_receiver_flush_task_3_tests.cpp +++ b/unit_tests/command_stream/command_stream_receiver_flush_task_3_tests.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2019 Intel Corporation + * Copyright (C) 2018-2020 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -19,6 +19,7 @@ #include "unit_tests/mocks/mock_csr.h" #include "unit_tests/mocks/mock_device.h" #include "unit_tests/mocks/mock_event.h" +#include "unit_tests/mocks/mock_gmm_page_table_mngr.h" #include "unit_tests/mocks/mock_kernel.h" #include "unit_tests/mocks/mock_os_context.h" #include "unit_tests/mocks/mock_program.h" @@ -1643,3 +1644,65 @@ HWTEST_F(CommandStreamReceiverFlushTaskTests, givenWaitForCompletionWithTimeoutI mockCsr.submissionAggregator->recordCommandBuffer(cmdBuffer.release()); EXPECT_FALSE(mockCsr.waitForCompletionWithTimeout(false, 0, 1)); } + +HWTEST_F(CommandStreamReceiverFlushTaskTests, givenCommandStreamReceiverWhenFlushTaskIsCalledThenInitializePageTableManagerRegister) { + auto csr = new MockCsrHw2(*pDevice->executionEnvironment, pDevice->getRootDeviceIndex()); + auto csr2 = new MockCsrHw2(*pDevice->executionEnvironment, pDevice->getRootDeviceIndex()); + pDevice->resetCommandStreamReceiver(csr); + + MockGmmPageTableMngr *pageTableManager = new MockGmmPageTableMngr(); + pDevice->getExecutionEnvironment()->rootDeviceEnvironments[pDevice->getRootDeviceIndex()]->pageTableManager.reset(pageTableManager); + + EXPECT_CALL(*pageTableManager, initContextAuxTableRegister(csr, ::testing::_)).Times(1); + EXPECT_CALL(*pageTableManager, initContextAuxTableRegister(csr2, ::testing::_)).Times(0); + + auto memoryManager = pDevice->getMemoryManager(); + auto graphicsAllocation = memoryManager->allocateGraphicsMemoryWithProperties(MockAllocationProperties{MemoryConstants::pageSize}); + IndirectHeap cs(graphicsAllocation); + + EXPECT_FALSE(csr->pageTableManagerInitialized); + EXPECT_FALSE(csr2->pageTableManagerInitialized); + + DispatchFlags dispatchFlags = DispatchFlagsHelper::createDefaultDispatchFlags(); + + csr->flushTask(cs, 0u, cs, cs, cs, 0u, dispatchFlags, *pDevice); + + EXPECT_TRUE(csr->pageTableManagerInitialized); + EXPECT_FALSE(csr2->pageTableManagerInitialized); + + csr->flushTask(cs, 0u, cs, cs, cs, 0u, dispatchFlags, *pDevice); + + EXPECT_CALL(*pageTableManager, initContextAuxTableRegister(csr2, ::testing::_)).Times(1); + pDevice->resetCommandStreamReceiver(csr2); + csr2->flushTask(cs, 0u, cs, cs, cs, 0u, dispatchFlags, *pDevice); + EXPECT_TRUE(csr2->pageTableManagerInitialized); + + memoryManager->freeGraphicsMemory(graphicsAllocation); +} + +HWTEST_F(CommandStreamReceiverFlushTaskTests, givenCommandStreamReceiverWhenInitializingPageTableManagerRegisterFailsThenPageTableManagerIsNotInitialized) { + auto csr = new MockCsrHw2(*pDevice->executionEnvironment, pDevice->getRootDeviceIndex()); + pDevice->resetCommandStreamReceiver(csr); + + MockGmmPageTableMngr *pageTableManager = new MockGmmPageTableMngr(); + pDevice->getExecutionEnvironment()->rootDeviceEnvironments[pDevice->getRootDeviceIndex()]->pageTableManager.reset(pageTableManager); + + EXPECT_CALL(*pageTableManager, initContextAuxTableRegister(csr, ::testing::_)).Times(2).WillRepeatedly(::testing::Return(GMM_ERROR)); + + auto memoryManager = pDevice->getMemoryManager(); + auto graphicsAllocation = memoryManager->allocateGraphicsMemoryWithProperties(MockAllocationProperties{MemoryConstants::pageSize}); + IndirectHeap cs(graphicsAllocation); + + EXPECT_FALSE(csr->pageTableManagerInitialized); + + DispatchFlags dispatchFlags = DispatchFlagsHelper::createDefaultDispatchFlags(); + + csr->flushTask(cs, 0u, cs, cs, cs, 0u, dispatchFlags, *pDevice); + + EXPECT_FALSE(csr->pageTableManagerInitialized); + + csr->flushTask(cs, 0u, cs, cs, cs, 0u, dispatchFlags, *pDevice); + + EXPECT_FALSE(csr->pageTableManagerInitialized); + memoryManager->freeGraphicsMemory(graphicsAllocation); +} diff --git a/unit_tests/mocks/mock_csr.h b/unit_tests/mocks/mock_csr.h index 69baffd9f6..f8c89985c4 100644 --- a/unit_tests/mocks/mock_csr.h +++ b/unit_tests/mocks/mock_csr.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2019 Intel Corporation + * Copyright (C) 2018-2020 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -158,6 +158,7 @@ class MockCsrHw2 : public CommandStreamReceiverHw { using CommandStreamReceiver::lastSentCoherencyRequest; using CommandStreamReceiver::mediaVfeStateDirty; using CommandStreamReceiver::nTo1SubmissionModelEnabled; + using CommandStreamReceiver::pageTableManagerInitialized; using CommandStreamReceiver::requiredScratchSize; using CommandStreamReceiver::requiredThreadArbitrationPolicy; using CommandStreamReceiver::taskCount; diff --git a/unit_tests/mocks/mock_gmm_page_table_mngr.cpp b/unit_tests/mocks/mock_gmm_page_table_mngr.cpp index 96a1ddbbcc..6a2c270b7c 100644 --- a/unit_tests/mocks/mock_gmm_page_table_mngr.cpp +++ b/unit_tests/mocks/mock_gmm_page_table_mngr.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017-2019 Intel Corporation + * Copyright (C) 2017-2020 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -7,8 +7,6 @@ #include "unit_tests/mocks/mock_gmm_page_table_mngr.h" -void dummySetCsrHandle(GMM_PAGETABLE_MGR *, HANDLE){}; - namespace NEO { using namespace ::testing; @@ -19,7 +17,7 @@ GmmPageTableMngr *GmmPageTableMngr::create(unsigned int translationTableFlags, G return pageTableMngr; } void MockGmmPageTableMngr::setCsrHandle(void *csrHandle) { - GmmPageTableMngr::setCsrHandle(csrHandle); + passedCsrHandle = csrHandle; setCsrHanleCalled++; } } // namespace NEO diff --git a/unit_tests/mocks/mock_gmm_page_table_mngr.h b/unit_tests/mocks/mock_gmm_page_table_mngr.h index fc2def6a67..899d4e3c0f 100644 --- a/unit_tests/mocks/mock_gmm_page_table_mngr.h +++ b/unit_tests/mocks/mock_gmm_page_table_mngr.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017-2019 Intel Corporation + * Copyright (C) 2017-2020 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -16,20 +16,16 @@ #pragma clang diagnostic ignored "-Winconsistent-missing-override" #endif -void dummySetCsrHandle(GMM_PAGETABLE_MGR *, HANDLE); - namespace NEO { class MockGmmPageTableMngr : public GmmPageTableMngr { public: - using GmmPageTableMngr::csrHandle; - MockGmmPageTableMngr() : MockGmmPageTableMngr(0u, nullptr){}; + MockGmmPageTableMngr() = default; MockGmmPageTableMngr(unsigned int translationTableFlags, GMM_TRANSLATIONTABLE_CALLBACKS *translationTableCb) : translationTableFlags(translationTableFlags) { if (translationTableCb) { this->translationTableCb = *translationTableCb; } - gmmSetCsrHandleFunc = dummySetCsrHandle; }; MOCK_METHOD2(initContextAuxTableRegister, GMM_STATUS(HANDLE initialBBHandle, GMM_ENGINE_TYPE engineType)); @@ -39,6 +35,7 @@ class MockGmmPageTableMngr : public GmmPageTableMngr { void setCsrHandle(void *csrHandle) override; uint32_t setCsrHanleCalled = 0; + void *passedCsrHandle = nullptr; unsigned int translationTableFlags = 0; GMM_TRANSLATIONTABLE_CALLBACKS translationTableCb = {}; diff --git a/unit_tests/os_interface/linux/drm_command_stream_tests.cpp b/unit_tests/os_interface/linux/drm_command_stream_tests.cpp index a0f3e32b00..1da40ec6f0 100644 --- a/unit_tests/os_interface/linux/drm_command_stream_tests.cpp +++ b/unit_tests/os_interface/linux/drm_command_stream_tests.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017-2019 Intel Corporation + * Copyright (C) 2017-2020 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -1390,29 +1390,6 @@ HWTEST_TEMPLATED_F(DrmCommandStreamTest, givenDrmCommandStreamReceiverWhenCreate EXPECT_EQ(executionEnvironment.rootDeviceEnvironments[1]->pageTableManager.get(), pageTableManager); } -HWTEST_TEMPLATED_F(DrmCommandStreamTest, givenDrmCommandStreamReceiverWhenInitializePageTableMngrRegistersIsCalledThenInitializePageTableManager) { - executionEnvironment.prepareRootDeviceEnvironments(2); - auto csr = std::make_unique>(executionEnvironment, 1, gemCloseWorkerMode::gemCloseWorkerActive); - csr->createPageTableManager(); - auto &rootDeviceEnvironment = executionEnvironment.rootDeviceEnvironments[1]; - - MockGmmPageTableMngr *mockMngr = static_cast(rootDeviceEnvironment->pageTableManager.get()); - auto csrHandle = reinterpret_cast(0x1234); - mockMngr->setCsrHandle(csrHandle); - EXPECT_CALL(*mockMngr, initContextAuxTableRegister(csrHandle, ::testing::_)).Times(1); - - EXPECT_FALSE(rootDeviceEnvironment->pageTableManager->initialized); - LinearStream linearStream = {}; - rootDeviceEnvironment->pageTableManager->initPageTableManagerRegisters(); - EXPECT_TRUE(rootDeviceEnvironment->pageTableManager->initialized); - - rootDeviceEnvironment->pageTableManager->initPageTableManagerRegisters(); - EXPECT_TRUE(rootDeviceEnvironment->pageTableManager->initialized); - - rootDeviceEnvironment->pageTableManager.reset(nullptr); - EXPECT_EQ(rootDeviceEnvironment->pageTableManager, nullptr); -} - HWTEST_TEMPLATED_F(DrmCommandStreamTest, givenPageTableManagerAndMapTrueWhenUpdateAuxTableIsCalledThenItReturnsTrue) { auto mockMngr = new MockGmmPageTableMngr(); executionEnvironment.rootDeviceEnvironments[0]->pageTableManager.reset(mockMngr); diff --git a/unit_tests/os_interface/windows/device_command_stream_tests.cpp b/unit_tests/os_interface/windows/device_command_stream_tests.cpp index ba3eabc8c0..a7d5a08f79 100644 --- a/unit_tests/os_interface/windows/device_command_stream_tests.cpp +++ b/unit_tests/os_interface/windows/device_command_stream_tests.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017-2019 Intel Corporation + * Copyright (C) 2017-2020 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -872,7 +872,7 @@ HWTEST_P(WddmCsrCompressionParameterizedTest, givenEnabledCompressionWhenInitial auto mockMngr = reinterpret_cast(executionEnvironment->rootDeviceEnvironments[index]->pageTableManager.get()); EXPECT_EQ(1u, mockMngr->setCsrHanleCalled); - EXPECT_EQ(&mockWddmCsr, mockMngr->csrHandle); + EXPECT_EQ(&mockWddmCsr, mockMngr->passedCsrHandle); GMM_TRANSLATIONTABLE_CALLBACKS expectedTTCallbacks = {}; unsigned int expectedFlags = TT_TYPE::AUXTT; @@ -892,40 +892,6 @@ HWTEST_F(WddmCsrCompressionTests, givenDisabledCompressionWhenInitializedThenDon EXPECT_EQ(nullptr, executionEnvironment->rootDeviceEnvironments[1]->pageTableManager.get()); } -HWTEST_P(WddmCsrCompressionParameterizedTest, givenEnabledCompressionWhenFlushingThenInitTranslationTableOnce) { - ExecutionEnvironment *executionEnvironment = getExecutionEnvironmentImpl(hwInfo, 2); - setCompressionEnabled(compressionEnabled, !compressionEnabled); - myMockWddm = static_cast(executionEnvironment->osInterface->get()->getWddm()); - auto mockWddmCsr = new MockWddmCsr(*executionEnvironment, 1); - mockWddmCsr->createPageTableManager(); - mockWddmCsr->overrideDispatchPolicy(DispatchMode::BatchedDispatch); - executionEnvironment->memoryManager.reset(new WddmMemoryManager(*executionEnvironment)); - - std::unique_ptr device(Device::create(executionEnvironment, 1u)); - device->resetCommandStreamReceiver(mockWddmCsr); - - auto memoryManager = executionEnvironment->memoryManager.get(); - - mockWddmCsr->getCS(); - - auto graphicsAllocation = memoryManager->allocateGraphicsMemoryWithProperties(MockAllocationProperties{MemoryConstants::pageSize}); - IndirectHeap cs(graphicsAllocation); - - EXPECT_FALSE(executionEnvironment->rootDeviceEnvironments[1]->pageTableManager->initialized); - - DispatchFlags dispatchFlags = DispatchFlagsHelper::createDefaultDispatchFlags(); - - mockWddmCsr->flushTask(cs, 0u, cs, cs, cs, 0u, dispatchFlags, *device); - - EXPECT_TRUE(executionEnvironment->rootDeviceEnvironments[1]->pageTableManager->initialized); - - // flush again to check if PT manager was initialized once - mockWddmCsr->flushTask(cs, 0u, cs, cs, cs, 0u, dispatchFlags, *device); - - mockWddmCsr->flushBatchedSubmissions(); - memoryManager->freeGraphicsMemory(graphicsAllocation); -} - INSTANTIATE_TEST_CASE_P( WddmCsrCompressionParameterizedTestCreate, WddmCsrCompressionParameterizedTest,