RDC module framework
The framework is required for RAS integration. When the RAS fields
need to be retrieved, the framework will load the RAS library at run time,
and then call the RAS function to retrieve RAS metrics.
* The RdcModuleMgr will be used to manage different modules. RDC
only has the telemetry module now.
* When RDCTelemetryModule is loaded, it will load the RAS library.
It will also call rdc_telemetry_fields_query() defined in the RAS
library for the list of fields RAS supported.
* The RdcSmiLib is a wrapper for the rocm_msi_lib to provide the
interface required by the RDCTelemetryModule.
* The RdcWatchTable will use the RdcModuleMgr to get the
RDCTelemetryModule to bulk fetch mulitple fields.
* The RdcTelemetryModule will dispatch those fields to different
library: RdcSmiLib or RdcRasLib.
The watch() and unwatch() in the RDCTelemetryModule will been implemented
at the next task.
Change-Id: I81b01d5b52d1ea3cdcec7c09af86b6622dd5899e
[ROCm/rdc commit: ba35cdcfe2]
Ta zmiana jest zawarta w:
%! (template.HTML=
Bill(Shuzhou) Liu)złożyło 2020-09-02 14:46:40 -04:00
1 rodzic
dbfc169a4e
złożenie
32e91cf8d2
19 plików zmienionych
+934
-72
Żadne pliki nie pasują do Twojego wyszukiwania
@@ -36,6 +36,11 @@ class RdcLibraryLoader {
|
||||
public:
|
||||
RdcLibraryLoader();
|
||||
|
||||
rdc_status_t load(const char* filename);
|
||||
|
||||
template<typename T> rdc_status_t load_symbol(T* func_handler,
|
||||
const char* func_name);
|
||||
|
||||
template<typename T> rdc_status_t load(const char* filename,
|
||||
T* func_make_handler);
|
||||
|
||||
@@ -48,35 +53,44 @@ class RdcLibraryLoader {
|
||||
std::mutex library_mutex_;
|
||||
};
|
||||
|
||||
template<typename T> rdc_status_t RdcLibraryLoader::load_symbol(T* func_handler,
|
||||
const char* func_name) {
|
||||
if (!libHandler_) {
|
||||
RDC_LOG(RDC_ERROR, "Must load the library before load the symbol");
|
||||
return RDC_ST_FAIL_LOAD_MODULE;
|
||||
}
|
||||
|
||||
if (!func_handler || !func_name) {
|
||||
return RDC_ST_FAIL_LOAD_MODULE;
|
||||
}
|
||||
|
||||
std::lock_guard<std::mutex> guard(library_mutex_);
|
||||
|
||||
*reinterpret_cast<void**>(func_handler) =
|
||||
dlsym(libHandler_, func_name);
|
||||
if (*func_handler == nullptr) {
|
||||
char* error = dlerror();
|
||||
RDC_LOG(RDC_ERROR, "RdcLibraryLoader: Fail to load the symbol "
|
||||
<< func_name << ": " << error);
|
||||
return RDC_ST_FAIL_LOAD_MODULE;
|
||||
}
|
||||
|
||||
return RDC_ST_OK;
|
||||
}
|
||||
|
||||
|
||||
template<typename T> rdc_status_t RdcLibraryLoader::load(const char* filename,
|
||||
T* func_make_handler) {
|
||||
if (filename == nullptr || func_make_handler == nullptr) {
|
||||
return RDC_ST_FAIL_LOAD_MODULE;
|
||||
}
|
||||
|
||||
if (libHandler_) {
|
||||
unload();
|
||||
rdc_status_t status = load(filename);
|
||||
if (status != RDC_ST_OK) {
|
||||
return status;
|
||||
}
|
||||
|
||||
std::lock_guard<std::mutex> guard(library_mutex_);
|
||||
libHandler_ = dlopen(filename, RTLD_LAZY);
|
||||
if (!libHandler_) {
|
||||
char* error = dlerror();
|
||||
RDC_LOG(RDC_ERROR, "Fail to open " << filename <<": " << error);
|
||||
return RDC_ST_FAIL_LOAD_MODULE;
|
||||
}
|
||||
|
||||
*reinterpret_cast<void**>(func_make_handler) =
|
||||
dlsym(libHandler_, "make_handler");
|
||||
if (*func_make_handler == nullptr) {
|
||||
char* error = dlerror();
|
||||
RDC_LOG(RDC_ERROR,
|
||||
"Fail to find function make_handler from file "
|
||||
<< filename <<": " << error);
|
||||
return RDC_ST_FAIL_LOAD_MODULE;
|
||||
}
|
||||
|
||||
return RDC_ST_OK;
|
||||
return load_symbol(func_make_handler, "make_handler");
|
||||
}
|
||||
|
||||
} // namespace rdc
|
||||
|
||||
Reference in new issue
Zablokuj użytkownika