From 22516a3b63bdd9d0735a188cbbebad4062a458ad Mon Sep 17 00:00:00 2001 From: Divya Shikre Date: Fri, 11 Dec 2020 18:41:06 -0500 Subject: [PATCH] Fix for error while reading gpu_metrics sysfs file Signed-off-by: Divya Shikre Change-Id: If69b7eeb3573ebece9ed0cb539f5ddffbe3c2f09 [ROCm/amdsmi commit: efd234c9e33b792788883a365b991d87c838499e] --- .../amdsmi/include/rocm_smi/rocm_smi_device.h | 7 +++--- .../amdsmi/include/rocm_smi/rocm_smi_utils.h | 4 +-- projects/amdsmi/src/rocm_smi.cc | 17 ++++++------- projects/amdsmi/src/rocm_smi_device.cc | 25 +++++++++++-------- projects/amdsmi/src/rocm_smi_utils.cc | 11 ++++---- 5 files changed, 34 insertions(+), 30 deletions(-) diff --git a/projects/amdsmi/include/rocm_smi/rocm_smi_device.h b/projects/amdsmi/include/rocm_smi/rocm_smi_device.h index 8e45ecfb53..34d2f7f215 100755 --- a/projects/amdsmi/include/rocm_smi/rocm_smi_device.h +++ b/projects/amdsmi/include/rocm_smi/rocm_smi_device.h @@ -178,7 +178,8 @@ class Device { int readDevInfoLine(DevInfoTypes type, std::string *line); int readDevInfo(DevInfoTypes type, std::string *val); int readDevInfo(DevInfoTypes type, std::vector *retVec); - int readDevInfo(DevInfoTypes type, std::vector *retVec); + int readDevInfo(DevInfoTypes type, std::size_t b_size, + void *p_binary_data); int writeDevInfo(DevInfoTypes type, uint64_t val); int writeDevInfo(DevInfoTypes type, std::string val); @@ -220,8 +221,8 @@ class Device { int readDevInfoStr(DevInfoTypes type, std::string *retStr); int readDevInfoMultiLineStr(DevInfoTypes type, std::vector *retVec); - int readDevInfoBinary(DevInfoTypes type, - std::vector *retVec); + int readDevInfoBinary(DevInfoTypes type, std::size_t b_size, + void *p_binary_data); int writeDevInfoStr(DevInfoTypes type, std::string valStr); uint64_t bdfid_; uint64_t kfd_gpu_id_; diff --git a/projects/amdsmi/include/rocm_smi/rocm_smi_utils.h b/projects/amdsmi/include/rocm_smi/rocm_smi_utils.h index 8df82d3dfa..a8f4cfa848 100755 --- a/projects/amdsmi/include/rocm_smi/rocm_smi_utils.h +++ b/projects/amdsmi/include/rocm_smi/rocm_smi_utils.h @@ -81,8 +81,8 @@ rsmi_status_t GetDevValueVec(amd::smi::DevInfoTypes type, uint32_t dv_ind, std::vector *val_vec); rsmi_status_t -GetDevBinaryVec(amd::smi::DevInfoTypes type, - uint32_t dv_ind, std::vector *val_vec); +GetDevBinaryBlob(amd::smi::DevInfoTypes type, + uint32_t dv_ind, std::size_t b_size, void* p_binary_data); rsmi_status_t ErrnoToRsmiStatus(int err); struct pthread_wrap { diff --git a/projects/amdsmi/src/rocm_smi.cc b/projects/amdsmi/src/rocm_smi.cc index 7963b007f0..ea1ebff78e 100755 --- a/projects/amdsmi/src/rocm_smi.cc +++ b/projects/amdsmi/src/rocm_smi.cc @@ -2224,19 +2224,18 @@ rsmi_dev_gpu_metrics_info_get(uint32_t dv_ind, rsmi_gpu_metrics_t *smu) { DEVICE_MUTEX CHK_SUPPORT_NAME_ONLY(smu) - std::vector val_vec; - rsmi_status_t ret = GetDevBinaryVec(amd::smi::kDevGpuMetrics, dv_ind, - &val_vec); + rsmi_status_t ret = GetDevBinaryBlob(amd::smi::kDevGpuMetrics, dv_ind, + sizeof(rsmi_gpu_metrics_t), smu); + + // only supports gpu_metrics_v1_0 version + if (smu->common_header.format_revision != 1) { + return RSMI_STATUS_NOT_SUPPORTED; + } + if (ret != RSMI_STATUS_SUCCESS) { return ret; } - if (val_vec.size() == 0) { - return RSMI_STATUS_NOT_YET_IMPLEMENTED; - } - - smu = reinterpret_cast(val_vec.data()); - return ret; CATCH } diff --git a/projects/amdsmi/src/rocm_smi_device.cc b/projects/amdsmi/src/rocm_smi_device.cc index f5f6fcdfd5..1d5cd5828f 100755 --- a/projects/amdsmi/src/rocm_smi_device.cc +++ b/projects/amdsmi/src/rocm_smi_device.cc @@ -638,21 +638,23 @@ int Device::readDevInfoLine(DevInfoTypes type, std::string *line) { return 0; } -int Device::readDevInfoBinary(DevInfoTypes type, - std::vector *retVec) { +int Device::readDevInfoBinary(DevInfoTypes type, std::size_t b_size, + void *p_binary_data) { auto sysfs_path = path_; + FILE *ptr; sysfs_path += "/device/"; sysfs_path += kDevAttribNameMap.at(type); - - std::ifstream fs(sysfs_path, std::ios::binary); - if (!fs.is_open()) { + ptr = fopen(sysfs_path.c_str(), "rb"); + if (!ptr) { return errno; } - // copies all data into buffer - retVec->insert(retVec->begin(), - std::istreambuf_iterator(fs), {}); + size_t num = fread(p_binary_data, b_size, 1, ptr); + fclose(ptr); + if((num*b_size) != b_size){ + return ENOENT; + } return 0; } @@ -792,12 +794,13 @@ int Device::readDevInfo(DevInfoTypes type, std::vector *val) { return 0; } -int Device::readDevInfo(DevInfoTypes type, std::vector *val) { - assert(val != nullptr); +int Device::readDevInfo(DevInfoTypes type, std::size_t b_size, + void *p_binary_data) { + assert(p_binary_data != nullptr); switch (type) { case kDevGpuMetrics: - return readDevInfoBinary(type, val); + return readDevInfoBinary(type, b_size, p_binary_data); break; default: diff --git a/projects/amdsmi/src/rocm_smi_utils.cc b/projects/amdsmi/src/rocm_smi_utils.cc index 41c2559f22..0044f22b0c 100755 --- a/projects/amdsmi/src/rocm_smi_utils.cc +++ b/projects/amdsmi/src/rocm_smi_utils.cc @@ -204,15 +204,16 @@ rsmi_status_t GetDevValueVec(amd::smi::DevInfoTypes type, return ErrnoToRsmiStatus(ret); } -rsmi_status_t GetDevBinaryVec(amd::smi::DevInfoTypes type, - uint32_t dv_ind, std::vector *val_vec) { - assert(val_vec != nullptr); - if (val_vec == nullptr) { +rsmi_status_t +GetDevBinaryBlob(amd::smi::DevInfoTypes type, + uint32_t dv_ind, std::size_t b_size, void* p_binary_data) { + assert(p_binary_data != nullptr); + if (p_binary_data == nullptr) { return RSMI_STATUS_INVALID_ARGS; } GET_DEV_FROM_INDX - int ret = dev->readDevInfo(type, val_vec); + int ret = dev->readDevInfo(type, b_size, p_binary_data); return ErrnoToRsmiStatus(ret); }