Add support for rsmi_dev_memory_reserved_pages_get()
Also, don't return an error for empty sysfs files. The reserved memory
page file will often have no lines. We don't want it to appear that
this function is not supported if the file is empty.
Change-Id: I1d28bb184ea587bb578fe71dd75adc2a812d09a8
[ROCm/amdsmi commit: 73c54e1fd0]
This commit is contained in:
@@ -2477,6 +2477,78 @@ rsmi_compute_process_info_get(rsmi_process_info_t *procs,
|
||||
CATCH
|
||||
}
|
||||
|
||||
rsmi_status_t
|
||||
rsmi_dev_memory_reserved_pages_get(uint32_t dv_ind, uint32_t *num_pages,
|
||||
rsmi_retired_page_record_t *records) {
|
||||
TRY
|
||||
|
||||
rsmi_status_t ret;
|
||||
|
||||
if (num_pages == nullptr) {
|
||||
return RSMI_STATUS_INVALID_ARGS;
|
||||
}
|
||||
|
||||
std::vector<std::string> val_vec;
|
||||
|
||||
ret = get_dev_value_vec(amd::smi::kDevMemPageBad, dv_ind, &val_vec);
|
||||
|
||||
if (ret == RSMI_STATUS_FILE_ERROR) {
|
||||
return RSMI_STATUS_NOT_SUPPORTED;
|
||||
}
|
||||
if (ret != RSMI_STATUS_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (records == nullptr || *num_pages > val_vec.size()) {
|
||||
*num_pages = val_vec.size();
|
||||
}
|
||||
if (records == nullptr) {
|
||||
return RSMI_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Fill in records
|
||||
char status_code;
|
||||
rsmi_memory_page_status_t tmp_stat;
|
||||
std::string junk;
|
||||
|
||||
for (uint32_t i = 0; i < *num_pages; ++i) {
|
||||
std::istringstream fs1(val_vec[i]);
|
||||
|
||||
fs1 >> std::hex >> records[i].page_address;
|
||||
fs1 >> junk;
|
||||
assert(junk == ":");
|
||||
fs1 >> std::hex >> records[i].page_size;
|
||||
fs1 >> junk;
|
||||
assert(junk == ":");
|
||||
fs1 >> status_code;
|
||||
|
||||
switch (status_code) {
|
||||
case 'P':
|
||||
tmp_stat = RSMI_MEM_PAGE_STATUS_PENDING;
|
||||
break;
|
||||
|
||||
case 'F':
|
||||
tmp_stat = RSMI_MEM_PAGE_STATUS_UNRESERVABLE;
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
tmp_stat = RSMI_MEM_PAGE_STATUS_RESERVED;
|
||||
break;
|
||||
default:
|
||||
assert(!"Unexpected retired memory page status code read");
|
||||
return RSMI_STATUS_UNKNOWN_ERROR;
|
||||
}
|
||||
records[i].status = tmp_stat;
|
||||
}
|
||||
if (*num_pages < val_vec.size()) {
|
||||
return RSMI_STATUS_INSUFFICIENT_SIZE;
|
||||
}
|
||||
|
||||
return RSMI_STATUS_SUCCESS;
|
||||
|
||||
CATCH
|
||||
}
|
||||
|
||||
rsmi_status_t
|
||||
rsmi_compute_process_info_by_pid_get(uint32_t pid,
|
||||
rsmi_process_info_t *proc) {
|
||||
|
||||
@@ -91,6 +91,7 @@ static const char *kDevErrCntSDMAFName = "ras/sdma_err_count";
|
||||
static const char *kDevErrCntUMCFName = "ras/umc_err_count";
|
||||
static const char *kDevErrCntGFXFName = "ras/gfx_err_count";
|
||||
static const char *kDevErrCntFeaturesFName = "ras/features";
|
||||
static const char *kDevMemPageBadFName = "ras/gpu_vram_bad_pages";
|
||||
static const char *kDevMemTotGTTFName = "mem_info_gtt_total";
|
||||
static const char *kDevMemTotVisVRAMFName = "mem_info_vis_vram_total";
|
||||
static const char *kDevMemTotVRAMFName = "mem_info_vram_total";
|
||||
@@ -194,6 +195,7 @@ static const std::map<DevInfoTypes, const char *> kDevAttribNameMap = {
|
||||
{kDevFwVersionVce, kDevFwVersionVceFName},
|
||||
{kDevFwVersionVcn, kDevFwVersionVcnFName},
|
||||
{kDevSerialNumber, kDevSerialNumberFName},
|
||||
{kDevMemPageBad, kDevMemPageBadFName},
|
||||
};
|
||||
|
||||
static const std::map<rsmi_dev_perf_level, const char *> kDevPerfLvlMap = {
|
||||
@@ -394,7 +396,7 @@ int Device::readDevInfoMultiLineStr(DevInfoTypes type,
|
||||
}
|
||||
|
||||
if (retVec->size() == 0) {
|
||||
return EPERM;
|
||||
return 0;
|
||||
}
|
||||
// Remove any *trailing* empty (whitespace) lines
|
||||
while (retVec->back().find_first_not_of(" \t\n\v\f\r") == std::string::npos) {
|
||||
@@ -484,6 +486,7 @@ int Device::readDevInfo(DevInfoTypes type, std::vector<std::string> *val) {
|
||||
case kDevErrCntUMC:
|
||||
case kDevErrCntGFX:
|
||||
case kDevErrCntFeatures:
|
||||
case kDevMemPageBad:
|
||||
return readDevInfoMultiLineStr(type, val);
|
||||
break;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user