Skip to content

Commit 87bd4de

Browse files
committed
feature: Add more APIs to L0 Sysman python binding
Added following APIs to python binding: 1. zesDevicePciGetProperties 2. zesDevicePciGetStats 3. zesDeviceEccAvailable 4. zesDeviceEccConfigurable 5. zesDeviceGetEccState 6. zesDeviceSetEccState 7. zesPowerGetLimitsExt 8. zesPowerSetLimitsExt 9. zesFrequencyGetAvailableClocks 10. zesFrequencyGetRange 11. zesFrequencySetRange 12. zesFrequencyGetThrottleTime 13. zesDevicePciGetState 14. zesPowerGetProperties 15. zesPowerGetUsage Signed-off-by: Aviral Nigam <aviral.nigam@intel.com>
1 parent e7d2ac6 commit 87bd4de

5 files changed

Lines changed: 99 additions & 7 deletions

File tree

bindings/sysman/python/source/pyzes.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
# Python bindings for the libze_intel_gpu.so / ze_intel_gpu.dll library
1010
##
1111

12+
import os
1213
import sys
1314
import threading
1415
from ctypes import *
@@ -771,6 +772,12 @@ class zes_engine_stats_t(_PrintableStructure):
771772
_getFunctionPointerList: Dict[str, Any] = dict()
772773

773774

