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
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