Skip to content

Commit 1b513b5

Browse files
Add utility to print ioctl times
Signed-off-by: Lukasz Jobczyk <[email protected]>
1 parent 62d52ba commit 1b513b5

File tree

5 files changed

+129
-0
lines changed

5 files changed

+129
-0
lines changed

opencl/test/unit_test/linux/main_linux_dll.cpp

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
160245
TEST(DrmTest, GivenSelectedNonExistingDeviceWhenOpenDirFailsThenRetryOpeningRenderDevicesAndNoDevicesAreCreated) {
161246
VariableBackup<decltype(openFull)> backupOpenFull(&openFull);
162247
VariableBackup<decltype(failOnOpenDir)> backupOpenDir(&failOnOpenDir, true);

opencl/test/unit_test/test_files/igdrcl.config

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ EnableHostPointerImport = -1
219219
EnableHostUsmSupport = -1
220220
ForceBtpPrefetchMode = -1
221221
OverrideProfilingTimerResolution = -1
222+
PrintIoctlTimes = 0
222223
UpdateTaskCountFromWait = -1
223224
PreferCopyEngineForCopyBufferToBuffer = -1
224225
EnableStaticPartitioning = -1

shared/source/debug_settings/debug_variables_base.inl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ DECLARE_DEBUG_VARIABLE(bool, PrintBOBindingResult, false, "tracks the result of
128128
DECLARE_DEBUG_VARIABLE(bool, PrintTagAllocationAddress, false, "Print tag allocation address for each engine")
129129
DECLARE_DEBUG_VARIABLE(bool, ProvideVerboseImplicitFlush, false, "provides verbose messages about implicit flush mechanism")
130130
DECLARE_DEBUG_VARIABLE(bool, PrintBlitDispatchDetails, false, "Print blit dispatch details")
131+
DECLARE_DEBUG_VARIABLE(bool, PrintIoctlTimes, false, "Print ioctl times")
131132

132133
/*PERFORMANCE FLAGS*/
133134
DECLARE_DEBUG_VARIABLE(bool, DisableZeroCopyForBuffers, false, "When active all buffer allocations will not share memory with CPU.")

shared/source/os_interface/linux/drm_neo.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,31 @@ int Drm::ioctl(unsigned long request, void *arg) {
6969
int ret;
7070
SYSTEM_ENTER();
7171
do {
72+
auto measureTime = DebugManager.flags.PrintIoctlTimes.get();
73+
std::chrono::steady_clock::time_point start;
74+
std::chrono::steady_clock::time_point end;
75+
76+
if (measureTime) {
77+
start = std::chrono::steady_clock::now();
78+
}
79+
7280
ret = SysCalls::ioctl(getFileDescriptor(), request, arg);
81+
82+
if (measureTime) {
83+
end = std::chrono::steady_clock::now();
84+
auto elapsedTime = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
85+
86+
std::pair<long long, uint64_t> ioctlData{};
87+
auto ioctlDataIt = this->ioctlStatistics.find(request);
88+
if (ioctlDataIt != this->ioctlStatistics.end()) {
89+
ioctlData = ioctlDataIt->second;
90+
}
91+
92+
ioctlData.first += elapsedTime;
93+
ioctlData.second++;
94+
95+
this->ioctlStatistics[request] = ioctlData;
96+
}
7397
} while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EBUSY));
7498
SYSTEM_LEAVE(request);
7599
return ret;
@@ -442,6 +466,19 @@ std::unique_ptr<uint8_t[]> Drm::query(uint32_t queryId, uint32_t queryItemFlags,
442466
return data;
443467
}
444468

469+
void Drm::printIoctlStatistics() {
470+
if (!DebugManager.flags.PrintIoctlTimes.get()) {
471+
return;
472+
}
473+
474+
printf("\n --- Ioctls statistics ---\n");
475+
printf(" Request Total time(ns) Count Avg time per ioctl\n");
476+
for (const auto &ioctlData : this->ioctlStatistics) {
477+
printf("%15lu %15llu %10lu %20f\n", ioctlData.first, ioctlData.second.first, ioctlData.second.second, ioctlData.second.first / static_cast<double>(ioctlData.second.second));
478+
}
479+
printf("\n");
480+
}
481+
445482
bool Drm::createVirtualMemoryAddressSpace(uint32_t vmCount) {
446483
for (auto i = 0u; i < vmCount; i++) {
447484
uint32_t id = i;
@@ -501,6 +538,7 @@ bool Drm::translateTopologyInfo(const drm_i915_query_topology_info *queryTopolog
501538

502539
Drm::~Drm() {
503540
destroyVirtualMemoryAddressSpace();
541+
this->printIoctlStatistics();
504542
}
505543

506544
} // namespace NEO

shared/source/os_interface/linux/drm_neo.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <string>
2828
#include <sys/ioctl.h>
2929
#include <unistd.h>
30+
#include <unordered_map>
3031
#include <vector>
3132

3233
struct GT_SYSTEM_INFO;
@@ -214,6 +215,9 @@ class Drm {
214215

215216
StackVec<uint32_t, size_t(ResourceClass::MaxSize)> classHandles;
216217

218+
std::unordered_map<unsigned long, std::pair<long long, uint64_t>> ioctlStatistics;
219+
void printIoctlStatistics();
220+
217221
#pragma pack(1)
218222
struct PCIConfig {
219223
uint16_t VendorID;

0 commit comments

Comments
 (0)