Skip to content

Commit 20e4655

Browse files
feature(sysman): Aggregate Pf and Vf Engine Stats for XeKmd
For XeKmd, if VFs are enabled, the engine Stats for the engine handle has the aggregated value from the pf and the vfs. Related-To: NEO-16494 Signed-off-by: Pratik Bari <pratik.bari@intel.com>
1 parent 11165b6 commit 20e4655

File tree

2 files changed

+112
-4
lines changed

2 files changed

+112
-4
lines changed

level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface_xe.cpp

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,8 @@ static ze_result_t getConfigs(PmuInterface *const &pPmuInterface,
177177
const SetOfEngineInstanceAndTileId &setEngineInstanceAndTileId,
178178
zes_engine_group_t engineGroup,
179179
const NEO::Drm *pDrm,
180-
std::vector<uint64_t> &configs) {
180+
std::vector<uint64_t> &configs,
181+
uint32_t numberOfVfs) {
181182

182183
ze_result_t result = ZE_RESULT_SUCCESS;
183184
auto engineClass = engineGroupToEngineClass.find(engineGroup);
@@ -196,11 +197,39 @@ static ze_result_t getConfigs(PmuInterface *const &pPmuInterface,
196197

197198
configs.push_back(activeTicksConfig);
198199
configs.push_back(totalTicksConfig);
200+
201+
if (numberOfVfs > 0) {
202+
for (uint32_t vfId = 1; vfId <= numberOfVfs; vfId++) {
203+
uint64_t vfActiveTicksConfig = activeTicksConfig;
204+
uint64_t vfTotalTicksConfig = totalTicksConfig;
205+
206+
auto vfRet = pPmuInterface->getPmuConfigsForVf(sysmanDeviceDir, vfId,
207+
vfActiveTicksConfig, vfTotalTicksConfig);
208+
if (vfRet < 0) {
209+
result = ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
210+
NEO::printDebugString(NEO::debugManager.flags.PrintDebugMessages.get(), stderr, "Error@ %s(): Failed to get configs for VF and returning error:0x%x\n", __FUNCTION__, result);
211+
return result;
212+
}
213+
configs.push_back(vfActiveTicksConfig);
214+
configs.push_back(vfTotalTicksConfig);
215+
}
216+
}
199217
}
200218

201219
return result;
202220
}
203221

