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:
Chris Freehill
2019-08-06 11:05:23 -05:00
parent 1f67dcece3
commit c858103137
7 changed files with 363 additions and 1 deletions
+72
View File
@@ -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) {
+4 -1
View File
@@ -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;