mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-30 01:35:20 +08:00
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:
committed by
Compute-Runtime-Automation
parent
873078663f
commit
d3b0856e72
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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, ¤tThreshold);
|
||||
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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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, ¤tThreshold);
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user