From 514b191bb61bd112eaf54aa2240ee7a729e61021 Mon Sep 17 00:00:00 2001 From: Jitendra Sharma Date: Thu, 19 Nov 2020 09:53:32 +0530 Subject: [PATCH] Add support for sysman event ZES_EVENT_TYPE_FLAG_MEM_HEALTH Signed-off-by: Jitendra Sharma --- .../source/sysman/events/linux/CMakeLists.txt | 4 ++-- .../sysman/events/linux/os_events_imp.cpp | 24 +++++++++++++++++-- .../sysman/events/linux/os_events_imp.h | 5 +++- .../sysman/events/linux/CMakeLists.txt | 4 ++-- .../sources/sysman/events/linux/mock_events.h | 3 ++- .../sysman/events/linux/test_zes_events.cpp | 23 ++++++++++++++++++ 6 files changed, 55 insertions(+), 8 deletions(-) diff --git a/level_zero/tools/source/sysman/events/linux/CMakeLists.txt b/level_zero/tools/source/sysman/events/linux/CMakeLists.txt index 4fa265eabc..90c5607446 100644 --- a/level_zero/tools/source/sysman/events/linux/CMakeLists.txt +++ b/level_zero/tools/source/sysman/events/linux/CMakeLists.txt @@ -6,8 +6,8 @@ set(L0_SRCS_TOOLS_SYSMAN_EVENTS_LINUX ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt - ${CMAKE_CURRENT_SOURCE_DIR}/os_events_imp.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/os_events_imp.h + ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/os_events_imp.cpp + ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/os_events_imp.h ) if(UNIX) diff --git a/level_zero/tools/source/sysman/events/linux/os_events_imp.cpp b/level_zero/tools/source/sysman/events/linux/os_events_imp.cpp index 12485fabb7..842291e4cc 100644 --- a/level_zero/tools/source/sysman/events/linux/os_events_imp.cpp +++ b/level_zero/tools/source/sysman/events/linux/os_events_imp.cpp @@ -64,6 +64,14 @@ bool LinuxEventsImp::checkDeviceAttachEvent(zes_event_type_flags_t &pEvent) { return false; } +bool LinuxEventsImp::checkIfMemHealthChanged(zes_event_type_flags_t &pEvent) { + if (currentMemHealth() != memHealthAtEventRegister) { + pEvent = ZES_EVENT_TYPE_FLAG_MEM_HEALTH; + return true; + } + return false; +} + bool LinuxEventsImp::eventListen(zes_event_type_flags_t &pEvent, uint32_t timeout) { if (registeredEvents & ZES_EVENT_TYPE_FLAG_DEVICE_RESET_REQUIRED) { if (isResetRequired(pEvent)) { @@ -80,15 +88,27 @@ bool LinuxEventsImp::eventListen(zes_event_type_flags_t &pEvent, uint32_t timeou return true; } } + if (registeredEvents & ZES_EVENT_TYPE_FLAG_MEM_HEALTH) { + if (checkIfMemHealthChanged(pEvent)) { + return true; + } + } return false; } ze_result_t LinuxEventsImp::eventRegister(zes_event_type_flags_t events) { registeredEvents = events; + if (registeredEvents & ZES_EVENT_TYPE_FLAG_MEM_HEALTH) { + memHealthAtEventRegister = currentMemHealth(); + } return ZE_RESULT_SUCCESS; } -void LinuxEventsImp::init() { +zes_mem_health_t LinuxEventsImp::currentMemHealth() { + return ZES_MEM_HEALTH_UNKNOWN; +} + +void LinuxEventsImp::getPciIdPathTag() { std::string bdfDir; ze_result_t result = pSysfsAccess->readSymLink("device", bdfDir); if (ZE_RESULT_SUCCESS != result) { @@ -108,7 +128,7 @@ LinuxEventsImp::LinuxEventsImp(OsSysman *pOsSysman) { pLinuxSysmanImp = static_cast(pOsSysman); pSysfsAccess = &pLinuxSysmanImp->getSysfsAccess(); pFsAccess = &pLinuxSysmanImp->getFsAccess(); - init(); + getPciIdPathTag(); } OsEvents *OsEvents::create(OsSysman *pOsSysman) { diff --git a/level_zero/tools/source/sysman/events/linux/os_events_imp.h b/level_zero/tools/source/sysman/events/linux/os_events_imp.h index a3f815576a..bf5a5f100f 100644 --- a/level_zero/tools/source/sysman/events/linux/os_events_imp.h +++ b/level_zero/tools/source/sysman/events/linux/os_events_imp.h @@ -21,11 +21,14 @@ class LinuxEventsImp : public OsEvents, NEO::NonCopyableOrMovableClass { protected: LinuxSysmanImp *pLinuxSysmanImp = nullptr; - void init(); + void getPciIdPathTag(); + zes_mem_health_t currentMemHealth(); bool isResetRequired(zes_event_type_flags_t &pEvent); bool checkDeviceDetachEvent(zes_event_type_flags_t &pEvent); bool checkDeviceAttachEvent(zes_event_type_flags_t &pEvent); + bool checkIfMemHealthChanged(zes_event_type_flags_t &pEvent); std::string pciIdPathTag; + zes_mem_health_t memHealthAtEventRegister = ZES_MEM_HEALTH_UNKNOWN; private: FsAccess *pFsAccess = nullptr; diff --git a/level_zero/tools/test/unit_tests/sources/sysman/events/linux/CMakeLists.txt b/level_zero/tools/test/unit_tests/sources/sysman/events/linux/CMakeLists.txt index 0cb8cdcd82..ea40aedf6e 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/events/linux/CMakeLists.txt +++ b/level_zero/tools/test/unit_tests/sources/sysman/events/linux/CMakeLists.txt @@ -8,7 +8,7 @@ if(UNIX) target_sources(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt - ${CMAKE_CURRENT_SOURCE_DIR}/test_zes_events.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/mock_events.h + ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/test_zes_events.cpp + ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/mock_events.h ) endif() diff --git a/level_zero/tools/test/unit_tests/sources/sysman/events/linux/mock_events.h b/level_zero/tools/test/unit_tests/sources/sysman/events/linux/mock_events.h index f3923197b6..b46eccdb1f 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/events/linux/mock_events.h +++ b/level_zero/tools/test/unit_tests/sources/sysman/events/linux/mock_events.h @@ -83,7 +83,8 @@ struct Mock : public EventsSysfsAccess { class PublicLinuxEventsImp : public L0::LinuxEventsImp { public: PublicLinuxEventsImp(OsSysman *pOsSysman) : LinuxEventsImp(pOsSysman) {} - using LinuxEventsImp::init; + using LinuxEventsImp::getPciIdPathTag; + using LinuxEventsImp::memHealthAtEventRegister; using LinuxEventsImp::pciIdPathTag; }; diff --git a/level_zero/tools/test/unit_tests/sources/sysman/events/linux/test_zes_events.cpp b/level_zero/tools/test/unit_tests/sources/sysman/events/linux/test_zes_events.cpp index ae08307e64..330c29c063 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/events/linux/test_zes_events.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/events/linux/test_zes_events.cpp @@ -188,5 +188,28 @@ TEST_F(SysmanEventsFixture, GivenValidDeviceHandleWhenListeningForDeviceAttachEv delete[] pDeviceEvents; } +TEST_F(SysmanEventsFixture, GivenValidDeviceHandleWhenListeningForMemHealthEventsThenEventListenAPIReturnsAfterReceivingEventWithinTimeout) { + PublicLinuxEventsImp *pLinuxEventsImp = new PublicLinuxEventsImp(pOsSysman); + pLinuxEventsImp->eventRegister(ZES_EVENT_TYPE_FLAG_MEM_HEALTH); + pLinuxEventsImp->memHealthAtEventRegister = ZES_MEM_HEALTH_OK; + zes_event_type_flags_t events; + uint32_t timeout = 100u; + EXPECT_TRUE(pLinuxEventsImp->eventListen(events, timeout)); + EXPECT_EQ(events, ZES_EVENT_TYPE_FLAG_MEM_HEALTH); + delete pLinuxEventsImp; +} + +TEST_F(SysmanEventsFixture, GivenValidDeviceHandleWhenListeningForMemHealthEventsAndMemHealthDidntOccurThenEventListenAPIReturnsWithinTimeout) { + EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEventRegister(device->toHandle(), ZES_EVENT_TYPE_FLAG_MEM_HEALTH)); + zes_device_handle_t *phDevices = new zes_device_handle_t[1]; + phDevices[0] = device->toHandle(); + uint32_t numDeviceEvents = 0; + zes_event_type_flags_t *pDeviceEvents = new zes_event_type_flags_t[1]; + EXPECT_EQ(ZE_RESULT_SUCCESS, zesDriverEventListen(driverHandle->toHandle(), 100u, 1u, phDevices, &numDeviceEvents, pDeviceEvents)); + EXPECT_EQ(0u, numDeviceEvents); + delete[] phDevices; + delete[] pDeviceEvents; +} + } // namespace ult } // namespace L0