fix: correctly extract the processId

This PR fixes how we extract the processId of the
process that has set the energy threshold.

Related-To: NEO-13910

Signed-off-by: Aviral Nigam <aviral.nigam@intel.com>
This commit is contained in:
Aviral Nigam
2025-11-19 09:05:37 +00:00
committed by Compute-Runtime-Automation
parent 873078663f
commit d3b0856e72
6 changed files with 139 additions and 15 deletions

View File

@@ -291,8 +291,6 @@ ze_result_t WddmPowerImp::getEnergyThreshold(zes_energy_threshold_t *pThreshold)
KmdSysman::RequestProperty request;
KmdSysman::ResponseProperty response;
pThreshold->processId = 0;
request.commandId = KmdSysman::Command::Get;
request.componentId = KmdSysman::Component::PowerComponent;
request.requestId = KmdSysman::Requests::Power::CurrentEnergyThreshold;
@@ -307,8 +305,11 @@ ze_result_t WddmPowerImp::getEnergyThreshold(zes_energy_threshold_t *pThreshold)
memset(pThreshold, 0, sizeof(zes_energy_threshold_t));
uint32_t value = 0;
uint32_t processId = 0;
memcpy_s(&value, sizeof(uint32_t), response.dataBuffer, sizeof(uint32_t));
memcpy_s(&processId, sizeof(uint32_t), response.dataBuffer + sizeof(uint32_t), sizeof(uint32_t));
pThreshold->threshold = static_cast<double>(value);
pThreshold->processId = processId;
pThreshold->enable = true;
return status;

View File

