diff --git a/shared/source/os_interface/windows/CMakeLists.txt b/shared/source/os_interface/windows/CMakeLists.txt index 1290aae6c4..5bd43438ea 100644 --- a/shared/source/os_interface/windows/CMakeLists.txt +++ b/shared/source/os_interface/windows/CMakeLists.txt @@ -97,7 +97,6 @@ set(NEO_CORE_OS_INTERFACE_WDDM ${CMAKE_CURRENT_SOURCE_DIR}/wddm/set_gmm_input_args_${DRIVER_MODEL}.cpp ${CMAKE_CURRENT_SOURCE_DIR}/wddm/max_mem_alloc_size_${DRIVER_MODEL}.cpp ${CMAKE_CURRENT_SOURCE_DIR}/wddm/helper_${DRIVER_MODEL}.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/wddm/is_readonly_memory_${DRIVER_MODEL}.cpp ${CMAKE_CURRENT_SOURCE_DIR}/wddm/skip_resource_cleanup_${DRIVER_MODEL}.cpp ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}map_tile_instanced_allocation_${DRIVER_MODEL}.cpp ${CMAKE_CURRENT_SOURCE_DIR}/wddm/wddm.cpp diff --git a/shared/source/os_interface/windows/wddm/is_readonly_memory_drm_or_wddm.cpp b/shared/source/os_interface/windows/wddm/is_readonly_memory_drm_or_wddm.cpp deleted file mode 100644 index afa33a18b2..0000000000 --- a/shared/source/os_interface/windows/wddm/is_readonly_memory_drm_or_wddm.cpp +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (C) 2024 Intel Corporation - * - * SPDX-License-Identifier: MIT - * - */ - -#include "shared/source/os_interface/windows/wddm/wddm.h" - -namespace NEO { -bool Wddm::isReadOnlyMemory(const void *ptr) { - return false; -} -} // namespace NEO diff --git a/shared/source/os_interface/windows/wddm/is_readonly_memory_wddm.cpp b/shared/source/os_interface/windows/wddm/is_readonly_memory_wddm.cpp deleted file mode 100644 index 9e570733e9..0000000000 --- a/shared/source/os_interface/windows/wddm/is_readonly_memory_wddm.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) 2024 Intel Corporation - * - * SPDX-License-Identifier: MIT - * - */ - -#include "shared/source/os_interface/windows/sys_calls.h" -#include "shared/source/os_interface/windows/wddm/wddm.h" - -namespace NEO { - -bool Wddm::isReadOnlyMemory(const void *ptr) { - if (ptr) { - MEMORY_BASIC_INFORMATION info; - SysCalls::virtualQuery(ptr, &info, sizeof(info)); - return info.Protect & PAGE_READONLY; - } - return false; -} -} // namespace NEO diff --git a/shared/source/os_interface/windows/wddm/wddm.cpp b/shared/source/os_interface/windows/wddm/wddm.cpp index be80d91f64..e796260b75 100644 --- a/shared/source/os_interface/windows/wddm/wddm.cpp +++ b/shared/source/os_interface/windows/wddm/wddm.cpp @@ -665,6 +665,7 @@ NTSTATUS Wddm::createAllocation(const void *alignedCpuPtr, const Gmm *gmm, D3DKM createAllocation.Flags.CreateShared = outSharedHandle ? TRUE : FALSE; createAllocation.Flags.NtSecuritySharing = outSharedHandle ? TRUE : FALSE; createAllocation.Flags.CreateResource = outSharedHandle ? TRUE : FALSE; + createAllocation.Flags.ReadOnly = alignedCpuPtr != nullptr ? TRUE : FALSE; createAllocation.pAllocationInfo2 = &allocationInfo; createAllocation.hDevice = device; @@ -677,12 +678,6 @@ NTSTATUS Wddm::createAllocation(const void *alignedCpuPtr, const Gmm *gmm, D3DKM } status = getGdi()->createAllocation2(&createAllocation); - if (status != STATUS_SUCCESS) { - if (isReadOnlyMemory(alignedCpuPtr)) { - createAllocation.Flags.ReadOnly = true; - status = getGdi()->createAllocation2(&createAllocation); - } - } if (status != STATUS_SUCCESS) { DEBUG_BREAK_IF(true); return status; @@ -777,19 +772,13 @@ NTSTATUS Wddm::createAllocationsAndMapGpuVa(OsHandleStorage &osHandles) { createAllocation.Flags.CreateShared = FALSE; createAllocation.Flags.RestrictSharedAccess = FALSE; createAllocation.Flags.CreateResource = FALSE; + createAllocation.Flags.ReadOnly = allocationInfo[0].pSystemMem != nullptr ? TRUE : FALSE; createAllocation.pAllocationInfo2 = allocationInfo; createAllocation.hDevice = device; while (status == STATUS_UNSUCCESSFUL) { status = getGdi()->createAllocation2(&createAllocation); - if (status != STATUS_SUCCESS) { - if (isReadOnlyMemory(allocationInfo[0].pSystemMem)) { - createAllocation.Flags.ReadOnly = true; - status = getGdi()->createAllocation2(&createAllocation); - } - } - if (status != STATUS_SUCCESS) { PRINT_DEBUG_STRING(debugManager.flags.PrintDebugMessages.get(), stderr, "%s status: %d", __FUNCTION__, status); DEBUG_BREAK_IF(status != STATUS_GRAPHICS_NO_VIDEO_MEMORY); diff --git a/shared/source/os_interface/windows/wddm/wddm.h b/shared/source/os_interface/windows/wddm/wddm.h index 1bfa1cb426..ac9348e56b 100644 --- a/shared/source/os_interface/windows/wddm/wddm.h +++ b/shared/source/os_interface/windows/wddm/wddm.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2024 Intel Corporation + * Copyright (C) 2018-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -257,7 +257,6 @@ class Wddm : public DriverModel { void setNewResourceBoundToPageTable(); void setProcessPowerThrottling(); void setThreadPriority(); - bool isReadOnlyMemory(const void *ptr); GMM_GFX_PARTITIONING gfxPartition{}; ADAPTER_BDF adapterBDF{}; diff --git a/shared/test/common/mock_gdi/mock_gdi.cpp b/shared/test/common/mock_gdi/mock_gdi.cpp index 9846907215..a2a71419c6 100644 --- a/shared/test/common/mock_gdi/mock_gdi.cpp +++ b/shared/test/common/mock_gdi/mock_gdi.cpp @@ -156,20 +156,19 @@ inline void *getStaticStorage(uint32_t slot) { return ptrOffset(baseAddress, slot * singleStorageSize); } -static bool createAllocation2FailOnReadOnlyAllocation = false; -static bool createAllocation2ReadOnlyFlagWasPassed = false; +static D3DKMT_CREATEALLOCATIONFLAGS createAllocationFlags{}; +static bool captureCreateAllocationFlags = false; static uint32_t createAllocation2NumCalled = 0; -void setCreateAllocation2ReadOnlyFailConfig(bool fail) { - createAllocation2FailOnReadOnlyAllocation = fail; - createAllocation2ReadOnlyFlagWasPassed = false; +void setCapturingCreateAllocationFlags() { + captureCreateAllocationFlags = true; createAllocation2NumCalled = 0; } -void getCreateAllocation2ReadOnlyFailConfig(bool &readOnlyFlagWasPassed, uint32_t &numCalled) { - readOnlyFlagWasPassed = createAllocation2ReadOnlyFlagWasPassed; +void getCapturedCreateAllocationFlags(D3DKMT_CREATEALLOCATIONFLAGS &capturedCreateAllocationFlags, uint32_t &numCalled) { + capturedCreateAllocationFlags = createAllocationFlags; numCalled = createAllocation2NumCalled; - setCreateAllocation2ReadOnlyFailConfig(false); + captureCreateAllocationFlags = false; } NTSTATUS __stdcall mockD3DKMTCreateAllocation2(IN OUT D3DKMT_CREATEALLOCATION *allocation) { @@ -187,14 +186,10 @@ NTSTATUS __stdcall mockD3DKMTCreateAllocation2(IN OUT D3DKMT_CREATEALLOCATION *a return STATUS_INVALID_PARAMETER; } - if (createAllocation2FailOnReadOnlyAllocation) { + if (captureCreateAllocationFlags) { + createAllocationFlags = pallocation.Flags; createAllocation2NumCalled++; - if (pallocation.Flags.ReadOnly) { - createAllocation2ReadOnlyFlagWasPassed = true; - return STATUS_SUCCESS; - } else { - return STATUS_GRAPHICS_NO_VIDEO_MEMORY; - } + return STATUS_SUCCESS; } numOfAllocations = allocation->NumAllocations; diff --git a/shared/test/common/mock_gdi/mock_gdi.h b/shared/test/common/mock_gdi/mock_gdi.h index 10ed25dc9f..fd35157eba 100644 --- a/shared/test/common/mock_gdi/mock_gdi.h +++ b/shared/test/common/mock_gdi/mock_gdi.h @@ -109,5 +109,5 @@ void setAdapterBDF(ADAPTER_BDF &adapterBDF); void setMockDeviceExecutionState(D3DKMT_DEVICEEXECUTION_STATE newState); void setMockGetDeviceStateReturnValue(NTSTATUS newReturnValue, bool execution); void initGfxPartition(); -void setCreateAllocation2ReadOnlyFailConfig(bool fail); -void getCreateAllocation2ReadOnlyFailConfig(bool &readOnlyFlagWasPassed, uint32_t &numCalled); +void setCapturingCreateAllocationFlags(); +void getCapturedCreateAllocationFlags(D3DKMT_CREATEALLOCATIONFLAGS &capturedCreateAllocationFlags, uint32_t &numCalled); diff --git a/shared/test/common/mock_gdi/mock_os_library.cpp b/shared/test/common/mock_gdi/mock_os_library.cpp index ead60cf008..3e5d9f70a5 100644 --- a/shared/test/common/mock_gdi/mock_os_library.cpp +++ b/shared/test/common/mock_gdi/mock_os_library.cpp @@ -253,11 +253,11 @@ void *MockOsLibrary::getProcAddress(const std::string &procName) { if (procName == "D3DKMTUnregisterTrimNotification") { return reinterpret_cast(mockD3DKMTUnregisterTrimNotification); } - if (procName == "getCreateAllocation2ReadOnlyFailConfig") { - return reinterpret_cast(getCreateAllocation2ReadOnlyFailConfig); + if (procName == "setCapturingCreateAllocationFlags") { + return reinterpret_cast(setCapturingCreateAllocationFlags); } - if (procName == "setCreateAllocation2ReadOnlyFailConfig") { - return reinterpret_cast(setCreateAllocation2ReadOnlyFailConfig); + if (procName == "getCapturedCreateAllocationFlags") { + return reinterpret_cast(getCapturedCreateAllocationFlags); } return nullptr; } diff --git a/shared/test/common/mocks/mock_wddm.h b/shared/test/common/mocks/mock_wddm.h index 64a82fe40a..025f9979b9 100644 --- a/shared/test/common/mocks/mock_wddm.h +++ b/shared/test/common/mocks/mock_wddm.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2024 Intel Corporation + * Copyright (C) 2018-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -53,7 +53,6 @@ class WddmMock : public Wddm { using Wddm::gfxWorkaroundTable; using Wddm::gmmMemory; using Wddm::hwDeviceId; - using Wddm::isReadOnlyMemory; using Wddm::mapGpuVirtualAddress; using Wddm::minAddress; using Wddm::pagingFenceAddress; diff --git a/shared/test/common/os_interface/windows/gdi_dll_fixture.h b/shared/test/common/os_interface/windows/gdi_dll_fixture.h index f4c308c3ba..2ecc2bebf0 100644 --- a/shared/test/common/os_interface/windows/gdi_dll_fixture.h +++ b/shared/test/common/os_interface/windows/gdi_dll_fixture.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2024 Intel Corporation + * Copyright (C) 2018-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -61,8 +61,8 @@ struct GdiDllFixture { reinterpret_cast(mockGdiDll->getProcAddress("setAdapterBDF")); setMockDeviceExecutionStateFcn = reinterpret_cast(mockGdiDll->getProcAddress("setMockDeviceExecutionState")); setMockGetDeviceStateReturnValueFcn = reinterpret_cast(mockGdiDll->getProcAddress("setMockGetDeviceStateReturnValue")); - getCreateAllocation2ReadOnlyFailConfigFcn = reinterpret_cast(mockGdiDll->getProcAddress("getCreateAllocation2ReadOnlyFailConfig")); - setCreateAllocation2ReadOnlyFailConfigFcn = reinterpret_cast(mockGdiDll->getProcAddress("setCreateAllocation2ReadOnlyFailConfig")); + getCapturedCreateAllocationFlagsFcn = reinterpret_cast(mockGdiDll->getProcAddress("getCapturedCreateAllocationFlags")); + setCapturingCreateAllocationFlagsFcn = reinterpret_cast(mockGdiDll->getProcAddress("setCapturingCreateAllocationFlags")); setMockLastDestroyedResHandleFcn((D3DKMT_HANDLE)0); *getDestroySynchronizationObjectDataFcn() = {}; *getCreateSynchronizationObject2FailCallFcn() = false; @@ -111,6 +111,6 @@ struct GdiDllFixture { decltype(&setAdapterBDF) setAdapterBDFFcn = nullptr; decltype(&setMockDeviceExecutionState) setMockDeviceExecutionStateFcn = nullptr; decltype(&setMockGetDeviceStateReturnValue) setMockGetDeviceStateReturnValueFcn = nullptr; - decltype(&getCreateAllocation2ReadOnlyFailConfig) getCreateAllocation2ReadOnlyFailConfigFcn = nullptr; - decltype(&setCreateAllocation2ReadOnlyFailConfig) setCreateAllocation2ReadOnlyFailConfigFcn = nullptr; + decltype(&setCapturingCreateAllocationFlags) setCapturingCreateAllocationFlagsFcn = nullptr; + decltype(&getCapturedCreateAllocationFlags) getCapturedCreateAllocationFlagsFcn = nullptr; }; diff --git a/shared/test/unit_test/os_interface/wddm_linux/configure_device_address_space_drm_or_wddm_test.cpp b/shared/test/unit_test/os_interface/wddm_linux/configure_device_address_space_drm_or_wddm_test.cpp index 687192c8a3..eae44e14bd 100644 --- a/shared/test/unit_test/os_interface/wddm_linux/configure_device_address_space_drm_or_wddm_test.cpp +++ b/shared/test/unit_test/os_interface/wddm_linux/configure_device_address_space_drm_or_wddm_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2024 Intel Corporation + * Copyright (C) 2021-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -65,7 +65,6 @@ struct MockWddmLinux : NEO::Wddm { using Wddm::gfxPartition; using Wddm::gfxPlatform; using Wddm::gmmMemory; - using Wddm::isReadOnlyMemory; }; struct MockGmmMemoryWddmLinux : NEO::GmmMemory { @@ -796,16 +795,6 @@ TEST_F(WddmLinuxTest, whenCheckedIfResourcesCleanupCanBeSkippedAndDeviceIsLostTh EXPECT_EQ(1, gdiMockConfig.getDeviceStateClb.callCount); } -TEST_F(WddmLinuxTest, whenIsReadOnlyMemoryCalledThenCorrectValueReturned) { - EXPECT_FALSE(wddm->isReadOnlyMemory(nullptr)); - - static int mem[10]; - EXPECT_FALSE(wddm->isReadOnlyMemory(mem)); - - static const int constMem[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - EXPECT_FALSE(wddm->isReadOnlyMemory(constMem)); -} - class MockOsTimeLinux : public NEO::OSTimeLinux { public: MockOsTimeLinux(NEO::OSInterface &osInterface, std::unique_ptr deviceTime) : NEO::OSTimeLinux(osInterface, std::move(deviceTime)) {} diff --git a/shared/test/unit_test/os_interface/windows/wddm_tests.cpp b/shared/test/unit_test/os_interface/windows/wddm_tests.cpp index 3c0b3f79f0..0784b7f4d6 100644 --- a/shared/test/unit_test/os_interface/windows/wddm_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/wddm_tests.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2024 Intel Corporation + * Copyright (C) 2020-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -1000,4 +1000,53 @@ TEST_F(WddmTests, whenInitializeFailureThenInitOsInterfaceWddmFails) { EXPECT_FALSE(rootDeviceEnvironment->initOsInterface(std::move(hwDeviceId), 0u)); } + +TEST_F(WddmTests, givenHostMemoryPassedToCreateAllocationThenAllocationCreatedWithReadOnlyFlagPassed) { + wddm->init(); + setCapturingCreateAllocationFlagsFcn(); + + static const int constMem[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + + D3DKMT_HANDLE handle, resHandle; + GmmRequirements gmmRequirements{}; + Gmm gmm(executionEnvironment->rootDeviceEnvironments[0]->getGmmHelper(), constMem, 10, 0, GMM_RESOURCE_USAGE_OCL_BUFFER, {}, gmmRequirements); + + EXPECT_EQ(STATUS_SUCCESS, wddm->createAllocation(constMem, &gmm, handle, resHandle, nullptr)); + D3DKMT_CREATEALLOCATIONFLAGS createAllocationFlags{}; + uint32_t createAllocation2NumCalled = 0; + getCapturedCreateAllocationFlagsFcn(createAllocationFlags, createAllocation2NumCalled); + EXPECT_TRUE(createAllocationFlags.ReadOnly); + EXPECT_EQ(1u, createAllocation2NumCalled); +} + +TEST_F(WddmTests, givenHostMemoryPassedToCreateAllocationsAndMapGpuVaThenAllocationCreatedWithReadOnlyFlagPassed) { + wddm->init(); + wddm->callBaseMapGpuVa = false; + setCapturingCreateAllocationFlagsFcn(); + + static const int constMem[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + + GmmRequirements gmmRequirements{}; + Gmm gmm(executionEnvironment->rootDeviceEnvironments[0]->getGmmHelper(), constMem, 10, 0, GMM_RESOURCE_USAGE_OCL_BUFFER, {}, gmmRequirements); + + OsHandleStorage handleStorage; + OsHandleWin osHandle; + auto maxOsContextCount = 1u; + ResidencyData residency(maxOsContextCount); + + handleStorage.fragmentCount = 1; + handleStorage.fragmentStorageData[0].cpuPtr = constMem; + handleStorage.fragmentStorageData[0].fragmentSize = 10; + handleStorage.fragmentStorageData[0].freeTheFragment = false; + handleStorage.fragmentStorageData[0].osHandleStorage = &osHandle; + handleStorage.fragmentStorageData[0].residency = &residency; + osHandle.gmm = &gmm; + + EXPECT_EQ(STATUS_SUCCESS, wddm->createAllocationsAndMapGpuVa(handleStorage)); + D3DKMT_CREATEALLOCATIONFLAGS createAllocationFlags{}; + uint32_t createAllocation2NumCalled = 0; + getCapturedCreateAllocationFlagsFcn(createAllocationFlags, createAllocation2NumCalled); + EXPECT_TRUE(createAllocationFlags.ReadOnly); + EXPECT_EQ(1u, createAllocation2NumCalled); +} } // namespace NEO diff --git a/shared/test/unit_test/os_interface/windows/wddm_windows_tests.cpp b/shared/test/unit_test/os_interface/windows/wddm_windows_tests.cpp index e242cd90fa..700e66a5bf 100644 --- a/shared/test/unit_test/os_interface/windows/wddm_windows_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/wddm_windows_tests.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2024 Intel Corporation + * Copyright (C) 2023-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -405,66 +405,3 @@ TEST_F(WddmTestWithMockGdiDll, givenSetThreadPriorityStateEnabledWhenInitWddmThe EXPECT_EQ(1u, SysCalls::setThreadPriorityCalled); EXPECT_EQ(SysCalls::ThreadPriority::AboveNormal, SysCalls::setThreadPriorityLastValue); } - -TEST_F(WddmTestWithMockGdiDll, whenIsReadOnlyMemoryCalledThenCorrectValueReturned) { - EXPECT_FALSE(wddm->isReadOnlyMemory(nullptr)); - - static int mem[10]; - SysCalls::virtualQueryMemoryBasicInformation.Protect = PAGE_READWRITE; - EXPECT_FALSE(wddm->isReadOnlyMemory(mem)); - - static const int constMem[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - SysCalls::virtualQueryMemoryBasicInformation.Protect = PAGE_READONLY; - EXPECT_TRUE(wddm->isReadOnlyMemory(constMem)); -} - -TEST_F(WddmTestWithMockGdiDll, givenReadOnlyHostMemoryPassedToCreateAllocationThenAllocationCreatedWithRetryAndReadOnlyFlagPassed) { - wddm->init(); - setCreateAllocation2ReadOnlyFailConfigFcn(true); - - static const int constMem[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - SysCalls::virtualQueryMemoryBasicInformation.Protect = PAGE_READONLY; - - D3DKMT_HANDLE handle, resHandle; - GmmRequirements gmmRequirements{}; - Gmm gmm(executionEnvironment->rootDeviceEnvironments[0]->getGmmHelper(), constMem, 10, 0, GMM_RESOURCE_USAGE_OCL_BUFFER, {}, gmmRequirements); - - EXPECT_EQ(STATUS_SUCCESS, wddm->createAllocation(constMem, &gmm, handle, resHandle, nullptr)); - bool readOnlyFlagWasPassed = false; - uint32_t createAllocation2NumCalled = 0; - getCreateAllocation2ReadOnlyFailConfigFcn(readOnlyFlagWasPassed, createAllocation2NumCalled); - EXPECT_TRUE(readOnlyFlagWasPassed); - EXPECT_EQ(2u, createAllocation2NumCalled); -} - -TEST_F(WddmTestWithMockGdiDll, givenReadOnlyHostMemoryPassedToCreateAllocationsAndMapGpuVaThenAllocationCreatedWithRetryAndReadOnlyFlagPassed) { - wddm->init(); - wddm->callBaseMapGpuVa = false; - setCreateAllocation2ReadOnlyFailConfigFcn(true); - - static const int constMem[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - SysCalls::virtualQueryMemoryBasicInformation.Protect = PAGE_READONLY; - - GmmRequirements gmmRequirements{}; - Gmm gmm(executionEnvironment->rootDeviceEnvironments[0]->getGmmHelper(), constMem, 10, 0, GMM_RESOURCE_USAGE_OCL_BUFFER, {}, gmmRequirements); - - OsHandleStorage handleStorage; - OsHandleWin osHandle; - auto maxOsContextCount = 1u; - ResidencyData residency(maxOsContextCount); - - handleStorage.fragmentCount = 1; - handleStorage.fragmentStorageData[0].cpuPtr = constMem; - handleStorage.fragmentStorageData[0].fragmentSize = 10; - handleStorage.fragmentStorageData[0].freeTheFragment = false; - handleStorage.fragmentStorageData[0].osHandleStorage = &osHandle; - handleStorage.fragmentStorageData[0].residency = &residency; - osHandle.gmm = &gmm; - - EXPECT_EQ(STATUS_SUCCESS, wddm->createAllocationsAndMapGpuVa(handleStorage)); - bool readOnlyFlagWasPassed = false; - uint32_t createAllocation2NumCalled = 0; - getCreateAllocation2ReadOnlyFailConfigFcn(readOnlyFlagWasPassed, createAllocation2NumCalled); - EXPECT_TRUE(readOnlyFlagWasPassed); - EXPECT_EQ(2u, createAllocation2NumCalled); -} \ No newline at end of file