66 */
77
88#include " shared/test/common/helpers/debug_manager_state_restore.h"
9+ #include " shared/test/common/helpers/variable_backup.h"
910#include " shared/test/common/mocks/mock_compilers.h"
1011#include " shared/test/common/mocks/mock_csr.h"
1112#include " shared/test/common/mocks/mock_memory_manager.h"
2930using namespace std ::chrono_literals;
3031
3132namespace CpuIntrinsicsTests {
32- extern std::atomic<uintptr_t > lastClFlushedPtr;
33- extern std::atomic<uint32_t > clFlushCounter;
33+ extern std::atomic<uint32_t > pauseCounter;
34+ extern volatile uint32_t *pauseAddress;
35+ extern uint32_t pauseValue;
36+ extern uint32_t pauseOffset;
37+ extern std::function<void ()> setupPauseAddress;
3438} // namespace CpuIntrinsicsTests
3539
3640namespace L0 {
@@ -627,8 +631,8 @@ TEST_F(EventSynchronizeTest, GivenGpuHangWhenHostSynchronizeIsCalledThenDeviceLo
627631 event->csr = csr.get ();
628632 event->gpuHangCheckPeriod = 0ms;
629633
630- const auto timeout = std::numeric_limits<std::uint32_t >::max ();
631- const auto result = event->hostSynchronize (timeout);
634+ constexpr uint64_t timeout = std::numeric_limits<std::uint64_t >::max ();
635+ auto result = event->hostSynchronize (timeout);
632636
633637 EXPECT_EQ (ZE_RESULT_ERROR_DEVICE_LOST, result);
634638}
@@ -640,8 +644,8 @@ TEST_F(EventSynchronizeTest, GivenNoGpuHangAndOneNanosecondTimeoutWhenHostSynchr
640644 event->csr = csr.get ();
641645 event->gpuHangCheckPeriod = 0ms;
642646
643- const auto timeoutNanoseconds = 1 ;
644- const auto result = event->hostSynchronize (timeoutNanoseconds);
647+ constexpr uint64_t timeoutNanoseconds = 1 ;
648+ auto result = event->hostSynchronize (timeoutNanoseconds);
645649
646650 EXPECT_EQ (ZE_RESULT_NOT_READY, result);
647651}
@@ -651,8 +655,8 @@ TEST_F(EventSynchronizeTest, GivenLongPeriodOfGpuCheckAndOneNanosecondTimeoutWhe
651655 event->csr = csr.get ();
652656 event->gpuHangCheckPeriod = 50000000ms;
653657
654- const auto timeoutNanoseconds = 1 ;
655- const auto result = event->hostSynchronize (timeoutNanoseconds);
658+ constexpr uint64_t timeoutNanoseconds = 1 ;
659+ auto result = event->hostSynchronize (timeoutNanoseconds);
656660
657661 EXPECT_EQ (ZE_RESULT_NOT_READY, result);
658662}
@@ -668,19 +672,90 @@ TEST_F(EventSynchronizeTest, givenCallToEventHostSynchronizeWithNonZeroTimeoutAn
668672}
669673
670674TEST_F (EventSynchronizeTest, givenCallToEventHostSynchronizeWithTimeoutZeroAndStateSignaledHostSynchronizeReturnsSuccess) {
671- uint64_t *hostAddr = static_cast <uint64_t *>(event->getHostAddress ());
675+ uint32_t *hostAddr = static_cast <uint32_t *>(event->getHostAddress ());
672676 *hostAddr = Event::STATE_SIGNALED;
673677 ze_result_t result = event->hostSynchronize (0 );
674678 EXPECT_EQ (ZE_RESULT_SUCCESS, result);
675679}
676680
677681TEST_F (EventSynchronizeTest, givenCallToEventHostSynchronizeWithTimeoutNonZeroAndStateSignaledHostSynchronizeReturnsSuccess) {
678- uint64_t *hostAddr = static_cast <uint64_t *>(event->getHostAddress ());
682+ uint32_t *hostAddr = static_cast <uint32_t *>(event->getHostAddress ());
679683 *hostAddr = Event::STATE_SIGNALED;
680684 ze_result_t result = event->hostSynchronize (10 );
681685 EXPECT_EQ (ZE_RESULT_SUCCESS, result);
682686}
683687
688+ TEST_F (EventSynchronizeTest, givenInfiniteTimeoutWhenWaitingForNonTimestampEventCompletionThenReturnOnlyAfterAllEventPacketsAreCompleted) {
689+ constexpr uint32_t packetsInUse = 2 ;
690+ event->setPacketsInUse (packetsInUse);
691+
692+ const size_t eventPacketSize = event->getSinglePacketSize ();
693+ const size_t eventCompletionOffset = event->getContextStartOffset ();
694+
695+ VariableBackup<volatile uint32_t *> backupPauseAddress (&CpuIntrinsicsTests::pauseAddress);
696+ VariableBackup<uint32_t > backupPauseValue (&CpuIntrinsicsTests::pauseValue, Event::STATE_CLEARED);
697+ VariableBackup<uint32_t > backupPauseOffset (&CpuIntrinsicsTests::pauseOffset);
698+ VariableBackup<std::function<void ()>> backupSetupPauseAddress (&CpuIntrinsicsTests::setupPauseAddress);
699+ CpuIntrinsicsTests::pauseCounter = 0u ;
700+ CpuIntrinsicsTests::pauseAddress = static_cast <uint32_t *>(ptrOffset (event->getHostAddress (), eventCompletionOffset));
701+
702+ uint32_t *hostAddr = static_cast <uint32_t *>(ptrOffset (event->getHostAddress (), eventCompletionOffset));
703+ for (uint32_t i = 0 ; i < packetsInUse; i++) {
704+ *hostAddr = Event::STATE_CLEARED;
705+ hostAddr = ptrOffset (hostAddr, eventPacketSize);
706+ }
707+
708+ CpuIntrinsicsTests::setupPauseAddress = [&]() {
709+ if (CpuIntrinsicsTests::pauseCounter > 10 ) {
710+ volatile uint32_t *nextPacket = CpuIntrinsicsTests::pauseAddress;
711+ for (uint32_t i = 0 ; i < packetsInUse; i++) {
712+ *nextPacket = Event::STATE_SIGNALED;
713+ nextPacket = ptrOffset (nextPacket, eventPacketSize);
714+ }
715+ }
716+ };
717+
718+ constexpr uint64_t infiniteTimeout = std::numeric_limits<std::uint64_t >::max ();
719+ ze_result_t result = event->hostSynchronize (infiniteTimeout);
720+ EXPECT_EQ (ZE_RESULT_SUCCESS, result);
721+ }
722+
723+ TEST_F (EventSynchronizeTest, givenInfiniteTimeoutWhenWaitingForTimestampEventCompletionThenReturnOnlyAfterAllEventPacketsAreCompleted) {
724+ constexpr uint32_t packetsInUse = 2 ;
725+ event->setPacketsInUse (packetsInUse);
726+ event->setEventTimestampFlag (true );
727+
728+ const size_t eventPacketSize = event->getSinglePacketSize ();
729+ const size_t eventCompletionOffset = event->getContextEndOffset ();
730+
731+ VariableBackup<volatile uint32_t *> backupPauseAddress (&CpuIntrinsicsTests::pauseAddress);
732+ VariableBackup<uint32_t > backupPauseValue (&CpuIntrinsicsTests::pauseValue, Event::STATE_CLEARED);
733+ VariableBackup<uint32_t > backupPauseOffset (&CpuIntrinsicsTests::pauseOffset);
734+ VariableBackup<std::function<void ()>> backupSetupPauseAddress (&CpuIntrinsicsTests::setupPauseAddress);
735+ CpuIntrinsicsTests::pauseCounter = 0u ;
736+ CpuIntrinsicsTests::pauseAddress = static_cast <uint32_t *>(ptrOffset (event->getHostAddress (), eventCompletionOffset));
737+
738+ uint32_t *hostAddr = static_cast <uint32_t *>(ptrOffset (event->getHostAddress (), eventCompletionOffset));
739+ for (uint32_t i = 0 ; i < packetsInUse; i++) {
740+ *hostAddr = Event::STATE_CLEARED;
741+ hostAddr = ptrOffset (hostAddr, eventPacketSize);
742+ }
743+
744+ CpuIntrinsicsTests::setupPauseAddress = [&]() {
745+ if (CpuIntrinsicsTests::pauseCounter > 10 ) {
746+ volatile uint32_t *nextPacket = CpuIntrinsicsTests::pauseAddress;
747+ for (uint32_t i = 0 ; i < packetsInUse; i++) {
748+ *nextPacket = Event::STATE_SIGNALED;
749+ nextPacket = ptrOffset (nextPacket, eventPacketSize);
750+ }
751+ }
752+ };
753+
754+ constexpr uint64_t infiniteTimeout = std::numeric_limits<std::uint64_t >::max ();
755+ ze_result_t result = event->hostSynchronize (infiniteTimeout);
756+ EXPECT_EQ (ZE_RESULT_SUCCESS, result);
757+ }
758+
684759using EventPoolIPCEventResetTests = Test<DeviceFixture>;
685760
686761TEST_F (EventPoolIPCEventResetTests, whenOpeningIpcHandleForEventPoolCreateWithIpcFlagThenEventsInNewPoolAreNotReset) {
0 commit comments