From 78877424b0be6a9c4c8d11956c0acbf68642d397 Mon Sep 17 00:00:00 2001 From: Bellekallu Rajkiran Date: Thu, 9 Nov 2023 06:27:26 +0000 Subject: [PATCH] fix: Synchronize iaf requests to KMD Related-To: NEO-8990 Signed-off-by: Bellekallu Rajkiran --- .../linux/sysman_fabric_device_access_imp.cpp | 2 +- .../source/shared/linux/nl_api/sysman_iaf_nl_api.cpp | 10 ++++++++-- .../source/shared/linux/nl_api/sysman_iaf_nl_api.h | 2 ++ .../linux/nl_api/test_sysman_iaf_nl_api_prelim.cpp | 6 +++--- .../tools/source/sysman/linux/nl_api/iaf_nl_api.cpp | 10 ++++++++-- .../tools/source/sysman/linux/nl_api/iaf_nl_api.h | 2 ++ .../linux/nl_api/test_sysman_iaf_nl_api_prelim.cpp | 2 +- 7 files changed, 25 insertions(+), 9 deletions(-) diff --git a/level_zero/sysman/source/api/fabric_port/linux/sysman_fabric_device_access_imp.cpp b/level_zero/sysman/source/api/fabric_port/linux/sysman_fabric_device_access_imp.cpp index 5553a8094b..705174c414 100644 --- a/level_zero/sysman/source/api/fabric_port/linux/sysman_fabric_device_access_imp.cpp +++ b/level_zero/sysman/source/api/fabric_port/linux/sysman_fabric_device_access_imp.cpp @@ -73,7 +73,7 @@ ze_result_t FabricDeviceAccessNl::getState(const zes_fabric_port_id_t portId, ze result = pIafNlApi->fportProperties(iafPortId, guid, portNumber, maxRxSpeed, maxTxSpeed, rxSpeed, txSpeed); if (ZE_RESULT_SUCCESS != result) { - NEO::printDebugString(NEO::DebugManager.flags.PrintDebugMessages.get(), stderr, "Error@ %s(): Error@ %s(): Iaf port properties query failed for fabricId : %d, attachId : %d, portnumber : %d and returning error:0x%x \n", __FUNCTION__, iafPortId.fabricId, iafPortId.attachId, iafPortId.portNumber, result); + NEO::printDebugString(NEO::DebugManager.flags.PrintDebugMessages.get(), stderr, "Error@ %s(): Iaf port properties query failed for fabricId : %d, attachId : %d, portnumber : %d and returning error:0x%x \n", __FUNCTION__, iafPortId.fabricId, iafPortId.attachId, iafPortId.portNumber, result); return result; } readIafPortSpeed(state.rxSpeed, rxSpeed); diff --git a/level_zero/sysman/source/shared/linux/nl_api/sysman_iaf_nl_api.cpp b/level_zero/sysman/source/shared/linux/nl_api/sysman_iaf_nl_api.cpp index 8553004866..45940d10dc 100644 --- a/level_zero/sysman/source/shared/linux/nl_api/sysman_iaf_nl_api.cpp +++ b/level_zero/sysman/source/shared/linux/nl_api/sysman_iaf_nl_api.cpp @@ -7,6 +7,7 @@ #include "level_zero/sysman/source/shared/linux/nl_api/sysman_iaf_nl_api.h" +#include "shared/source/debug_settings/debug_settings_manager.h" #include "shared/source/os_interface/linux/sys_calls.h" #include "shared/source/utilities/directory.h" @@ -100,6 +101,7 @@ ze_result_t IafNlApi::allocMsg(const uint16_t cmdOp, struct nl_msg *&msg) { } ze_result_t IafNlApi::issueRequest(const uint16_t cmdOp, const uint32_t fabricId, const uint32_t attachId, const uint8_t portNumber, void *pOutput) { + std::unique_lock lock(iafMutex); ze_result_t result = init(); if (ZE_RESULT_SUCCESS != result) { return result; @@ -127,6 +129,7 @@ void IafNlApi::addNestedFabricPortList(struct nl_msg *msg, std::vector &iafPortIdList, void *pOutput) { + std::unique_lock lock(iafMutex); ze_result_t result = init(); if (ZE_RESULT_SUCCESS != result) { return result; @@ -143,6 +146,7 @@ ze_result_t IafNlApi::issueRequest(const uint16_t cmdOp, std::vector } ze_result_t IafNlApi::issueRequest(const uint16_t cmdOp, const uint32_t fabricId, const uint32_t attachId, void *pOutput) { + std::unique_lock lock(iafMutex); ze_result_t result = init(); if (ZE_RESULT_SUCCESS != result) { return result; @@ -159,6 +163,7 @@ ze_result_t IafNlApi::issueRequest(const uint16_t cmdOp, const uint32_t fabricId } ze_result_t IafNlApi::issueRequest(const uint16_t cmdOp, const uint32_t fabricId, void *pOutput) { + std::unique_lock lock(iafMutex); ze_result_t result = init(); if (ZE_RESULT_SUCCESS != result) { return result; @@ -174,6 +179,7 @@ ze_result_t IafNlApi::issueRequest(const uint16_t cmdOp, const uint32_t fabricId } ze_result_t IafNlApi::issueRequest(const uint16_t cmdOp, void *pOutput) { + std::unique_lock lock(iafMutex); ze_result_t result = init(); if (ZE_RESULT_SUCCESS != result) { return result; @@ -727,8 +733,8 @@ ze_result_t IafNlApi::init() { int retval = pNlApi->genlRegisterFamily(&ops); if (-NLE_EXIST == retval) { - // Temporary error - return ZE_RESULT_NOT_READY; + NEO::printDebugString(NEO::DebugManager.flags.PrintDebugMessages.get(), stderr, "Error@ %s(): Failed to register netlink family and returning error:0x%x \n", __FUNCTION__, ZE_RESULT_ERROR_NOT_AVAILABLE); + return ZE_RESULT_ERROR_NOT_AVAILABLE; } else if (!retval) { nlSock = pNlApi->nlSocketAlloc(); if (nullptr != nlSock) { diff --git a/level_zero/sysman/source/shared/linux/nl_api/sysman_iaf_nl_api.h b/level_zero/sysman/source/shared/linux/nl_api/sysman_iaf_nl_api.h index 97c7c03653..a43d46b3d3 100644 --- a/level_zero/sysman/source/shared/linux/nl_api/sysman_iaf_nl_api.h +++ b/level_zero/sysman/source/shared/linux/nl_api/sysman_iaf_nl_api.h @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -146,6 +147,7 @@ class IafNlApi { struct nla_policy policy[_IAF_ATTR_COUNT] = {}; struct genl_cmd cmds[_IAF_CMD_OP_COUNT] = {}; struct genl_ops ops = {}; + std::mutex iafMutex{}; }; } // namespace Sysman diff --git a/level_zero/sysman/test/unit_tests/sources/linux/nl_api/test_sysman_iaf_nl_api_prelim.cpp b/level_zero/sysman/test/unit_tests/sources/linux/nl_api/test_sysman_iaf_nl_api_prelim.cpp index 2532c3c6e2..6ab1b751d8 100644 --- a/level_zero/sysman/test/unit_tests/sources/linux/nl_api/test_sysman_iaf_nl_api_prelim.cpp +++ b/level_zero/sysman/test/unit_tests/sources/linux/nl_api/test_sysman_iaf_nl_api_prelim.cpp @@ -121,15 +121,15 @@ TEST_F(SysmanIafNlApiFixture, GivenIafNlApiWhenLoadEntryPointsFailsThenInitRepea EXPECT_EQ(ZE_RESULT_ERROR_DEPENDENCY_UNAVAILABLE, testIafNlApi.init()); } -TEST_F(SysmanIafNlApiFixture, GivenIafNlApiWhenGenlRegisterFamilyFailesWithExistThenInitReturnsNotReady) { +TEST_F(SysmanIafNlApiFixture, GivenIafNlApiWhenGenlRegisterFamilyFailsWithExistThenInitReturnsNotReady) { MockNlApi *pMockNlApi = static_cast(testIafNlApi.pNlApi.get()); pMockNlApi->mockLoadEntryPointsReturnValue.push_back(true); pMockNlApi->mockGenlRegisterFamilyReturnValue.push_back(-NLE_EXIST); pMockNlApi->isMockGenlRegisterFamilyRepeatedCall.push_back(false); - EXPECT_EQ(ZE_RESULT_NOT_READY, testIafNlApi.init()); + EXPECT_EQ(ZE_RESULT_ERROR_NOT_AVAILABLE, testIafNlApi.init()); } -TEST_F(SysmanIafNlApiFixture, GivenIafNlApiWhenGenlRegisterFamilyFailesWithAnyOtherErrorInitReturnsErrorUnknown) { +TEST_F(SysmanIafNlApiFixture, GivenIafNlApiWhenGenlRegisterFamilyFailsWithAnyOtherErrorInitReturnsErrorUnknown) { MockNlApi *pMockNlApi = static_cast(testIafNlApi.pNlApi.get()); pMockNlApi->mockLoadEntryPointsReturnValue.push_back(true); pMockNlApi->mockGenlRegisterFamilyReturnValue.push_back(-NLE_FAILURE); diff --git a/level_zero/tools/source/sysman/linux/nl_api/iaf_nl_api.cpp b/level_zero/tools/source/sysman/linux/nl_api/iaf_nl_api.cpp index ebaf5ebdad..2c3fe5c03e 100644 --- a/level_zero/tools/source/sysman/linux/nl_api/iaf_nl_api.cpp +++ b/level_zero/tools/source/sysman/linux/nl_api/iaf_nl_api.cpp @@ -7,6 +7,7 @@ #include "iaf_nl_api.h" +#include "shared/source/debug_settings/debug_settings_manager.h" #include "shared/source/os_interface/linux/sys_calls.h" #include "shared/source/utilities/directory.h" @@ -99,6 +100,7 @@ ze_result_t IafNlApi::allocMsg(const uint16_t cmdOp, struct nl_msg *&msg) { } ze_result_t IafNlApi::issueRequest(const uint16_t cmdOp, const uint32_t fabricId, const uint32_t attachId, const uint8_t portNumber, void *pOutput) { + std::unique_lock lock(iafMutex); ze_result_t result = init(); if (ZE_RESULT_SUCCESS != result) { return result; @@ -126,6 +128,7 @@ void IafNlApi::addNestedFabricPortList(struct nl_msg *msg, std::vector &iafPortIdList, void *pOutput) { + std::unique_lock lock(iafMutex); ze_result_t result = init(); if (ZE_RESULT_SUCCESS != result) { return result; @@ -142,6 +145,7 @@ ze_result_t IafNlApi::issueRequest(const uint16_t cmdOp, std::vector } ze_result_t IafNlApi::issueRequest(const uint16_t cmdOp, const uint32_t fabricId, const uint32_t attachId, void *pOutput) { + std::unique_lock lock(iafMutex); ze_result_t result = init(); if (ZE_RESULT_SUCCESS != result) { return result; @@ -158,6 +162,7 @@ ze_result_t IafNlApi::issueRequest(const uint16_t cmdOp, const uint32_t fabricId } ze_result_t IafNlApi::issueRequest(const uint16_t cmdOp, const uint32_t fabricId, void *pOutput) { + std::unique_lock lock(iafMutex); ze_result_t result = init(); if (ZE_RESULT_SUCCESS != result) { return result; @@ -173,6 +178,7 @@ ze_result_t IafNlApi::issueRequest(const uint16_t cmdOp, const uint32_t fabricId } ze_result_t IafNlApi::issueRequest(const uint16_t cmdOp, void *pOutput) { + std::unique_lock lock(iafMutex); ze_result_t result = init(); if (ZE_RESULT_SUCCESS != result) { return result; @@ -726,8 +732,8 @@ ze_result_t IafNlApi::init() { int retval = pNlApi->genlRegisterFamily(&ops); if (-NLE_EXIST == retval) { - // Temporary error - return ZE_RESULT_NOT_READY; + NEO::printDebugString(NEO::DebugManager.flags.PrintDebugMessages.get(), stderr, "Error@ %s(): Failed to register netlink family and returning error:0x%x \n", __FUNCTION__, ZE_RESULT_ERROR_NOT_AVAILABLE); + return ZE_RESULT_ERROR_NOT_AVAILABLE; } else if (!retval) { nlSock = pNlApi->nlSocketAlloc(); if (nullptr != nlSock) { diff --git a/level_zero/tools/source/sysman/linux/nl_api/iaf_nl_api.h b/level_zero/tools/source/sysman/linux/nl_api/iaf_nl_api.h index 243dbdcd7d..26391c6367 100644 --- a/level_zero/tools/source/sysman/linux/nl_api/iaf_nl_api.h +++ b/level_zero/tools/source/sysman/linux/nl_api/iaf_nl_api.h @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -145,6 +146,7 @@ class IafNlApi { struct nla_policy policy[_IAF_ATTR_COUNT] = {}; struct genl_cmd cmds[_IAF_CMD_OP_COUNT] = {}; struct genl_ops ops = {}; + std::mutex iafMutex{}; }; } // namespace L0 diff --git a/level_zero/tools/test/unit_tests/sources/sysman/linux/nl_api/test_sysman_iaf_nl_api_prelim.cpp b/level_zero/tools/test/unit_tests/sources/sysman/linux/nl_api/test_sysman_iaf_nl_api_prelim.cpp index 861dc8e349..abda82e260 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/linux/nl_api/test_sysman_iaf_nl_api_prelim.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/linux/nl_api/test_sysman_iaf_nl_api_prelim.cpp @@ -130,7 +130,7 @@ TEST_F(SysmanIafNlApiFixture, GivenIafNlApiWhenGenlRegisterFamilyFailesWithExist pMockNlApi->mockLoadEntryPointsReturnValue.push_back(true); pMockNlApi->mockGenlRegisterFamilyReturnValue.push_back(-NLE_EXIST); pMockNlApi->isMockGenlRegisterFamilyRepeatedCall.push_back(false); - EXPECT_EQ(ZE_RESULT_NOT_READY, testIafNlApi.init()); + EXPECT_EQ(ZE_RESULT_ERROR_NOT_AVAILABLE, testIafNlApi.init()); } TEST_F(SysmanIafNlApiFixture, GivenIafNlApiWhenGenlRegisterFamilyFailesWithAnyOtherErrorInitReturnsErrorUnknown) {