From 60b191ed5b99bd05fb31b33697b15be7f479befd Mon Sep 17 00:00:00 2001 From: Johannes M Dieterich Date: Mon, 8 Nov 2021 15:52:44 -0600 Subject: [PATCH] Fix rocminfo when run within docker environments. Currently, rocminfo will fail when executed inside a docker container due to being unable to lsmod inside docker. This has impacts on rocprofiler use. Fix this behavior by querying initstate of the amdgpu module from /sys/module/amdgpu instead. If initstate is marked "live" everything if fine - error out with either "not loaded" (initstate file does not exist) or "not live" (initstate file does not contain "live" string). --- rocminfo.cc | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/rocminfo.cc b/rocminfo.cc index ee01f60..1475238 100755 --- a/rocminfo.cc +++ b/rocminfo.cc @@ -51,6 +51,7 @@ #include #include +#include #include #include #include @@ -1035,14 +1036,31 @@ AcquireAndDisplayAgentInfo(hsa_agent_t agent, void* data) { int CheckInitialState(void) { // Check kernel module for ROCk is loaded - FILE *fd = popen("lsmod | grep amdgpu", "r"); - char buf[16]; - if (fread (buf, 1, sizeof (buf), fd) <= 0) { + std::ifstream amdgpu_initstate( "/sys/module/amdgpu/initstate" ); + if (amdgpu_initstate){ + std::stringstream buffer; + buffer << amdgpu_initstate.rdbuf(); + amdgpu_initstate.close(); + + std::string line; + bool is_live = false; + while (std::getline(buffer, line)){ + if (line.find( "live" ) != std::string::npos){ + is_live = true; + break; + } + } + if (is_live){ + printf("%sROCk module is loaded%s\n", COL_WHT, COL_RESET); + } else { + printf("%sROCk module is NOT live, possibly no GPU devices%s\n", + COL_RED, COL_RESET); + return -1; + } + } else { printf("%sROCk module is NOT loaded, possibly no GPU devices%s\n", COL_RED, COL_RESET); return -1; - } else { - printf("%sROCk module is loaded%s\n", COL_WHT, COL_RESET); } // Check if user belongs to the group for /dev/kfd (e.g. "video" or