From 1429d987f556f7fcba89dbfe9b80472a3e807e7c Mon Sep 17 00:00:00 2001 From: Chris Freehill Date: Wed, 15 May 2019 16:46:23 -0500 Subject: [PATCH] Check for root access early for functions that require it [ROCm/amdsmi commit: 7b9ff01a37063c9d3322c2ac24e08a04586f6642] --- projects/amdsmi/include/rocm_smi/rocm_smi.h | 3 ++- .../amdsmi/include/rocm_smi/rocm_smi_main.h | 5 ++++- projects/amdsmi/src/rocm_smi.cc | 17 +++++++++++++++-- projects/amdsmi/src/rocm_smi_main.cc | 5 +++-- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/projects/amdsmi/include/rocm_smi/rocm_smi.h b/projects/amdsmi/include/rocm_smi/rocm_smi.h index 4336a76d29..acf27e7718 100755 --- a/projects/amdsmi/include/rocm_smi/rocm_smi.h +++ b/projects/amdsmi/include/rocm_smi/rocm_smi.h @@ -91,7 +91,8 @@ typedef enum { //!< version running on the executing //!< machine RSMI_STATUS_PERMISSION, //!< Permission denied/EACCESS file - //!< error + //!< error. Many functions require + //!< root access to run. RSMI_STATUS_OUT_OF_RESOURCES, //!< Unable to acquire memory or other //!< resource RSMI_STATUS_INTERNAL_EXCEPTION, //!< An internal exception was caught diff --git a/projects/amdsmi/include/rocm_smi/rocm_smi_main.h b/projects/amdsmi/include/rocm_smi/rocm_smi_main.h index 46a626cc3f..284f41698f 100755 --- a/projects/amdsmi/include/rocm_smi/rocm_smi_main.h +++ b/projects/amdsmi/include/rocm_smi/rocm_smi_main.h @@ -62,7 +62,7 @@ namespace smi { class RocmSMI { public: - RocmSMI(uint64_t flags); + explicit RocmSMI(uint64_t flags); ~RocmSMI(void); static RocmSMI& getInstance(uint64_t flags = 0); @@ -82,6 +82,8 @@ class RocmSMI { void set_init_options(uint64_t options) {init_options_ = options;} uint64_t init_options() const {return init_options_;} + uint32_t euid() const {return euid_;} + private: std::vector> devices_; std::vector> monitors_; @@ -95,6 +97,7 @@ class RocmSMI { static std::vector> s_monitor_devices; RocmSMI_env_vars env_vars_; uint64_t init_options_; + uint32_t euid_; }; } // namespace smi diff --git a/projects/amdsmi/src/rocm_smi.cc b/projects/amdsmi/src/rocm_smi.cc index 52de37df0b..fe33abed07 100755 --- a/projects/amdsmi/src/rocm_smi.cc +++ b/projects/amdsmi/src/rocm_smi.cc @@ -101,6 +101,11 @@ static rsmi_status_t handleException() { std::shared_ptr dev = smi.monitor_devices()[dv_ind]; \ assert(dev != nullptr); +#define REQUIRE_ROOT_ACCESS \ + if (amd::smi::RocmSMI::getInstance().euid()) { \ + return RSMI_STATUS_PERMISSION; \ + } + #define DEVICE_MUTEX \ amd::smi::pthread_wrap _pw(*get_mutex(dv_ind)); \ amd::smi::ScopedPthread _lock(_pw); @@ -729,6 +734,8 @@ rsmi_dev_overdrive_level_get(uint32_t dv_ind, uint32_t *od) { rsmi_status_t rsmi_dev_overdrive_level_set(int32_t dv_ind, uint32_t od) { TRY + REQUIRE_ROOT_ACCESS + if (od > kMaxOverdriveLevel) { return RSMI_STATUS_INVALID_ARGS; } @@ -740,6 +747,8 @@ rsmi_dev_overdrive_level_set(int32_t dv_ind, uint32_t od) { rsmi_status_t rsmi_dev_perf_level_set(int32_t dv_ind, rsmi_dev_perf_level_t perf_level) { TRY + REQUIRE_ROOT_ACCESS + if (perf_level > RSMI_DEV_PERF_LEVEL_LAST) { return RSMI_STATUS_INVALID_ARGS; } @@ -1082,7 +1091,7 @@ rsmi_dev_gpu_clk_freq_set(uint32_t dv_ind, rsmi_frequencies_t freqs; TRY - + REQUIRE_ROOT_ACCESS DEVICE_MUTEX ret = rsmi_dev_gpu_clk_freq_get(dv_ind, clk_type, &freqs); @@ -1363,7 +1372,7 @@ rsmi_dev_pci_bandwidth_set(uint32_t dv_ind, uint64_t bw_bitmask) { rsmi_pcie_bandwidth_t bws; TRY - + REQUIRE_ROOT_ACCESS DEVICE_MUTEX ret = rsmi_dev_pci_bandwidth_get(dv_ind, &bws); @@ -1569,6 +1578,7 @@ rsmi_dev_fan_speed_set(uint32_t dv_ind, uint32_t sensor_ind, uint64_t speed) { rsmi_status_t ret; uint64_t max_speed; + REQUIRE_ROOT_ACCESS DEVICE_MUTEX ret = rsmi_dev_fan_speed_max_get(dv_ind, sensor_ind, &max_speed); @@ -1735,6 +1745,7 @@ rsmi_dev_power_cap_set(uint32_t dv_ind, uint32_t sensor_ind, uint64_t cap) { rsmi_status_t ret; uint64_t min, max; + REQUIRE_ROOT_ACCESS DEVICE_MUTEX ret = rsmi_dev_power_cap_range_get(dv_ind, sensor_ind, &max, &min); @@ -1774,6 +1785,8 @@ rsmi_status_t rsmi_dev_power_profile_set(uint32_t dv_ind, uint32_t sensor_ind, rsmi_power_profile_preset_masks_t profile) { TRY + REQUIRE_ROOT_ACCESS + ++sensor_ind; // power sysfs files have 1-based indices DEVICE_MUTEX diff --git a/projects/amdsmi/src/rocm_smi_main.cc b/projects/amdsmi/src/rocm_smi_main.cc index 901d392b08..7185cfd2d8 100755 --- a/projects/amdsmi/src/rocm_smi_main.cc +++ b/projects/amdsmi/src/rocm_smi_main.cc @@ -241,6 +241,8 @@ RocmSMI::Initialize(uint64_t flags) { init_options_ = flags; + euid_ = geteuid(); + GetEnvVariables(); while (std::string(kAMDMonitorTypes[i]) != "") { @@ -335,10 +337,9 @@ RocmSMI::AddToDeviceList(std::string dev_name) { return; } -static const uint32_t kAmdGpuId=0x1002; +static const uint32_t kAmdGpuId = 0x1002; static bool isAMDGPU(std::string dev_path) { - std::string vend_path = dev_path + "/device/vendor"; if (!FileExists(vend_path.c_str())) { return false;