@@ -157,6 +157,91 @@ TEST(DrmTest, GivenSelectedExistingDeviceWhenOpenDirFailsThenRetryOpeningRenderD
157157 EXPECT_STREQ (" 00:03.0" , hwDeviceIds[1 ]->getPciPath ());
158158}
159159
160+ TEST (DrmTest, givenPrintIoctlTimesWhenCallIoctlThenStatisticsAreGathered) {
161+ struct DrmMock : public Drm {
162+ using Drm::ioctlStatistics;
163+ };
164+ ::testing::internal::CaptureStdout ();
165+
166+ auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
167+ executionEnvironment->prepareRootDeviceEnvironments (1 );
168+ auto drm = static_cast <DrmMock *>(DrmWrap::createDrm (*executionEnvironment->rootDeviceEnvironments [0 ]).release ());
169+
170+ DebugManagerStateRestore restorer;
171+ DebugManager.flags .PrintIoctlTimes .set (true );
172+
173+ EXPECT_TRUE (drm->ioctlStatistics .empty ());
174+
175+ int euTotal = 0u ;
176+ uint32_t contextId = 1u ;
177+
178+ drm->getEuTotal (euTotal);
179+ EXPECT_EQ (drm->ioctlStatistics .size (), 1u );
180+
181+ drm->getEuTotal (euTotal);
182+ EXPECT_EQ (drm->ioctlStatistics .size (), 1u );
183+
184+ drm->setLowPriorityContextParam (contextId);
185+ EXPECT_EQ (drm->ioctlStatistics .size (), 2u );
186+
187+ auto euTotalData = drm->ioctlStatistics .find (DRM_IOCTL_I915_GETPARAM);
188+ ASSERT_TRUE (euTotalData != drm->ioctlStatistics .end ());
189+ EXPECT_EQ (euTotalData->first , static_cast <unsigned long >(DRM_IOCTL_I915_GETPARAM));
190+ EXPECT_EQ (euTotalData->second .second , 2u );
191+ EXPECT_NE (euTotalData->second .first , 0 );
192+ auto firstTime = euTotalData->second .first ;
193+
194+ auto lowPriorityData = drm->ioctlStatistics .find (DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM);
195+ ASSERT_TRUE (lowPriorityData != drm->ioctlStatistics .end ());
196+ EXPECT_EQ (lowPriorityData->first , static_cast <unsigned long >(DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM));
197+ EXPECT_EQ (lowPriorityData->second .second , 1u );
198+ EXPECT_NE (lowPriorityData->second .first , 0 );
199+
200+ drm->getEuTotal (euTotal);
201+ EXPECT_EQ (drm->ioctlStatistics .size (), 2u );
202+
203+ euTotalData = drm->ioctlStatistics .find (DRM_IOCTL_I915_GETPARAM);
204+ ASSERT_TRUE (euTotalData != drm->ioctlStatistics .end ());
205+ EXPECT_EQ (euTotalData->first , static_cast <unsigned long >(DRM_IOCTL_I915_GETPARAM));
206+ EXPECT_EQ (euTotalData->second .second , 3u );
207+ EXPECT_NE (euTotalData->second .first , 0 );
208+
209+ auto secondTime = euTotalData->second .first ;
210+ EXPECT_GT (secondTime, firstTime);
211+
212+ lowPriorityData = drm->ioctlStatistics .find (DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM);
213+ ASSERT_TRUE (lowPriorityData != drm->ioctlStatistics .end ());
214+ EXPECT_EQ (lowPriorityData->first , static_cast <unsigned long >(DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM));
215+ EXPECT_EQ (lowPriorityData->second .second , 1u );
216+ EXPECT_NE (lowPriorityData->second .first , 0 );
217+
218+ drm->destroyDrmContext (contextId);
219+ EXPECT_EQ (drm->ioctlStatistics .size (), 3u );
220+
221+ euTotalData = drm->ioctlStatistics .find (DRM_IOCTL_I915_GETPARAM);
222+ ASSERT_TRUE (euTotalData != drm->ioctlStatistics .end ());
223+ EXPECT_EQ (euTotalData->first , static_cast <unsigned long >(DRM_IOCTL_I915_GETPARAM));
224+ EXPECT_EQ (euTotalData->second .second , 3u );
225+ EXPECT_NE (euTotalData->second .first , 0 );
226+
227+ lowPriorityData = drm->ioctlStatistics .find (DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM);
228+ ASSERT_TRUE (lowPriorityData != drm->ioctlStatistics .end ());
229+ EXPECT_EQ (lowPriorityData->first , static_cast <unsigned long >(DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM));
230+ EXPECT_EQ (lowPriorityData->second .second , 1u );
231+ EXPECT_NE (lowPriorityData->second .first , 0 );
232+
233+ auto destroyData = drm->ioctlStatistics .find (DRM_IOCTL_I915_GEM_CONTEXT_DESTROY);
234+ ASSERT_TRUE (destroyData != drm->ioctlStatistics .end ());
235+ EXPECT_EQ (destroyData->first , static_cast <unsigned long >(DRM_IOCTL_I915_GEM_CONTEXT_DESTROY));
236+ EXPECT_EQ (destroyData->second .second , 1u );
237+ EXPECT_NE (destroyData->second .first , 0 );
238+
239+ delete drm;
240+
241+ std::string output = ::testing::internal::GetCapturedStdout ();
242+ EXPECT_STRNE (output.c_str (), " " );
243+ }
244+
160245TEST (DrmTest, GivenSelectedNonExistingDeviceWhenOpenDirFailsThenRetryOpeningRenderDevicesAndNoDevicesAreCreated) {
161246 VariableBackup<decltype (openFull)> backupOpenFull (&openFull);
162247 VariableBackup<decltype (failOnOpenDir)> backupOpenDir (&failOnOpenDir, true );
0 commit comments