fix: Eudebug: read one event for each poll in internal event thread

Related-To: NEO-11188
Signed-off-by: Jitendra Sharma <jitendra.sharma@intel.com>
This commit is contained in:
Jitendra Sharma
2024-04-30 15:02:39 +00:00
committed by Compute-Runtime-Automation
parent 74f8eedf1e
commit 06935f87d7
2 changed files with 16 additions and 24 deletions

View File

@@ -139,28 +139,23 @@ void DebugSessionLinuxXe::readInternalEventsAsync() {
ze_result_t result = ZE_RESULT_SUCCESS;
int maxLoopCount = 3;
do {
uint8_t maxEventBuffer[sizeof(drm_xe_eudebug_event) + maxEventSize];
auto event = reinterpret_cast<drm_xe_eudebug_event *>(maxEventBuffer);
event->len = maxEventSize;
event->type = DRM_XE_EUDEBUG_EVENT_READ;
event->flags = 0;
uint8_t maxEventBuffer[sizeof(drm_xe_eudebug_event) + maxEventSize];
auto event = reinterpret_cast<drm_xe_eudebug_event *>(maxEventBuffer);
event->len = maxEventSize;
event->type = DRM_XE_EUDEBUG_EVENT_READ;
event->flags = 0;
result = readEventImp(event);
result = readEventImp(event);
maxLoopCount--;
if (result == ZE_RESULT_SUCCESS) {
std::lock_guard<std::mutex> lock(internalEventThreadMutex);
if (result == ZE_RESULT_SUCCESS) {
std::lock_guard<std::mutex> lock(internalEventThreadMutex);
auto memory = std::make_unique<uint64_t[]>(maxEventSize / sizeof(uint64_t));
memcpy(memory.get(), event, maxEventSize);
auto memory = std::make_unique<uint64_t[]>(maxEventSize / sizeof(uint64_t));
memcpy(memory.get(), event, maxEventSize);
internalEventQueue.push(std::move(memory));
internalEventCondition.notify_one();
}
} while (result == ZE_RESULT_SUCCESS && maxLoopCount > 0);
internalEventQueue.push(std::move(memory));
internalEventCondition.notify_one();
}
}
}

View File

@@ -363,7 +363,6 @@ TEST_F(DebugApiLinuxTestXe, GivenPollReturnsNonZeroWhenReadingInternalEventsAsyn
handler->pollRetVal = 1;
session->ioctlHandler.reset(handler);
session->clientHandle = MockDebugSessionLinuxXe::mockClientHandle;
// session->synchronousInternalEventRead = true;
uint64_t clientHandle = 2;
drm_xe_eudebug_event_client client = {};
@@ -375,16 +374,14 @@ TEST_F(DebugApiLinuxTestXe, GivenPollReturnsNonZeroWhenReadingInternalEventsAsyn
handler->eventQueue.push({reinterpret_cast<char *>(&client), static_cast<uint64_t>(client.base.len)});
session->readInternalEventsAsync();
constexpr int clientEventCount = 1;
constexpr int dummyReadEventCount = 1;
EXPECT_EQ(clientEventCount + dummyReadEventCount, handler->ioctlCalled);
EXPECT_EQ(dummyReadEventCount, handler->ioctlCalled);
EXPECT_EQ(DebugSessionLinuxXe::maxEventSize, handler->debugEventInput.len);
EXPECT_EQ(static_cast<decltype(drm_xe_eudebug_event::type)>(DRM_XE_EUDEBUG_EVENT_READ), handler->debugEventInput.type);
}
TEST_F(DebugApiLinuxTestXe, GivenMoreThan3EventsInQueueThenInternalEventsOnlyReads3) {
TEST_F(DebugApiLinuxTestXe, GivenMoreThan1EventsInQueueThenInternalEventsOnlyReads1) {
zet_debug_config_t config = {};
config.pid = 0x1234;
@@ -411,7 +408,7 @@ TEST_F(DebugApiLinuxTestXe, GivenMoreThan3EventsInQueueThenInternalEventsOnlyRea
session->readInternalEventsAsync();
EXPECT_EQ(3, handler->ioctlCalled);
EXPECT_EQ(1, handler->ioctlCalled);
EXPECT_EQ(DebugSessionLinuxXe::maxEventSize, handler->debugEventInput.len);
EXPECT_EQ(static_cast<decltype(drm_xe_eudebug_event::type)>(DRM_XE_EUDEBUG_EVENT_READ), handler->debugEventInput.type);
}