6
6
*/
7
7
8
8
#include " shared/test/common/helpers/debug_manager_state_restore.h"
9
+ #include " shared/test/common/helpers/variable_backup.h"
9
10
#include " shared/test/common/mocks/mock_compilers.h"
10
11
#include " shared/test/common/mocks/mock_csr.h"
11
12
#include " shared/test/common/mocks/mock_memory_manager.h"
29
30
using namespace std ::chrono_literals;
30
31
31
32
namespace 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;
34
38
} // namespace CpuIntrinsicsTests
35
39
36
40
namespace L0 {
@@ -627,8 +631,8 @@ TEST_F(EventSynchronizeTest, GivenGpuHangWhenHostSynchronizeIsCalledThenDeviceLo
627
631
event->csr = csr.get ();
628
632
event->gpuHangCheckPeriod = 0ms;
629
633
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);
632
636
633
637
EXPECT_EQ (ZE_RESULT_ERROR_DEVICE_LOST, result);
634
638
}
@@ -640,8 +644,8 @@ TEST_F(EventSynchronizeTest, GivenNoGpuHangAndOneNanosecondTimeoutWhenHostSynchr
640
644
event->csr = csr.get ();
641
645
event->gpuHangCheckPeriod = 0ms;
642
646
643
- const auto timeoutNanoseconds = 1 ;
644
- const auto result = event->hostSynchronize (timeoutNanoseconds);
647
+ constexpr uint64_t timeoutNanoseconds = 1 ;
648
+ auto result = event->hostSynchronize (timeoutNanoseconds);
645
649
646
650
EXPECT_EQ (ZE_RESULT_NOT_READY, result);
647
651
}
@@ -651,8 +655,8 @@ TEST_F(EventSynchronizeTest, GivenLongPeriodOfGpuCheckAndOneNanosecondTimeoutWhe
651
655
event->csr = csr.get ();
652
656
event->gpuHangCheckPeriod = 50000000ms;
653
657
654
- const auto timeoutNanoseconds = 1 ;
655
- const auto result = event->hostSynchronize (timeoutNanoseconds);
658
+ constexpr uint64_t timeoutNanoseconds = 1 ;
659
+ auto result = event->hostSynchronize (timeoutNanoseconds);
656
660
657
661
EXPECT_EQ (ZE_RESULT_NOT_READY, result);
658
662
}
@@ -668,19 +672,90 @@ TEST_F(EventSynchronizeTest, givenCallToEventHostSynchronizeWithNonZeroTimeoutAn
668
672
}
669
673
670
674
TEST_F (EventSynchronizeTest, givenCallToEventHostSynchronizeWithTimeoutZeroAndStateSignaledHostSynchronizeReturnsSuccess) {
671
- uint64_t *hostAddr = static_cast <uint64_t *>(event->getHostAddress ());
675
+ uint32_t *hostAddr = static_cast <uint32_t *>(event->getHostAddress ());
672
676
*hostAddr = Event::STATE_SIGNALED;
673
677
ze_result_t result = event->hostSynchronize (0 );
674
678
EXPECT_EQ (ZE_RESULT_SUCCESS, result);
675
679
}
676
680
677
681
TEST_F (EventSynchronizeTest, givenCallToEventHostSynchronizeWithTimeoutNonZeroAndStateSignaledHostSynchronizeReturnsSuccess) {
678
- uint64_t *hostAddr = static_cast <uint64_t *>(event->getHostAddress ());
682
+ uint32_t *hostAddr = static_cast <uint32_t *>(event->getHostAddress ());
679
683
*hostAddr = Event::STATE_SIGNALED;
680
684
ze_result_t result = event->hostSynchronize (10 );
681
685
EXPECT_EQ (ZE_RESULT_SUCCESS, result);
682
686
}
683
687
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
+
684
759
using EventPoolIPCEventResetTests = Test<DeviceFixture>;
685
760
686
761
TEST_F (EventPoolIPCEventResetTests, whenOpeningIpcHandleForEventPoolCreateWithIpcFlagThenEventsInNewPoolAreNotReset) {
0 commit comments