@@ -117,6 +117,71 @@ TEST_F(KFDEventTest, SignalEvent) {
117117 TEST_END;
118118}
119119
120+ /* test event signaling with event age enabled wait */
121+ TEST_F (KFDEventTest, SignalEventExt) {
122+ TEST_START (TESTPROFILE_RUNALL);
123+
124+ PM4Queue queue;
125+ HsaEvent *tmp_event;
126+ uint64_t event_age;
127+
128+ if (m_VersionInfo.KernelInterfaceMajorVersion == 1 &&
129+ m_VersionInfo.KernelInterfaceMinorVersion < 14 ) {
130+ LOG () << " event age tracking isn't supported in KFD. Exiting." << std::endl;
131+ return ;
132+ }
133+
134+ int defaultGPUNode = m_NodeInfo.HsaDefaultGPUNode ();
135+ ASSERT_GE (defaultGPUNode, 0 ) << " failed to get default GPU Node" ;
136+
137+ ASSERT_SUCCESS (CreateQueueTypeEvent (false , false , defaultGPUNode, &tmp_event));
138+
139+ /* Intentionally let event id for m_pHsaEvent be non zero */
140+ ASSERT_SUCCESS (CreateQueueTypeEvent (false , false , defaultGPUNode, &m_pHsaEvent));
141+ ASSERT_NE (0 , m_pHsaEvent->EventData .HWData2 );
142+
143+ ASSERT_SUCCESS (queue.Create (defaultGPUNode));
144+
145+ /* 1. event_age gets incremented every time when the event signals */
146+ event_age = 1 ;
147+ queue.PlaceAndSubmitPacket (PM4ReleaseMemoryPacket (m_FamilyId, false ,
148+ m_pHsaEvent->EventData .HWData2 , m_pHsaEvent->EventId ));
149+ EXPECT_SUCCESS (hsaKmtWaitOnEvent_Ext (m_pHsaEvent, g_TestTimeOut, &event_age));
150+ ASSERT_EQ (event_age, 2 );
151+ queue.PlaceAndSubmitPacket (PM4ReleaseMemoryPacket (m_FamilyId, false ,
152+ m_pHsaEvent->EventData .HWData2 , m_pHsaEvent->EventId ));
153+ EXPECT_SUCCESS (hsaKmtWaitOnEvent_Ext (m_pHsaEvent, g_TestTimeOut, &event_age));
154+ ASSERT_EQ (event_age, 3 );
155+
156+ /* 2. event wait return without sleep after the event signals */
157+ queue.PlaceAndSubmitPacket (PM4ReleaseMemoryPacket (m_FamilyId, false ,
158+ m_pHsaEvent->EventData .HWData2 , m_pHsaEvent->EventId ));
159+ sleep (1 ); /* wait for event signaling */
160+ EXPECT_SUCCESS (hsaKmtWaitOnEvent_Ext (m_pHsaEvent, g_TestTimeOut, &event_age));
161+ ASSERT_EQ (event_age, 4 );
162+
163+ /* 3. signaling from CPU */
164+ hsaKmtSetEvent (m_pHsaEvent);
165+ EXPECT_SUCCESS (hsaKmtWaitOnEvent_Ext (m_pHsaEvent, g_TestTimeOut, &event_age));
166+ ASSERT_EQ (event_age, 5 );
167+
168+ /* 4. when event_age is 0, hsaKmtWaitOnEvent_Ext always sleeps */
169+ event_age = 0 ;
170+ ASSERT_EQ (HSAKMT_STATUS_WAIT_TIMEOUT, hsaKmtWaitOnEvent_Ext (m_pHsaEvent, g_TestTimeOut, &event_age));
171+
172+ /* 5. when event_age is 0, it always stays 0 after the event signals */
173+ queue.PlaceAndSubmitPacket (PM4ReleaseMemoryPacket (m_FamilyId, false ,
174+ m_pHsaEvent->EventData .HWData2 , m_pHsaEvent->EventId ));
175+ EXPECT_SUCCESS (hsaKmtWaitOnEvent_Ext (m_pHsaEvent, g_TestTimeOut, &event_age));
176+ ASSERT_EQ (event_age, 0 );
177+
178+ EXPECT_SUCCESS (hsaKmtDestroyEvent (tmp_event));
179+
180+ EXPECT_SUCCESS (queue.Destroy ());
181+
182+ TEST_END;
183+ }
184+
120185static uint64_t gettime () {
121186 struct timespec ts;
122187 clock_gettime (CLOCK_MONOTONIC, &ts);
0 commit comments