diff --git a/runtime/command_queue/enqueue_svm.h b/runtime/command_queue/enqueue_svm.h index d3953200e6..2d645d5032 100644 --- a/runtime/command_queue/enqueue_svm.h +++ b/runtime/command_queue/enqueue_svm.h @@ -136,7 +136,7 @@ cl_int CommandQueueHw::enqueueSVMMap(cl_bool blockingMap, if (event) { castToObjectOrAbort(*event)->setCmdType(CL_COMMAND_SVM_MAP); } - bool readOnlyMap = !isValueSet(mapFlags, CL_MAP_WRITE) && !isValueSet(mapFlags, CL_MAP_WRITE_INVALIDATE_REGION); + bool readOnlyMap = isValueSet(mapFlags, CL_MAP_READ); context->getSVMAllocsManager()->insertSvmMapOperation(svmPtr, size, svmBasePtr, svmOffset, readOnlyMap); return CL_SUCCESS; diff --git a/unit_tests/command_queue/enqueue_svm_tests.cpp b/unit_tests/command_queue/enqueue_svm_tests.cpp index c2431e145d..5b63125351 100644 --- a/unit_tests/command_queue/enqueue_svm_tests.cpp +++ b/unit_tests/command_queue/enqueue_svm_tests.cpp @@ -810,6 +810,60 @@ HWTEST_F(EnqueueSvmTestLocalMemory, givenWriteInvalidateRegionFlagWhenMappingSvm EXPECT_FALSE(svmMap->readOnlyMap); } +HWTEST_F(EnqueueSvmTestLocalMemory, givenMapWriteFlagWhenMappingSvmThenMapIsSuccessfulAndReadOnlyFlagIsFalse) { + MockCommandQueueHw queue(context.get(), pDevice, nullptr); + uintptr_t offset = 64; + void *regionSvmPtr = ptrOffset(svmPtr, offset); + size_t regionSize = 64; + retVal = queue.enqueueSVMMap( + CL_TRUE, + CL_MAP_WRITE, + regionSvmPtr, + regionSize, + 0, + nullptr, + nullptr); + EXPECT_EQ(CL_SUCCESS, retVal); + auto svmMap = mockSvmManager->svmMapOperations.get(regionSvmPtr); + EXPECT_FALSE(svmMap->readOnlyMap); +} + +HWTEST_F(EnqueueSvmTestLocalMemory, givenMapReadFlagWhenMappingSvmThenMapIsSuccessfulAndReadOnlyFlagIsTrue) { + MockCommandQueueHw queue(context.get(), pDevice, nullptr); + uintptr_t offset = 64; + void *regionSvmPtr = ptrOffset(svmPtr, offset); + size_t regionSize = 64; + retVal = queue.enqueueSVMMap( + CL_TRUE, + CL_MAP_READ, + regionSvmPtr, + regionSize, + 0, + nullptr, + nullptr); + EXPECT_EQ(CL_SUCCESS, retVal); + auto svmMap = mockSvmManager->svmMapOperations.get(regionSvmPtr); + EXPECT_TRUE(svmMap->readOnlyMap); +} + +HWTEST_F(EnqueueSvmTestLocalMemory, givenSvmAllocWithoutFlagsWhenMappingSvmThenMapIsSuccessfulAndReadOnlyFlagIsTrue) { + MockCommandQueueHw queue(context.get(), pDevice, nullptr); + uintptr_t offset = 64; + void *regionSvmPtr = ptrOffset(svmPtr, offset); + size_t regionSize = 64; + retVal = queue.enqueueSVMMap( + CL_TRUE, + 0, + regionSvmPtr, + regionSize, + 0, + nullptr, + nullptr); + EXPECT_EQ(CL_SUCCESS, retVal); + auto svmMap = mockSvmManager->svmMapOperations.get(regionSvmPtr); + EXPECT_FALSE(svmMap->readOnlyMap); +} + HWTEST_F(EnqueueSvmTestLocalMemory, givenEnabledLocalMemoryWhenEnqeueMapValidSvmPtrThenExpectSingleWalker) { using WALKER_TYPE = typename FamilyType::WALKER_TYPE; MockCommandQueueHw queue(context.get(), pDevice, nullptr);