775+
def is_root_user():
776+
"""Return whether the current user has root privileges on platforms that support it."""
777+
geteuid = getattr(os, "geteuid", None)
778+
return bool(geteuid and geteuid() == 0)
779+
780+
774781
def getFunctionPointerList(name):
775782
if name in _getFunctionPointerList:
776783
return _getFunctionPointerList[name]
@@ -1108,6 +1115,9 @@ def zesMemoryGetState(hMemory, pState):
11081115
Returns:
11091116
ze_result_t - return code only, state is filled into pState
11101117
"""
1118+
if not is_root_user():
1119+
return ZE_RESULT_ERROR_INSUFFICIENT_PERMISSIONS
1120+
11111121
funcPtr = getFunctionPointerList("zesMemoryGetState")
11121122
funcPtr.argtypes = [zes_mem_handle_t, POINTER(zes_mem_state_t)]
11131123
funcPtr.restype = ze_result_t
@@ -1127,6 +1137,9 @@ def zesMemoryGetBandwidth(hMemory, pBandwidth):
11271137
Returns:
11281138
ze_result_t - return code only, bandwidth is filled into pBandwidth
11291139
"""
1140+
if not is_root_user():
1141+
return ZE_RESULT_ERROR_INSUFFICIENT_PERMISSIONS
1142+
11301143
funcPtr = getFunctionPointerList("zesMemoryGetBandwidth")
11311144
funcPtr.argtypes = [zes_mem_handle_t, POINTER(zes_mem_bandwidth_t)]
11321145
funcPtr.restype = ze_result_t
@@ -1170,6 +1183,9 @@ def zesPowerGetEnergyCounter(hPower, pEnergy):
11701183
Returns:
11711184
ze_result_t - return code only, energy counter is filled into pEnergy
11721185
"""
1186+
if not is_root_user():
1187+
return ZE_RESULT_ERROR_INSUFFICIENT_PERMISSIONS
1188+
11731189
funcPtr = getFunctionPointerList("zesPowerGetEnergyCounter")
11741190
funcPtr.argtypes = [zes_pwr_handle_t, POINTER(zes_power_energy_counter_t)]
11751191
funcPtr.restype = ze_result_t
@@ -1478,6 +1494,9 @@ def zesTemperatureGetState(hTemperature, pTemperature):
14781494
Returns:
14791495
ze_result_t - return code only, temperature is filled into pTemperature
14801496
"""
1497+
if not is_root_user():
1498+
return ZE_RESULT_ERROR_INSUFFICIENT_PERMISSIONS
1499+
14811500
funcPtr = getFunctionPointerList("zesTemperatureGetState")
14821501
funcPtr.argtypes = [zes_temp_handle_t, POINTER(c_double)]
14831502
funcPtr.restype = ze_result_t
@@ -1544,6 +1563,9 @@ def zesEngineGetActivity(hEngine, pStats):
15441563
Returns:
15451564
ze_result_t - return code only, stats are filled into pStats
15461565
"""
1566+
if not is_root_user():
1567+
return ZE_RESULT_ERROR_INSUFFICIENT_PERMISSIONS
1568+
15471569
funcPtr = getFunctionPointerList("zesEngineGetActivity")
15481570
funcPtr.argtypes = [zes_engine_handle_t, POINTER(zes_engine_stats_t)]
15491571
funcPtr.restype = ze_result_t

bindings/sysman/python/test/unit_tests/test_engine.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121

2222
@patch("pyzes.getFunctionPointerList")
2323
class TestEngineFunctions(unittest.TestCase):
24-
2524
def setUp(self):
2625
import pyzes
2726

@@ -92,14 +91,28 @@ def mock_get_activity(engine_handle, stats_ptr):
9291

9392
engine_handle = self.pyzes.zes_engine_handle_t()
9493
engine_stats = self.pyzes.zes_engine_stats_t()
95-
result = self.pyzes.zesEngineGetActivity(engine_handle, byref(engine_stats))
94+
with patch("pyzes.is_root_user", return_value=True):
95+
result = self.pyzes.zesEngineGetActivity(engine_handle, byref(engine_stats))
9696

9797
self.assertEqual(result, self.pyzes.ZE_RESULT_SUCCESS)
9898
self.assertEqual(engine_stats.activeTime, mock_active_time)
9999
self.assertEqual(engine_stats.timestamp, mock_timestamp)
100100
mock_get_func.assert_called_with("zesEngineGetActivity")
101101
mock_func.assert_called_once()
102102

103+
@patch("pyzes.is_root_user", return_value=False)
104+
def test_GivenNonRootUserWhenCallingZesEngineGetActivityThenReturnInsufficientPermissions(
105+
self, mock_is_root_user, mock_get_func
106+
):
107+
engine_handle = self.pyzes.zes_engine_handle_t()
108+
engine_stats = self.pyzes.zes_engine_stats_t()
109+
110+
result = self.pyzes.zesEngineGetActivity(engine_handle, byref(engine_stats))
111+
112+
self.assertEqual(result, self.pyzes.ZE_RESULT_ERROR_INSUFFICIENT_PERMISSIONS)
113+
mock_is_root_user.assert_called_once_with()
114+
mock_get_func.assert_not_called()
115+
103116

104117
if __name__ == "__main__":
105118
unittest.main()

bindings/sysman/python/test/unit_tests/test_memory.py

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121

2222
@patch("pyzes.getFunctionPointerList")
2323
class TestMemoryFunctions(unittest.TestCase):
24-
2524
def setUp(self):
2625
import pyzes
2726

@@ -108,7 +107,8 @@ def mock_get_state(memory_handle, state_ptr):
108107

109108
memory_handle = self.pyzes.zes_mem_handle_t()
110109
mem_state = self.pyzes.zes_mem_state_t()
111-
result = self.pyzes.zesMemoryGetState(memory_handle, byref(mem_state))
110+
with patch("pyzes.is_root_user", return_value=True):
111+
result = self.pyzes.zesMemoryGetState(memory_handle, byref(mem_state))
112112

113113
self.assertEqual(result, self.pyzes.ZE_RESULT_SUCCESS)
114114
self.assertEqual(mem_state.health, mock_health)
@@ -117,6 +117,19 @@ def mock_get_state(memory_handle, state_ptr):
117117
mock_get_func.assert_called_with("zesMemoryGetState")
118118
mock_func.assert_called_once()
119119

120+
@patch("pyzes.is_root_user", return_value=False)
121+
def test_GivenNonRootUserWhenCallingZesMemoryGetStateThenReturnInsufficientPermissions(
122+
self, mock_is_root_user, mock_get_func
123+
):
124+
memory_handle = self.pyzes.zes_mem_handle_t()
125+
mem_state = self.pyzes.zes_mem_state_t()
126+
127+
result = self.pyzes.zesMemoryGetState(memory_handle, byref(mem_state))
128+
129+
self.assertEqual(result, self.pyzes.ZE_RESULT_ERROR_INSUFFICIENT_PERMISSIONS)
130+
mock_is_root_user.assert_called_once_with()
131+
mock_get_func.assert_not_called()
132+
120133
def test_GivenValidMemoryHandleWhenCallingZesMemoryGetBandwidthThenCallSucceedsWithBandwidth(
121134
self, mock_get_func
122135
):
@@ -137,7 +150,10 @@ def mock_get_bandwidth(memory_handle, bandwidth_ptr):
137150

138151
memory_handle = self.pyzes.zes_mem_handle_t()
139152
mem_bandwidth = self.pyzes.zes_mem_bandwidth_t()
140-
result = self.pyzes.zesMemoryGetBandwidth(memory_handle, byref(mem_bandwidth))
153+
with patch("pyzes.is_root_user", return_value=True):
154+
result = self.pyzes.zesMemoryGetBandwidth(
155+
memory_handle, byref(mem_bandwidth)
156+
)
141157

142158
self.assertEqual(result, self.pyzes.ZE_RESULT_SUCCESS)
143159
self.assertEqual(mem_bandwidth.readCounter, mock_read_counter)
@@ -147,6 +163,19 @@ def mock_get_bandwidth(memory_handle, bandwidth_ptr):
147163
mock_get_func.assert_called_with("zesMemoryGetBandwidth")
148164
mock_func.assert_called_once()
149165

166+
@patch("pyzes.is_root_user", return_value=False)
167+
def test_GivenNonRootUserWhenCallingZesMemoryGetBandwidthThenReturnInsufficientPermissions(
168+
self, mock_is_root_user, mock_get_func
169+
):
170+
memory_handle = self.pyzes.zes_mem_handle_t()
171+
mem_bandwidth = self.pyzes.zes_mem_bandwidth_t()
172+
173+
result = self.pyzes.zesMemoryGetBandwidth(memory_handle, byref(mem_bandwidth))
174+
175+
self.assertEqual(result, self.pyzes.ZE_RESULT_ERROR_INSUFFICIENT_PERMISSIONS)
176+
mock_is_root_user.assert_called_once_with()
177+
mock_get_func.assert_not_called()
178+
150179

151180
if __name__ == "__main__":
152181
unittest.main()

bindings/sysman/python/test/unit_tests/test_power.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,28 @@ def mock_get_energy(power_handle, energy_ptr):
6565
power_handle = self.pyzes.zes_pwr_handle_t()
6666
energy = self.pyzes.zes_power_energy_counter_t()
6767

68-
result = self.pyzes.zesPowerGetEnergyCounter(power_handle, byref(energy))
68+
with patch("pyzes.is_root_user", return_value=True):
69+
result = self.pyzes.zesPowerGetEnergyCounter(power_handle, byref(energy))
6970

7071
self.assertEqual(result, self.pyzes.ZE_RESULT_SUCCESS)
7172
self.assertEqual(energy.energy, mock_energy)
7273
self.assertEqual(energy.timestamp, mock_timestamp)
7374
mock_get_func.assert_called_with("zesPowerGetEnergyCounter")
7475
mock_func.assert_called_once()
7576

77+
@patch("pyzes.is_root_user", return_value=False)
78+
def test_GivenNonRootUserWhenCallingZesPowerGetEnergyCounterThenReturnInsufficientPermissions(
79+
self, mock_is_root_user, mock_get_func
80+
):
81+
power_handle = self.pyzes.zes_pwr_handle_t()
82+
energy = self.pyzes.zes_power_energy_counter_t()
83+
84+
result = self.pyzes.zesPowerGetEnergyCounter(power_handle, byref(energy))
85+
86+
self.assertEqual(result, self.pyzes.ZE_RESULT_ERROR_INSUFFICIENT_PERMISSIONS)
87+
mock_is_root_user.assert_called_once_with()
88+
mock_get_func.assert_not_called()
89+
7690
def test_GivenValidPowerHandleWhenCallingZesPowerGetUsageThenCallSucceedsWithUsageData(
7791
self, mock_get_func
7892
):

bindings/sysman/python/test/unit_tests/test_temperature.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,13 +137,27 @@ def mock_get_state(temp_handle, temperature_ptr):
137137

138138
temp_handle = self.pyzes.zes_temp_handle_t()
139139
temperature = c_double()
140-
result = self.pyzes.zesTemperatureGetState(temp_handle, byref(temperature))
140+
with patch("pyzes.is_root_user", return_value=True):
141+
result = self.pyzes.zesTemperatureGetState(temp_handle, byref(temperature))
141142

142143
self.assertEqual(result, self.pyzes.ZE_RESULT_SUCCESS)
143144
self.assertEqual(temperature.value, mock_temperature)
144145
mock_get_func.assert_called_with("zesTemperatureGetState")
145146
mock_func.assert_called_once()
146147

148+
@patch("pyzes.is_root_user", return_value=False)
149+
def test_GivenNonRootUserWhenCallingZesTemperatureGetStateThenReturnInsufficientPermissions(
150+
self, mock_is_root_user, mock_get_func
151+
):
152+
temp_handle = self.pyzes.zes_temp_handle_t()
153+
temperature = c_double()
154+
155+
result = self.pyzes.zesTemperatureGetState(temp_handle, byref(temperature))
156+
157+
self.assertEqual(result, self.pyzes.ZE_RESULT_ERROR_INSUFFICIENT_PERMISSIONS)
158+
mock_is_root_user.assert_called_once_with()
159+
mock_get_func.assert_not_called()
160+
147161

148162
if __name__ == "__main__":
149163
unittest.main()

0 commit comments

Comments
 (0)