aboutsummaryrefslogtreecommitdiffstats
path: root/libsmctrl.c
diff options
context:
space:
mode:
authorJoshua Bakita <bakitajoshua@gmail.com>2023-03-15 18:33:32 -0400
committerJoshua Bakita <bakitajoshua@gmail.com>2023-03-15 18:33:32 -0400
commitd827c6c152c8dd52463f82ef11ccdfc66083a9db (patch)
tree642cc6684b1e8d026a088f7151dc522bc681b5ac /libsmctrl.c
parent7db0d3088a6e25c7c64999a20267f55751571dee (diff)
Correct a sign-extension issue in libsmctrl_get_gpc_info()
This function would previously would yield invalid results for GPUs with more than 31 TPCs.
Diffstat (limited to 'libsmctrl.c')
-rw-r--r--libsmctrl.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/libsmctrl.c b/libsmctrl.c
index 69b19a1..640001a 100644
--- a/libsmctrl.c
+++ b/libsmctrl.c
@@ -281,6 +281,7 @@ static int read_int_procfile(char* filename, uint64_t* out) {
281} 281}
282 282
283static uint64_t tpc_mask_per_gpc_per_dev[16][12]; 283static uint64_t tpc_mask_per_gpc_per_dev[16][12];
284// Output mask is vtpc-indexed (virtual TPC)
284int libsmctrl_get_gpc_info(uint32_t* num_enabled_gpcs, uint64_t** tpcs_for_gpc, int dev) { 285int libsmctrl_get_gpc_info(uint32_t* num_enabled_gpcs, uint64_t** tpcs_for_gpc, int dev) {
285 uint32_t i, j, vtpc_idx = 0; 286 uint32_t i, j, vtpc_idx = 0;
286 uint64_t gpc_mask, num_tpc_per_gpc, max_gpcs, gpc_tpc_mask; 287 uint64_t gpc_mask, num_tpc_per_gpc, max_gpcs, gpc_tpc_mask;
@@ -322,7 +323,7 @@ int libsmctrl_get_gpc_info(uint32_t* num_enabled_gpcs, uint64_t** tpcs_for_gpc,
322 // Skip disabled TPCs 323 // Skip disabled TPCs
323 if ((1 << j) & gpc_tpc_mask) 324 if ((1 << j) & gpc_tpc_mask)
324 continue; 325 continue;
325 *tpc_mask |= (1 << vtpc_idx); 326 *tpc_mask |= (1ull << vtpc_idx);
326 vtpc_idx++; 327 vtpc_idx++;
327 } 328 }
328 } 329 }