222+
static uint32_t getNumberOfEnabledVfs(SysFsAccessInterface *pSysFsAccess) {
223+
constexpr std::string_view pathForNumberOfVfs = "device/sriov_numvfs";
224+
uint32_t numberOfVfs = 0;
225+
auto result = pSysFsAccess->read(pathForNumberOfVfs.data(), numberOfVfs);
226+
if (result != ZE_RESULT_SUCCESS) {
227+
numberOfVfs = 0;
228+
NEO::printDebugString(NEO::debugManager.flags.PrintDebugMessages.get(), stderr, "Error@ %s(): Failed to read Number Of Vfs with error 0x%x \n", __FUNCTION__, result);
229+
}
230+
return numberOfVfs;
231+
}
232+
204233
ze_result_t SysmanKmdInterfaceXe::getPmuConfigsForGroupEngines(const MapOfEngineInfo &mapEngineInfo,
205234
const std::string &sysmanDeviceDir,
206235
const EngineGroupInfo &engineInfo,
@@ -215,11 +244,13 @@ ze_result_t SysmanKmdInterfaceXe::getPmuConfigsForGroupEngines(const MapOfEngine
215244

216245
ze_result_t result = ZE_RESULT_SUCCESS;
217246

247+
uint32_t numberOfVfs = getNumberOfEnabledVfs(getSysFsAccess());
248+
218249
auto getConfigForEngine{
219250
[&](zes_engine_group_t engineGroup) {
220251
auto itrEngineInfo = mapEngineInfo.find(engineGroup);
221252
if (itrEngineInfo != mapEngineInfo.end()) {
222-
result = getConfigs(pPmuInterface, sysmanDeviceDir, itrEngineInfo->second, engineGroup, pDrm, pmuConfigs);
253+
result = getConfigs(pPmuInterface, sysmanDeviceDir, itrEngineInfo->second, engineGroup, pDrm, pmuConfigs, numberOfVfs);
223254
}
224255
return result;
225256
}};
@@ -277,7 +308,9 @@ ze_result_t SysmanKmdInterfaceXe::getPmuConfigsForSingleEngines(const std::strin
277308
ze_result_t result = ZE_RESULT_SUCCESS;
278309
SetOfEngineInstanceAndTileId setEngineInstanceAndTileId = {{engineInfo.engineInstance, engineInfo.tileId}};
279310

280-
result = getConfigs(pPmuInterface, sysmanDeviceDir, setEngineInstanceAndTileId, engineInfo.engineGroup, pDrm, pmuConfigs);
311+
uint32_t numberOfVfs = getNumberOfEnabledVfs(getSysFsAccess());
312+
313+
result = getConfigs(pPmuInterface, sysmanDeviceDir, setEngineInstanceAndTileId, engineInfo.engineGroup, pDrm, pmuConfigs, numberOfVfs);
281314
if (result != ZE_RESULT_SUCCESS) {
282315
return result;
283316
}

level_zero/sysman/test/unit_tests/sources/shared/linux/kmd_interface/test_sysman_kmd_interface_xe.cpp

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,25 @@ static const MapOfEngineInfo mockMapEngineInfo = {
3636
{ZES_ENGINE_GROUP_COMPUTE_SINGLE, {{1, 0}}}};
3737

3838
static const uint32_t mockReadVal = 23;
39+
static const uint32_t mockVfs = 2;
3940

4041
static int mockReadLinkSuccess(const char *path, char *buf, size_t bufsize) {
4142
constexpr size_t sizeofPath = sizeof("/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/0000:02:01.0/0000:03:00.0");
4243
strcpy_s(buf, sizeofPath, "/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/0000:02:01.0/0000:03:00.0");
4344
return sizeofPath;
4445
}
4546

47+
static int mockOpenSuccess(const char *pathname, int flags) {
48+
return mockReadVal;
49+
}
50+
4651
static ssize_t mockReadSuccess(int fd, void *buf, size_t count, off_t offset) {
4752
std::ostringstream oStream;
48-
oStream << mockReadVal;
53+
if (fd == mockReadVal) {
54+
oStream << mockVfs;
55+
} else {
56+
oStream << mockReadVal;
57+
}
4958
std::string value = oStream.str();
5059
memcpy(buf, value.data(), count);
5160
return count;
@@ -417,6 +426,72 @@ TEST_F(SysmanFixtureDeviceXe, GivenSysmanKmdInterfaceWhenCallingIsLateBindingVer
417426
EXPECT_FALSE(pSysmanKmdInterface->isLateBindingVersionAvailable("unknown", val));
418427
}
419428

429+
TEST_F(SysmanFixtureDeviceXe, GivenSysmanKmdInterfaceWithVfsEnabledWhenCallingGetPmuConfigsForGroupEnginesThenSuccessIsReturned) {
430+
431+
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
432+
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, &mockReadSuccess);
433+
434+
auto pSysmanKmdInterface = pLinuxSysmanImp->pSysmanKmdInterface.get();
435+
auto pDrm = pLinuxSysmanImp->getDrm();
436+
std::vector<uint64_t> mockPmuConfigs = {1, 2};
437+
uint32_t pmuConfigSize = 18;
438+
std::vector<uint64_t> pmuConfigs = {};
439+
const std::string sysmanDeviceDir = "/sys/devices/0000:aa:bb:cc";
440+
EngineGroupInfo engineGroupInfo = {ZES_ENGINE_GROUP_MEDIA_ALL, 0, 0};
441+
EXPECT_EQ(pSysmanKmdInterface->getPmuConfigsForGroupEngines(mockMapEngineInfo, sysmanDeviceDir, engineGroupInfo, pPmuInterface.get(), pDrm, pmuConfigs), ZE_RESULT_SUCCESS);
442+
EXPECT_EQ(pmuConfigs.size(), pmuConfigSize);
443+
for (uint32_t i = 0; i < pmuConfigs.size(); i++) {
444+
EXPECT_EQ(pmuConfigs[i], mockPmuConfigs[i % 2]);
445+
}
446+
}
447+
448+
TEST_F(SysmanFixtureDeviceXe, GivenSysmanKmdInterfaceWithVfsEnabledWhenCallingGetPmuConfigsForSingleEnginesThenSuccessIsReturned) {
449+
450+
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
451+
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, &mockReadSuccess);
452+
453+
auto pSysmanKmdInterface = pLinuxSysmanImp->pSysmanKmdInterface.get();
454+
auto pDrm = pLinuxSysmanImp->getDrm();
455+
std::vector<uint64_t> mockPmuConfigs = {1, 2};
456+
uint32_t pmuConfigSize = 6;
457+
std::vector<uint64_t> pmuConfigs = {};
458+
const std::string sysmanDeviceDir = "/sys/devices/0000:aa:bb:cc";
459+
EngineGroupInfo engineGroupInfo = {ZES_ENGINE_GROUP_COMPUTE_SINGLE, 0, 0};
460+
EXPECT_EQ(pSysmanKmdInterface->getPmuConfigsForSingleEngines(sysmanDeviceDir, engineGroupInfo, pPmuInterface.get(), pDrm, pmuConfigs), ZE_RESULT_SUCCESS);
461+
EXPECT_EQ(pmuConfigs.size(), pmuConfigSize);
462+
for (uint32_t i = 0; i < pmuConfigs.size(); i++) {
463+
EXPECT_EQ(pmuConfigs[i], mockPmuConfigs[i % 2]);
464+
}
465+
}
466+
467+
TEST_F(SysmanFixtureDeviceXe, GivenVfsEnabledAndPmuInterfaceOpenFailsWhenCallingGetPmuConfigsForGroupEnginesThenErrorIsReturned) {
468+
469+
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
470+
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, &mockReadSuccess);
471+
472+
auto pSysmanKmdInterface = pLinuxSysmanImp->pSysmanKmdInterface.get();
473+
auto pDrm = pLinuxSysmanImp->getDrm();
474+
std::vector<uint64_t> pmuConfigs = {};
475+
const std::string sysmanDeviceDir = "/sys/devices/0000:aa:bb:cc";
476+
pPmuInterface->mockVfConfigReturnValue.push_back(-1);
477+
EngineGroupInfo engineGroupInfo = {ZES_ENGINE_GROUP_MEDIA_ALL, 0, 0};
478+
EXPECT_EQ(pSysmanKmdInterface->getPmuConfigsForGroupEngines(mockMapEngineInfo, sysmanDeviceDir, engineGroupInfo, pPmuInterface.get(), pDrm, pmuConfigs), ZE_RESULT_ERROR_UNSUPPORTED_FEATURE);
479+
}
480+
481+
TEST_F(SysmanFixtureDeviceXe, GivenVfsEnabledAndPmuInterfaceOpenFailsWhenCallingGetPmuConfigsForSingleEnginesThenErrorIsReturned) {
482+
483+
VariableBackup<decltype(NEO::SysCalls::sysCallsOpen)> mockOpen(&NEO::SysCalls::sysCallsOpen, &mockOpenSuccess);
484+
VariableBackup<decltype(NEO::SysCalls::sysCallsPread)> mockPread(&NEO::SysCalls::sysCallsPread, &mockReadSuccess);
485+
486+
auto pSysmanKmdInterface = pLinuxSysmanImp->pSysmanKmdInterface.get();
487+
auto pDrm = pLinuxSysmanImp->getDrm();
488+
std::vector<uint64_t> pmuConfigs = {};
489+
const std::string sysmanDeviceDir = "/sys/devices/0000:aa:bb:cc";
490+
pPmuInterface->mockVfConfigReturnValue.push_back(-1);
491+
EngineGroupInfo engineGroupInfo = {ZES_ENGINE_GROUP_COMPUTE_SINGLE, 0, 0};
492+
EXPECT_EQ(pSysmanKmdInterface->getPmuConfigsForSingleEngines(sysmanDeviceDir, engineGroupInfo, pPmuInterface.get(), pDrm, pmuConfigs), ZE_RESULT_ERROR_UNSUPPORTED_FEATURE);
493+
}
494+
420495
} // namespace ult
421496
} // namespace Sysman
422497
} // namespace L0

0 commit comments

Comments
 (0)