@@ -29,6 +29,7 @@ struct PowerKmdSysManager : public MockKmdSysManager {
int32_t mockAcPowerPeak = 0;
int32_t mockDcPowerPeak = 0;
uint32_t mockEnergyThreshold = 0;
uint32_t mockEnergyThresholdProcessId = 12345;
uint32_t mockEnergyCounter = 3231121;
uint32_t mockTimeStamp = 1123412412;
uint32_t mockEnergyUnit = 14;
@@ -36,6 +37,11 @@ struct PowerKmdSysManager : public MockKmdSysManager {
uint32_t mockFrequencyTimeStamp = 38400000;
uint32_t mockPowerFailure[KmdSysman::Requests::Power::MaxPowerRequests] = {0};
uint32_t getCurrentProcessId() {
// For testing, we'll use a simulated value that can be verified
return 999; // Test process ID
}
void getActivityProperty(KmdSysman::GfxSysmanReqHeaderIn *pRequest, KmdSysman::GfxSysmanReqHeaderOut *pResponse) override {
uint8_t *pBuffer = reinterpret_cast<uint8_t *>(pResponse);
pBuffer += sizeof(KmdSysman::GfxSysmanReqHeaderOut);
@@ -137,9 +143,11 @@ struct PowerKmdSysManager : public MockKmdSysManager {
} break;
case KmdSysman::Requests::Power::CurrentEnergyThreshold: {
uint32_t *pValue = reinterpret_cast<uint32_t *>(pBuffer);
uint32_t *pProcessId = reinterpret_cast<uint32_t *>(pBuffer + sizeof(uint32_t));
*pValue = mockEnergyThreshold;
*pProcessId = mockEnergyThresholdProcessId;
pResponse->outReturnCode = getReturnCode(pRequest->inRequestId);
pResponse->outDataSize = sizeof(uint32_t);
pResponse->outDataSize = sizeof(uint32_t) + sizeof(uint32_t);
} break;
case KmdSysman::Requests::Power::CurrentEnergyCounter: {
uint32_t *pValueCounter = reinterpret_cast<uint32_t *>(pBuffer);
@@ -213,9 +221,13 @@ struct PowerKmdSysManager : public MockKmdSysManager {
} break;
case KmdSysman::Requests::Power::CurrentEnergyThreshold: {
uint32_t *pValue = reinterpret_cast<uint32_t *>(pBuffer);
mockEnergyThreshold = *pValue;
pResponse->outDataSize = 0;
pResponse->outReturnCode = getReturnCode(pRequest->inRequestId);
if (!pResponse->outReturnCode) {
mockEnergyThreshold = *pValue;
// Simulate capturing the process ID of the setting process
mockEnergyThresholdProcessId = getCurrentProcessId();
pResponse->outDataSize = 0;
}
} break;
default: {
pResponse->outDataSize = 0;

View File

@@ -411,6 +411,53 @@ TEST_F(SysmanDevicePowerFixture, GivenValidPowerHandleWhenSettingEnergyThreshold
}
}
TEST_F(SysmanDevicePowerFixture, GivenValidPowerHandleWhenSettingEnergyThresholdSuccessfullyThenProcessIdIsCapturedCorrectly) {
init(true);
auto handles = getPowerHandles(powerHandleComponentCount);
for (auto handle : handles) {
double energyThreshold = 5000.0;
ze_result_t result = zesPowerSetEnergyThreshold(handle, energyThreshold);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
zes_energy_threshold_t retrievedThreshold;
result = zesPowerGetEnergyThreshold(handle, &retrievedThreshold);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_EQ(retrievedThreshold.threshold, energyThreshold);
EXPECT_EQ(retrievedThreshold.processId, 999u); // Mock getCurrentProcessId() returns 999
EXPECT_TRUE(retrievedThreshold.enable);
}
}
TEST_F(SysmanDevicePowerFixture, GivenValidPowerHandleWhenEnergyThresholdSetFailsThenProcessIdShouldNotMatch) {
init(true);
auto handles = getPowerHandles(powerHandleComponentCount);
pKmdSysManager->mockEnergyThresholdProcessId = 12345;
for (auto handle : handles) {
// Set failure flag for set operation
pKmdSysManager->mockPowerFailure[KmdSysman::Requests::Power::CurrentEnergyThreshold] = 1;
// Attempt to set threshold value (should fail)
double failedEnergyThreshold = 8000.0;
ze_result_t result = zesPowerSetEnergyThreshold(handle, failedEnergyThreshold);
EXPECT_NE(ZE_RESULT_SUCCESS, result); // Should fail due to mock failure
// Reset failure flag for get operation to work
pKmdSysManager->mockPowerFailure[KmdSysman::Requests::Power::CurrentEnergyThreshold] = 0;
zes_energy_threshold_t currentThreshold;
result = zesPowerGetEnergyThreshold(handle, &currentThreshold);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
// Validate values - threshold and process ID should remain unchanged
EXPECT_NE(currentThreshold.processId, 999u); // Process ID should remain unchanged
EXPECT_NE(currentThreshold.threshold, failedEnergyThreshold); // Should NOT be the failed set value
}
}
TEST_F(SysmanDevicePowerFixture, GivenValidPowerHandleWhenSettingPowerLimitsAllowSetToTrueThenCallSucceeds) {
// Setting allow set calls or not
init(true);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2023 Intel Corporation
* Copyright (C) 2020-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -251,8 +251,6 @@ ze_result_t WddmPowerImp::getEnergyThreshold(zes_energy_threshold_t *pThreshold)
KmdSysman::RequestProperty request;
KmdSysman::ResponseProperty response;
pThreshold->processId = 0;
request.commandId = KmdSysman::Command::Get;
request.componentId = KmdSysman::Component::PowerComponent;
request.requestId = KmdSysman::Requests::Power::CurrentEnergyThreshold;
@@ -266,8 +264,11 @@ ze_result_t WddmPowerImp::getEnergyThreshold(zes_energy_threshold_t *pThreshold)
memset(pThreshold, 0, sizeof(zes_energy_threshold_t));
uint32_t value = 0;
uint32_t processId = 0;
memcpy_s(&value, sizeof(uint32_t), response.dataBuffer, sizeof(uint32_t));
memcpy_s(&processId, sizeof(uint32_t), response.dataBuffer + sizeof(uint32_t), sizeof(uint32_t));
pThreshold->threshold = static_cast<double>(value);
pThreshold->processId = processId;
pThreshold->enable = true;
return status;

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2023 Intel Corporation
* Copyright (C) 2020-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -35,6 +35,13 @@ struct Mock<PowerKmdSysManager> : public PowerKmdSysManager {
uint32_t mockEnergyUnit = 14;
uint64_t mockEnergyCounter64Bit = 32323232323232;
uint32_t mockFrequencyTimeStamp = 38400000;
uint32_t mockEnergyThresholdProcessId = 12345;
uint32_t mockPowerFailure[KmdSysman::Requests::Power::MaxPowerRequests] = {0};
uint32_t getCurrentProcessId() {
// For testing, we'll use a simulated value that can be verified
return 999; // Test process ID
}
void getActivityProperty(KmdSysman::GfxSysmanReqHeaderIn *pRequest, KmdSysman::GfxSysmanReqHeaderOut *pResponse) override {
uint8_t *pBuffer = reinterpret_cast<uint8_t *>(pResponse);
@@ -54,6 +61,10 @@ struct Mock<PowerKmdSysManager> : public PowerKmdSysManager {
}
}
uint32_t getReturnCode(uint32_t powerRequestCode) {
return mockPowerFailure[powerRequestCode] ? KmdSysman::KmdSysmanFail : KmdSysman::KmdSysmanSuccess;
}
void getPowerProperty(KmdSysman::GfxSysmanReqHeaderIn *pRequest, KmdSysman::GfxSysmanReqHeaderOut *pResponse) override {
uint8_t *pBuffer = reinterpret_cast<uint8_t *>(pResponse);
pBuffer += sizeof(KmdSysman::GfxSysmanReqHeaderOut);
@@ -127,9 +138,11 @@ struct Mock<PowerKmdSysManager> : public PowerKmdSysManager {
} break;
case KmdSysman::Requests::Power::CurrentEnergyThreshold: {
uint32_t *pValue = reinterpret_cast<uint32_t *>(pBuffer);
uint32_t *pProcessId = reinterpret_cast<uint32_t *>(pBuffer + sizeof(uint32_t));
*pValue = mockEnergyThreshold;
pResponse->outReturnCode = KmdSysman::KmdSysmanSuccess;
pResponse->outDataSize = sizeof(uint32_t);
*pProcessId = mockEnergyThresholdProcessId;
pResponse->outReturnCode = getReturnCode(pRequest->inRequestId);
pResponse->outDataSize = sizeof(uint32_t) + sizeof(uint32_t);
} break;
case KmdSysman::Requests::Power::CurrentEnergyCounter: {
uint32_t *pValueCounter = reinterpret_cast<uint32_t *>(pBuffer);
@@ -197,9 +210,12 @@ struct Mock<PowerKmdSysManager> : public PowerKmdSysManager {
} break;
case KmdSysman::Requests::Power::CurrentEnergyThreshold: {
uint32_t *pValue = reinterpret_cast<uint32_t *>(pBuffer);
mockEnergyThreshold = *pValue;
pResponse->outDataSize = 0;
pResponse->outReturnCode = KmdSysman::KmdSysmanSuccess;
pResponse->outReturnCode = getReturnCode(pRequest->inRequestId);
if (!pResponse->outReturnCode) {
mockEnergyThreshold = *pValue;
mockEnergyThresholdProcessId = getCurrentProcessId();
pResponse->outDataSize = 0;
}
} break;
default: {
pResponse->outDataSize = 0;

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2023 Intel Corporation
* Copyright (C) 2020-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -381,5 +381,52 @@ TEST_F(SysmanDevicePowerFixture, GivenValidPowerHandleWhenCallingGetPowerLimitsE
}
}
TEST_F(SysmanDevicePowerFixture, GivenValidPowerHandleWhenSettingEnergyThresholdSuccessfullyThenProcessIdIsCapturedCorrectly) {
init(true);
auto handles = getPowerHandles(powerHandleComponentCount);
for (auto handle : handles) {
double energyThreshold = 5000.0;
ze_result_t result = zesPowerSetEnergyThreshold(handle, energyThreshold);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
zes_energy_threshold_t retrievedThreshold;
result = zesPowerGetEnergyThreshold(handle, &retrievedThreshold);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_EQ(retrievedThreshold.threshold, energyThreshold);
EXPECT_EQ(retrievedThreshold.processId, 999u); // Mock getCurrentProcessId() returns 999
EXPECT_TRUE(retrievedThreshold.enable);
}
}
TEST_F(SysmanDevicePowerFixture, GivenValidPowerHandleWhenEnergyThresholdSetFailsThenProcessIdShouldNotMatch) {
init(true);
auto handles = getPowerHandles(powerHandleComponentCount);
pKmdSysManager->mockEnergyThresholdProcessId = 12345;
for (auto handle : handles) {
// Set failure flag for set operation
pKmdSysManager->mockPowerFailure[KmdSysman::Requests::Power::CurrentEnergyThreshold] = 1;
// Attempt to set threshold value (should fail)
double failedEnergyThreshold = 8000.0;
ze_result_t result = zesPowerSetEnergyThreshold(handle, failedEnergyThreshold);
EXPECT_NE(ZE_RESULT_SUCCESS, result); // Should fail due to mock failure
// Reset failure flag for get operation to work
pKmdSysManager->mockPowerFailure[KmdSysman::Requests::Power::CurrentEnergyThreshold] = 0;
zes_energy_threshold_t currentThreshold;
result = zesPowerGetEnergyThreshold(handle, &currentThreshold);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
// Validate values - threshold and process ID should remain unchanged
EXPECT_NE(currentThreshold.processId, 999u); // Process ID should remain unchanged
EXPECT_NE(currentThreshold.threshold, failedEnergyThreshold); // Should NOT be the failed set value
}
}
} // namespace ult
} // namespace L0