LINT: Add cpplint, clang-format and pre-commit support

Change-Id: I3cbb787ef27d90486b212dfb1a8c77c460acc2ac
Signed-off-by: Galantsev, Dmitrii <dmitrii.galantsev@amd.com>
This commit is contained in:
Galantsev, Dmitrii
2023-12-04 15:24:34 -06:00
parent 95e057c88d
commit 434e40305d
137 changed files with 9122 additions and 10469 deletions
+7 -6
View File
@@ -23,19 +23,20 @@ THE SOFTWARE.
#define SERVER_INCLUDE_RDC_RDC_ADMIN_SERVICE_H_
#include "rdc.grpc.pb.h" // NOLINT
#include "rocm_smi/rocm_smi.h"
#include "rdc/rdc_admin_service.h"
#include "rocm_smi/rocm_smi.h"
namespace amd {
namespace rdc {
class RDCAdminServiceImpl final : public ::rdc::RdcAdmin::Service {
public:
RDCAdminServiceImpl();
~RDCAdminServiceImpl();
::grpc::Status VerifyConnection(::grpc::ServerContext* context,
const ::rdc::VerifyConnectionRequest* request,
::rdc::VerifyConnectionResponse* reply) override;
RDCAdminServiceImpl();
~RDCAdminServiceImpl();
::grpc::Status VerifyConnection(::grpc::ServerContext* context,
const ::rdc::VerifyConnectionRequest* request,
::rdc::VerifyConnectionResponse* reply) override;
private:
};
+69 -76
View File
@@ -30,108 +30,101 @@ namespace rdc {
class RdcAPIServiceImpl final : public ::rdc::RdcAPI::Service {
public:
RdcAPIServiceImpl();
~RdcAPIServiceImpl();
RdcAPIServiceImpl();
~RdcAPIServiceImpl();
rdc_status_t Initialize(uint64_t rdcd_init_flags = 0);
rdc_status_t Initialize(uint64_t rdcd_init_flags = 0);
::grpc::Status GetAllDevices(::grpc::ServerContext* context,
const ::rdc::Empty* request,
::rdc::GetAllDevicesResponse* reply) override;
::grpc::Status GetAllDevices(::grpc::ServerContext* context, const ::rdc::Empty* request,
::rdc::GetAllDevicesResponse* reply) override;
::grpc::Status GetDeviceAttributes(::grpc::ServerContext* context,
const ::rdc::GetDeviceAttributesRequest* request,
::rdc::GetDeviceAttributesResponse* reply) override;
::grpc::Status GetDeviceAttributes(::grpc::ServerContext* context,
const ::rdc::GetDeviceAttributesRequest* request,
::rdc::GetDeviceAttributesResponse* reply) override;
::grpc::Status CreateGpuGroup(::grpc::ServerContext* context,
const ::rdc::CreateGpuGroupRequest* request,
::rdc::CreateGpuGroupResponse* reply) override;
::grpc::Status CreateGpuGroup(::grpc::ServerContext* context,
const ::rdc::CreateGpuGroupRequest* request,
::rdc::CreateGpuGroupResponse* reply) override;
::grpc::Status AddToGpuGroup(::grpc::ServerContext* context,
const ::rdc::AddToGpuGroupRequest* request,
::rdc::AddToGpuGroupResponse* reply) override;
::grpc::Status AddToGpuGroup(::grpc::ServerContext* context,
const ::rdc::AddToGpuGroupRequest* request,
::rdc::AddToGpuGroupResponse* reply) override;
::grpc::Status GetGpuGroupInfo(::grpc::ServerContext* context,
const ::rdc::GetGpuGroupInfoRequest* request,
::rdc::GetGpuGroupInfoResponse* reply) override;
::grpc::Status GetGpuGroupInfo(::grpc::ServerContext* context,
const ::rdc::GetGpuGroupInfoRequest* request,
::rdc::GetGpuGroupInfoResponse* reply) override;
::grpc::Status GetGroupAllIds(::grpc::ServerContext* context,
const ::rdc::Empty* request,
::rdc::GetGroupAllIdsResponse* reply) override;
::grpc::Status GetGroupAllIds(::grpc::ServerContext* context, const ::rdc::Empty* request,
::rdc::GetGroupAllIdsResponse* reply) override;
::grpc::Status DestroyGpuGroup(::grpc::ServerContext* context,
const ::rdc::DestroyGpuGroupRequest* request,
::rdc::DestroyGpuGroupResponse* reply) override;
::grpc::Status DestroyGpuGroup(::grpc::ServerContext* context,
const ::rdc::DestroyGpuGroupRequest* request,
::rdc::DestroyGpuGroupResponse* reply) override;
::grpc::Status CreateFieldGroup(::grpc::ServerContext* context,
const ::rdc::CreateFieldGroupRequest* request,
::rdc::CreateFieldGroupResponse* reply) override;
::grpc::Status CreateFieldGroup(::grpc::ServerContext* context,
const ::rdc::CreateFieldGroupRequest* request,
::rdc::CreateFieldGroupResponse* reply) override;
::grpc::Status GetFieldGroupInfo(::grpc::ServerContext* context,
const ::rdc::GetFieldGroupInfoRequest* request,
::rdc::GetFieldGroupInfoResponse* reply) override;
::grpc::Status GetFieldGroupInfo(::grpc::ServerContext* context,
const ::rdc::GetFieldGroupInfoRequest* request,
::rdc::GetFieldGroupInfoResponse* reply) override;
::grpc::Status GetFieldGroupAllIds(::grpc::ServerContext* context,
const ::rdc::Empty* request,
::rdc::GetFieldGroupAllIdsResponse* reply) override;
::grpc::Status GetFieldGroupAllIds(::grpc::ServerContext* context, const ::rdc::Empty* request,
::rdc::GetFieldGroupAllIdsResponse* reply) override;
::grpc::Status DestroyFieldGroup(::grpc::ServerContext* context,
const ::rdc::DestroyFieldGroupRequest* request,
::rdc::DestroyFieldGroupResponse* reply) override;
::grpc::Status DestroyFieldGroup(::grpc::ServerContext* context,
const ::rdc::DestroyFieldGroupRequest* request,
::rdc::DestroyFieldGroupResponse* reply) override;
::grpc::Status WatchFields(::grpc::ServerContext* context,
const ::rdc::WatchFieldsRequest* request,
::rdc::WatchFieldsResponse* reply) override;
::grpc::Status WatchFields(::grpc::ServerContext* context,
const ::rdc::WatchFieldsRequest* request,
::rdc::WatchFieldsResponse* reply) override;
::grpc::Status GetLatestFieldValue(::grpc::ServerContext* context,
const ::rdc::GetLatestFieldValueRequest* request,
::rdc::GetLatestFieldValueResponse* reply) override;
::grpc::Status GetLatestFieldValue(::grpc::ServerContext* context,
const ::rdc::GetLatestFieldValueRequest* request,
::rdc::GetLatestFieldValueResponse* reply) override;
::grpc::Status GetFieldSince(::grpc::ServerContext* context,
const ::rdc::GetFieldSinceRequest* request,
::rdc::GetFieldSinceResponse* reply) override;
::grpc::Status GetFieldSince(::grpc::ServerContext* context,
const ::rdc::GetFieldSinceRequest* request,
::rdc::GetFieldSinceResponse* reply) override;
::grpc::Status UnWatchFields(::grpc::ServerContext* context,
const ::rdc::UnWatchFieldsRequest* request,
::rdc::UnWatchFieldsResponse* reply) override;
::grpc::Status UnWatchFields(::grpc::ServerContext* context,
const ::rdc::UnWatchFieldsRequest* request,
::rdc::UnWatchFieldsResponse* reply) override;
::grpc::Status UpdateAllFields(::grpc::ServerContext* context,
const ::rdc::UpdateAllFieldsRequest* request,
::rdc::UpdateAllFieldsResponse* reply) override;
::grpc::Status UpdateAllFields(::grpc::ServerContext* context,
const ::rdc::UpdateAllFieldsRequest* request,
::rdc::UpdateAllFieldsResponse* reply) override;
::grpc::Status StartJobStats(::grpc::ServerContext* context,
const ::rdc::StartJobStatsRequest* request,
::rdc::StartJobStatsResponse* reply) override;
::grpc::Status StartJobStats(::grpc::ServerContext* context,
const ::rdc::StartJobStatsRequest* request,
::rdc::StartJobStatsResponse* reply) override;
::grpc::Status GetJobStats(::grpc::ServerContext* context,
const ::rdc::GetJobStatsRequest* request,
::rdc::GetJobStatsResponse* reply) override;
::grpc::Status GetJobStats(::grpc::ServerContext* context,
const ::rdc::GetJobStatsRequest* request,
::rdc::GetJobStatsResponse* reply) override;
::grpc::Status StopJobStats(::grpc::ServerContext* context,
const ::rdc::StopJobStatsRequest* request,
::rdc::StopJobStatsResponse* reply) override;
::grpc::Status StopJobStats(::grpc::ServerContext* context,
const ::rdc::StopJobStatsRequest* request,
::rdc::StopJobStatsResponse* reply) override;
::grpc::Status RemoveJob(::grpc::ServerContext* context, const ::rdc::RemoveJobRequest* request,
::rdc::RemoveJobResponse* reply) override;
::grpc::Status RemoveJob(::grpc::ServerContext* context,
const ::rdc::RemoveJobRequest* request,
::rdc::RemoveJobResponse* reply) override;
::grpc::Status RemoveAllJob(::grpc::ServerContext* context, const ::rdc::Empty* request,
::rdc::RemoveAllJobResponse* reply) override;
::grpc::Status RemoveAllJob(::grpc::ServerContext* context,
const ::rdc::Empty* request,
::rdc::RemoveAllJobResponse* reply) override;
::grpc::Status DiagnosticRun(::grpc::ServerContext* context,
const ::rdc::DiagnosticRunRequest* request,
::rdc::DiagnosticRunResponse* reply) override;
::grpc::Status DiagnosticRun(::grpc::ServerContext* context,
const ::rdc::DiagnosticRunRequest* request,
::rdc::DiagnosticRunResponse* reply) override;
::grpc::Status DiagnosticTestCaseRun(::grpc::ServerContext* context,
const ::rdc::DiagnosticTestCaseRunRequest* request,
::rdc::DiagnosticTestCaseRunResponse* reply) override;
::grpc::Status DiagnosticTestCaseRun(::grpc::ServerContext* context,
const ::rdc::DiagnosticTestCaseRunRequest* request,
::rdc::DiagnosticTestCaseRunResponse* reply) override;
private:
bool copy_gpu_usage_info(const rdc_gpu_usage_info_t& src,
::rdc::GpuUsageInfo* target);
rdc_handle_t rdc_handle_;
bool copy_gpu_usage_info(const rdc_gpu_usage_info_t& src, ::rdc::GpuUsageInfo* target);
rdc_handle_t rdc_handle_;
};
} // namespace rdc
+19 -25
View File
@@ -23,46 +23,40 @@ THE SOFTWARE.
#define SERVER_INCLUDE_RDC_RDC_RSMI_SERVICE_H_
#include "rdc.grpc.pb.h" // NOLINT
#include "rocm_smi/rocm_smi.h"
#include "rdc/rdc_rsmi_service.h"
#include "rocm_smi/rocm_smi.h"
namespace amd {
namespace rdc {
class RsmiServiceImpl final : public ::rdc::Rsmi::Service {
public:
RsmiServiceImpl();
~RsmiServiceImpl();
RsmiServiceImpl();
~RsmiServiceImpl();
rsmi_status_t Initialize(uint64_t rsmi_init_flags = 0);
rsmi_status_t Initialize(uint64_t rsmi_init_flags = 0);
::grpc::Status
GetNumDevices(::grpc::ServerContext* context,
const ::rdc::GetNumDevicesRequest* request,
::rdc::GetNumDevicesResponse* reply) override;
::grpc::Status GetNumDevices(::grpc::ServerContext* context,
const ::rdc::GetNumDevicesRequest* request,
::rdc::GetNumDevicesResponse* reply) override;
::grpc::Status
GetTemperature(::grpc::ServerContext* context,
const ::rdc::GetTemperatureRequest* request,
::rdc::GetTemperatureResponse* response) override;
::grpc::Status GetTemperature(::grpc::ServerContext* context,
const ::rdc::GetTemperatureRequest* request,
::rdc::GetTemperatureResponse* response) override;
::grpc::Status
GetFanRpms(::grpc::ServerContext* context,
const ::rdc::GetFanRpmsRequest* request,
::rdc::GetFanRpmsResponse* response) override;
::grpc::Status GetFanRpms(::grpc::ServerContext* context, const ::rdc::GetFanRpmsRequest* request,
::rdc::GetFanRpmsResponse* response) override;
::grpc::Status
GetFanSpeed(::grpc::ServerContext* context,
const ::rdc::GetFanSpeedRequest* request,
::rdc::GetFanSpeedResponse* response) override;
::grpc::Status GetFanSpeed(::grpc::ServerContext* context,
const ::rdc::GetFanSpeedRequest* request,
::rdc::GetFanSpeedResponse* response) override;
::grpc::Status
GetFanSpeedMax(::grpc::ServerContext* context,
const ::rdc::GetFanSpeedMaxRequest* request,
::rdc::GetFanSpeedMaxResponse* response) override;
::grpc::Status GetFanSpeedMax(::grpc::ServerContext* context,
const ::rdc::GetFanSpeedMaxRequest* request,
::rdc::GetFanSpeedMaxResponse* response) override;
private:
bool rsmi_initialized_;
bool rsmi_initialized_;
};
} // namespace rdc
+28 -29
View File
@@ -24,12 +24,12 @@ THE SOFTWARE.
#include <grpcpp/grpcpp.h>
#include <string>
#include <memory>
#include <string>
#include "rdc/rdc_rsmi_service.h"
#include "rdc/rdc_admin_service.h"
#include "rdc/rdc_api_service.h"
#include "rdc/rdc_rsmi_service.h"
typedef struct {
std::string listen_address;
@@ -41,43 +41,42 @@ typedef struct {
class RDCServer {
public:
RDCServer();
~RDCServer();
RDCServer();
~RDCServer();
void Initialize(RdcdCmdLineOpts *cl);
void Initialize(RdcdCmdLineOpts* cl);
void Run(void);
void ShutDown(void);
void Run(void);
void ShutDown(void);
bool start_rsmi_service(void) const {return start_rsmi_service_;}
void set_start_rsmi_service(bool s) {start_rsmi_service_ = s;}
bool start_rsmi_service(void) const { return start_rsmi_service_; }
void set_start_rsmi_service(bool s) { start_rsmi_service_ = s; }
bool start_rdc_admin_service(void) const {return start_rdc_admin_service_;}
void set_start_rdc_admin_service(bool s) {start_rdc_admin_service_ = s;}
bool start_rdc_admin_service(void) const { return start_rdc_admin_service_; }
void set_start_rdc_admin_service(bool s) { start_rdc_admin_service_ = s; }
bool start_api_service(void) const {return start_api_service_;}
void set_start_api_service(bool s) {start_api_service_ = s;}
bool start_api_service(void) const { return start_api_service_; }
void set_start_api_service(bool s) { start_api_service_ = s; }
bool secure_creds(void) const {return secure_creds_;}
void set_secure_creds(bool s) {secure_creds_ = s;}
bool secure_creds(void) const { return secure_creds_; }
void set_secure_creds(bool s) { secure_creds_ = s; }
private:
void HandleSignal(int sig);
std::string server_address_;
std::unique_ptr<::grpc::Server> server_;
bool secure_creds_;
bool use_pinned_certs_;
bool log_debug_;
bool start_rsmi_service_;
amd::rdc::RsmiServiceImpl *rsmi_service_;
RdcdCmdLineOpts *cmd_line_;
void HandleSignal(int sig);
std::string server_address_;
std::unique_ptr<::grpc::Server> server_;
bool secure_creds_;
bool use_pinned_certs_;
bool log_debug_;
bool start_rsmi_service_;
amd::rdc::RsmiServiceImpl* rsmi_service_;
RdcdCmdLineOpts* cmd_line_;
bool start_rdc_admin_service_;
amd::rdc::RDCAdminServiceImpl *rdc_admin_service_;
bool start_rdc_admin_service_;
amd::rdc::RDCAdminServiceImpl* rdc_admin_service_;
bool start_api_service_;
amd::rdc::RdcAPIServiceImpl *api_service_;
bool start_api_service_;
amd::rdc::RdcAPIServiceImpl* api_service_;
};
#endif // SERVER_INCLUDE_RDC_RDC_SERVER_MAIN_H_
Executable → Regular
+11 -13
View File
@@ -20,31 +20,29 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#include "rdc/rdc_admin_service.h"
#include <assert.h>
#include <grpcpp/grpcpp.h>
#include <unistd.h>
#include <iostream>
#include <sstream>
#include <memory>
#include <string>
#include <csignal>
#include <iostream>
#include <memory>
#include <sstream>
#include <string>
#include "rdc.grpc.pb.h" // NOLINT
#include "rdc/rdc_admin_service.h"
namespace amd {
namespace rdc {
RDCAdminServiceImpl::RDCAdminServiceImpl() {
}
RDCAdminServiceImpl::RDCAdminServiceImpl() {}
RDCAdminServiceImpl::~RDCAdminServiceImpl() {
}
::grpc::Status
RDCAdminServiceImpl::VerifyConnection(::grpc::ServerContext* context,
const ::rdc::VerifyConnectionRequest* request,
::rdc::VerifyConnectionResponse* reply) {
RDCAdminServiceImpl::~RDCAdminServiceImpl() {}
::grpc::Status RDCAdminServiceImpl::VerifyConnection(::grpc::ServerContext* context,
const ::rdc::VerifyConnectionRequest* request,
::rdc::VerifyConnectionResponse* reply) {
(void)context; // Quiet warning for now
reply->set_echo_magic_num(request->magic_num());
Executable → Regular
+482 -542
View File
File diff suppressed because it is too large Load Diff
Executable → Regular
+28 -38
View File
@@ -20,23 +20,23 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#include "rdc/rdc_rsmi_service.h"
#include <assert.h>
#include <grpcpp/grpcpp.h>
#include <csignal>
#include <iostream>
#include <memory>
#include <string>
#include <csignal>
#include "rdc.grpc.pb.h" // NOLINT
#include "rocm_smi/rocm_smi.h"
#include "rdc/rdc_rsmi_service.h"
namespace amd {
namespace rdc {
RsmiServiceImpl::RsmiServiceImpl():rsmi_initialized_(false) {
}
RsmiServiceImpl::RsmiServiceImpl() : rsmi_initialized_(false) {}
RsmiServiceImpl::~RsmiServiceImpl() {
if (rsmi_initialized_) {
@@ -48,14 +48,12 @@ RsmiServiceImpl::~RsmiServiceImpl() {
// rsmi and rdc currently happen to have a 1-to-1 mapping, but
// have this function in case that changes
static rsmi_temperature_metric_t
rdc_temp2rsmi_temp(::rdc::GetTemperatureRequest_TemperatureMetric
rdc_temp) {
static rsmi_temperature_metric_t rdc_temp2rsmi_temp(
::rdc::GetTemperatureRequest_TemperatureMetric rdc_temp) {
return static_cast<rsmi_temperature_metric_t>(rdc_temp);
}
rsmi_status_t
RsmiServiceImpl::Initialize(uint64_t rsmi_init_flags) {
rsmi_status_t RsmiServiceImpl::Initialize(uint64_t rsmi_init_flags) {
rsmi_status_t rsmi_ret = rsmi_init(rsmi_init_flags);
if (rsmi_ret != RSMI_STATUS_SUCCESS) {
std::cout << "rsmi_init() returned error" << std::endl;
@@ -65,10 +63,9 @@ RsmiServiceImpl::Initialize(uint64_t rsmi_init_flags) {
return rsmi_ret;
}
::grpc::Status
RsmiServiceImpl::GetNumDevices(::grpc::ServerContext* context,
const ::rdc::GetNumDevicesRequest* request,
::rdc::GetNumDevicesResponse* reply) {
::grpc::Status RsmiServiceImpl::GetNumDevices(::grpc::ServerContext* context,
const ::rdc::GetNumDevicesRequest* request,
::rdc::GetNumDevicesResponse* reply) {
assert(reply != nullptr);
uint32_t num_devices;
@@ -88,65 +85,58 @@ RsmiServiceImpl::GetNumDevices(::grpc::ServerContext* context,
return ::grpc::Status::OK;
}
::grpc::Status
RsmiServiceImpl::GetTemperature(::grpc::ServerContext* context,
const ::rdc::GetTemperatureRequest* request,
::rdc::GetTemperatureResponse* response) {
::grpc::Status RsmiServiceImpl::GetTemperature(::grpc::ServerContext* context,
const ::rdc::GetTemperatureRequest* request,
::rdc::GetTemperatureResponse* response) {
(void)context; // Quiet warning for now;
assert(response != nullptr);
int64_t temperature;
rsmi_status_t ret = rsmi_dev_temp_metric_get(request->dv_ind(),
request->sensor_type(), rdc_temp2rsmi_temp(request->metric()),
&temperature);
rsmi_status_t ret = rsmi_dev_temp_metric_get(request->dv_ind(), request->sensor_type(),
rdc_temp2rsmi_temp(request->metric()), &temperature);
response->set_temperature(temperature);
response->set_ret_val(ret);
return ::grpc::Status::OK;
}
::grpc::Status
RsmiServiceImpl::GetFanRpms(::grpc::ServerContext* context,
const ::rdc::GetFanRpmsRequest* request,
::rdc::GetFanRpmsResponse* response) {
::grpc::Status RsmiServiceImpl::GetFanRpms(::grpc::ServerContext* context,
const ::rdc::GetFanRpmsRequest* request,
::rdc::GetFanRpmsResponse* response) {
(void)context; // Quiet warning for now;
assert(response != nullptr);
int64_t rpms;
rsmi_status_t ret = rsmi_dev_fan_rpms_get(request->dv_ind(),
request->sensor_ind(), &rpms);
rsmi_status_t ret = rsmi_dev_fan_rpms_get(request->dv_ind(), request->sensor_ind(), &rpms);
response->set_rpms(rpms);
response->set_ret_val(ret);
return ::grpc::Status::OK;
}
::grpc::Status
RsmiServiceImpl::GetFanSpeed(::grpc::ServerContext* context,
const ::rdc::GetFanSpeedRequest* request,
::rdc::GetFanSpeedResponse* response) {
::grpc::Status RsmiServiceImpl::GetFanSpeed(::grpc::ServerContext* context,
const ::rdc::GetFanSpeedRequest* request,
::rdc::GetFanSpeedResponse* response) {
(void)context; // Quiet warning for now;
assert(response != nullptr);
int64_t speed;
rsmi_status_t ret = rsmi_dev_fan_speed_get(request->dv_ind(),
request->sensor_ind(), &speed);
rsmi_status_t ret = rsmi_dev_fan_speed_get(request->dv_ind(), request->sensor_ind(), &speed);
response->set_speed(speed);
response->set_ret_val(ret);
return ::grpc::Status::OK;
}
::grpc::Status
RsmiServiceImpl::GetFanSpeedMax(::grpc::ServerContext* context,
const ::rdc::GetFanSpeedMaxRequest* request,
::rdc::GetFanSpeedMaxResponse* response) {
::grpc::Status RsmiServiceImpl::GetFanSpeedMax(::grpc::ServerContext* context,
const ::rdc::GetFanSpeedMaxRequest* request,
::rdc::GetFanSpeedMaxResponse* response) {
(void)context; // Quiet warning for now;
assert(response != nullptr);
uint64_t max_speed;
rsmi_status_t ret = rsmi_dev_fan_speed_max_get(request->dv_ind(),
request->sensor_ind(), &max_speed);
rsmi_status_t ret =
rsmi_dev_fan_speed_max_get(request->dv_ind(), request->sensor_ind(), &max_speed);
response->set_max_speed(max_speed);
response->set_ret_val(ret);
Executable → Regular
+112 -150
View File
@@ -20,29 +20,31 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#include "rdc/rdc_server_main.h"
#include <assert.h>
#include <fcntl.h>
#include <grpcpp/grpcpp.h>
#include <sys/resource.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/capability.h>
#include <getopt.h>
#include <grpcpp/grpcpp.h>
#include <pthread.h>
#include <pwd.h>
#include <sys/capability.h>
#include <sys/resource.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <csignal>
#include <iostream>
#include <memory>
#include <string>
#include <csignal>
#include "rdc.grpc.pb.h" // NOLINT
#include "rocm_smi/rocm_smi.h"
#include "rdc/rdc_server_main.h"
#include "rdc/rdc_rsmi_service.h"
#include "rdc/rdc_api_service.h"
#include "common/rdc_capabilities.h"
#include "common/rdc_utils.h"
#include "rdc.grpc.pb.h" // NOLINT
#include "rdc/rdc_api_service.h"
#include "rdc/rdc_rsmi_service.h"
#include "rocm_smi/rocm_smi.h"
// TODO(cfreehil):
// The following need to be made configurable (e.g., from YAML):
@@ -56,43 +58,33 @@ THE SOFTWARE.
static bool sShutDownServer = false;
static bool sRestartServer = false;
static const char *kDaemonName = "rdcd";
static const char *kRDCDHomeDir = "/";
static const char *kDaemonLockFileRoot = "/var/run/rdcd.lock";
static const char *kDaemonLockFile = "/tmp/rdcd.lock";
static const char* kDaemonName = "rdcd";
static const char* kRDCDHomeDir = "/";
static const char* kDaemonLockFileRoot = "/var/run/rdcd.lock";
static const char* kDaemonLockFile = "/tmp/rdcd.lock";
// Pinned certificates
static const char * kDefaultRDCServerCertPinPath =
"/etc/rdc/server/rdc_server.crt";
static const char * kDefaultRDCServerKeyPinPath =
"/etc/rdc/server/private/rdc_server.key";
static const char * kDefaultRDCClientCertPinPath =
"/etc/rdc/client/rdc_client.crt";
static const char* kDefaultRDCServerCertPinPath = "/etc/rdc/server/rdc_server.crt";
static const char* kDefaultRDCServerKeyPinPath = "/etc/rdc/server/private/rdc_server.key";
static const char* kDefaultRDCClientCertPinPath = "/etc/rdc/client/rdc_client.crt";
// PKI certificates
static const char * kDefaultRDCServerCertKeyPkiPath =
"/etc/rdc/server/private/rdc_server_cert.key";
static const char * kDefaultRDCServerCertPemPkiPath =
"/etc/rdc/server/certs/rdc_server_cert.pem";
static const char * kDefaultRDCClientCACertPemPkiPath =
"/etc/rdc/client/certs/rdc_cacert.pem";
static const char* kDefaultRDCServerCertKeyPkiPath = "/etc/rdc/server/private/rdc_server_cert.key";
static const char* kDefaultRDCServerCertPemPkiPath = "/etc/rdc/server/certs/rdc_server_cert.pem";
static const char* kDefaultRDCClientCACertPemPkiPath = "/etc/rdc/client/certs/rdc_cacert.pem";
static const char *kDefaultListenAddress = "0.0.0.0";
static const char *kDefaultListenPort = "50051";
static const char* kDefaultListenAddress = "0.0.0.0";
static const char* kDefaultListenPort = "50051";
static const uint32_t kRSMIUMask = 027;
RDCServer::RDCServer() :
secure_creds_(false), rsmi_service_(nullptr), rdc_admin_service_(nullptr) {
}
RDCServer::~RDCServer() {
}
RDCServer::RDCServer()
: secure_creds_(false), rsmi_service_(nullptr), rdc_admin_service_(nullptr) {}
RDCServer::~RDCServer() {}
// TODO(cfreehil): resolve here command line options with
// (future) config file options
void
RDCServer::Initialize(RdcdCmdLineOpts *cl) {
void RDCServer::Initialize(RdcdCmdLineOpts* cl) {
cmd_line_ = cl;
server_address_ = cmd_line_->listen_address;
server_address_ += ":";
@@ -102,7 +94,7 @@ RDCServer::Initialize(RdcdCmdLineOpts *cl) {
log_debug_ = cmd_line_->log_dbg;
}
static int ConstructSSLOptsPin(grpc::SslServerCredentialsOptions *ssl_opts) {
static int ConstructSSLOptsPin(grpc::SslServerCredentialsOptions* ssl_opts) {
assert(ssl_opts != nullptr);
if (ssl_opts == nullptr) {
return -EINVAL;
@@ -133,14 +125,13 @@ static int ConstructSSLOptsPin(grpc::SslServerCredentialsOptions *ssl_opts) {
}
grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp = {ser_key, ser_crt};
ssl_opts->client_certificate_request =
GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY;
ssl_opts->client_certificate_request = GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY;
ssl_opts->pem_root_certs = cli_crt;
ssl_opts->pem_key_cert_pairs.push_back(pkcp);
return 0;
}
static int ConstructSSLOptsPKI(grpc::SslServerCredentialsOptions *ssl_opts) {
static int ConstructSSLOptsPKI(grpc::SslServerCredentialsOptions* ssl_opts) {
assert(ssl_opts != nullptr);
if (ssl_opts == nullptr) {
return -EINVAL;
@@ -171,15 +162,13 @@ static int ConstructSSLOptsPKI(grpc::SslServerCredentialsOptions *ssl_opts) {
}
grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp = {ser_key, ser_crt};
ssl_opts->client_certificate_request =
GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY;
ssl_opts->client_certificate_request = GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY;
ssl_opts->pem_root_certs = cli_crt;
ssl_opts->pem_key_cert_pairs.push_back(pkcp);
return 0;
}
void
RDCServer::Run() {
void RDCServer::Run() {
::grpc::ServerBuilder builder;
int ret;
if (secure_creds_) {
@@ -192,15 +181,12 @@ RDCServer::Run() {
}
if (ret) {
std::cerr << "Failed to process OpenSSL keys and certificates. Errno: "
<< -ret << std::endl;
std::cerr << "Failed to process OpenSSL keys and certificates. Errno: " << -ret << std::endl;
return;
}
builder.AddListeningPort(server_address_,
grpc::SslServerCredentials(ssl_opts));
builder.AddListeningPort(server_address_, grpc::SslServerCredentials(ssl_opts));
} else {
builder.AddListeningPort(server_address_,
grpc::InsecureServerCredentials());
builder.AddListeningPort(server_address_, grpc::InsecureServerCredentials());
}
// Register services as the instances through which we'll communicate with
@@ -240,14 +226,13 @@ RDCServer::Run() {
server_ = builder.BuildAndStart();
std::cout << "Server listening on " << server_address_.c_str() << std::endl;
std::cout << "Accepting " <<
(secure_creds_ ? "Authenticated" : "Unauthenticated") <<
" connections only." << std::endl;
std::cout << "Accepting " << (secure_creds_ ? "Authenticated" : "Unauthenticated")
<< " connections only." << std::endl;
server_->Wait();
}
static void HandleSignal(int sig) {
std::cout << "Caught signal " << sig << std::endl;
std::cout << "Caught signal " << sig << std::endl;
// For most signals, we will want to exit, so make that the default case
// Handle the other signals specifically.
@@ -259,9 +244,9 @@ static void HandleSignal(int sig) {
// Grpc doesn't seem to handle stopping and restarting well, so
// user must manually do these steps
// case SIGHUP:
// sRestartServer = true;
// break;
// case SIGHUP:
// sRestartServer = true;
// break;
default:
std::cerr << "Unexpected signal caught" << std::endl;
@@ -274,8 +259,7 @@ static void InitializeSignalHandling(void) {
signal(SIGTERM, HandleSignal);
}
static int
FileOwner(const char *fn, std::string *owner) {
static int FileOwner(const char* fn, std::string* owner) {
struct stat info;
int ret;
@@ -289,7 +273,7 @@ FileOwner(const char *fn, std::string *owner) {
return errno;
}
struct passwd pw;
struct passwd *result;
struct passwd* result;
char buf[20];
ret = getpwuid_r(info.st_uid, &pw, buf, 20, &result);
@@ -302,8 +286,7 @@ FileOwner(const char *fn, std::string *owner) {
return 0;
}
void
RDCServer::ShutDown(void) {
void RDCServer::ShutDown(void) {
server_->Shutdown();
if (rsmi_service_) {
@@ -322,19 +305,19 @@ RDCServer::ShutDown(void) {
}
}
static void * ProcessSignalLoop(void *server_ptr) {
static void* ProcessSignalLoop(void* server_ptr) {
assert(server_ptr != nullptr);
RDCServer *server = reinterpret_cast<RDCServer *>(server_ptr);
RDCServer* server = reinterpret_cast<RDCServer*>(server_ptr);
while (1) {
if (sShutDownServer) {
std::cout << "Shutting down RDC Server." << std::endl;
std::cout << "Shutting down RDC Server." << std::endl;
server->ShutDown();
// We will need to add shutdown of any completion queues
// here, when/if we add them
break;
} else if (sRestartServer) {
std::cout << "Re-starting RDC Server." << std::endl;
std::cout << "Re-starting RDC Server." << std::endl;
// We will need to add shutdown of any completion queues
// here, when/if we add them
server->ShutDown();
@@ -385,7 +368,7 @@ static bool FileIsLocked(std::string fn) {
}
static void ExitIfAlreadyRunning(bool is_root) {
const char *lock_fn;
const char* lock_fn;
int lock_fh;
std::string lf_user(kDaemonLockFile);
std::string lf_root(kDaemonLockFileRoot);
@@ -395,8 +378,7 @@ static void ExitIfAlreadyRunning(bool is_root) {
bool is_locked = FileIsLocked(lock_file);
if (is_locked) {
std::cerr << "File " << lock_file <<
" is locked. Is rdcd already running?" << std::endl;
std::cerr << "File " << lock_file << " is locked. Is rdcd already running?" << std::endl;
exit(1);
}
};
@@ -411,7 +393,7 @@ static void ExitIfAlreadyRunning(bool is_root) {
}
// Temporarily adjust file-mask to create file with right permissions
umask(023);
lock_fh = open(lock_fn, O_RDWR|O_CREAT, 0644);
lock_fh = open(lock_fn, O_RDWR | O_CREAT, 0644);
if (lock_fh < 0) {
std::string user;
@@ -420,9 +402,10 @@ static void ExitIfAlreadyRunning(bool is_root) {
perror("Failed to determine owner of lock file.");
exit(ret);
}
std::cerr << "Failed to open file lock:" << lock_fn << " owned by user: "
<< user << ". If starting rdcd as a different user, delete this "
"lock-file first." << std::endl;
std::cerr << "Failed to open file lock:" << lock_fn << " owned by user: " << user
<< ". If starting rdcd as a different user, delete this "
"lock-file first."
<< std::endl;
// asserting below since this should have been prevented in main()
assert(!"Unexpected user invoking rdcd");
exit(1);
@@ -439,8 +422,7 @@ static void ExitIfAlreadyRunning(bool is_root) {
assert(static_cast<unsigned int>(fsz) == pid_str.size());
}
static void
MakeDaemon(bool is_root) {
static void MakeDaemon(bool is_root) {
int fd0;
struct rlimit max_files;
@@ -474,13 +456,13 @@ MakeDaemon(bool is_root) {
// chdir to dir that will always be available
if (chdir(kRDCDHomeDir) < 0) {
std::cerr << "Failed to change directory to " <<kRDCDHomeDir << std::endl;
std::cerr << "Failed to change directory to " << kRDCDHomeDir << std::endl;
}
// Determine max. number of open files possible. We need to close all
// open descriptors.
if (getrlimit(RLIMIT_NOFILE, &max_files) < 0) {
std::cerr << kDaemonName << ": can't get file limit" << std::endl;
std::cerr << kDaemonName << ": can't get file limit" << std::endl;
}
// Close files
@@ -495,8 +477,8 @@ MakeDaemon(bool is_root) {
// Direct stdin to /dev/null.
fd0 = open("/dev/null", O_RDWR);
if (fd0 != 0) {
std::cerr << "unexpected fildes: " << fd0 << std::endl;
exit(1);
std::cerr << "unexpected fildes: " << fd0 << std::endl;
exit(1);
}
ExitIfAlreadyRunning(is_root);
@@ -508,38 +490,34 @@ MakeDaemon(bool is_root) {
// * required_argument
// * optional_argument
// * no_argument
static const struct option long_options[] = {
{"address", required_argument, nullptr, 'a'},
{"port", required_argument, nullptr, 'p'},
// Any options with optionals args would go here; e.g.,
// {"start_rdcd", optional_argument, nullptr, 'd'},
{"unauth_comm", no_argument, nullptr, 'u'},
{"pinned_cert", no_argument, nullptr, 'i'},
{"debug", no_argument, nullptr, 'd'},
{"help", no_argument, nullptr, 'h'},
static const struct option long_options[] = {{"address", required_argument, nullptr, 'a'},
{"port", required_argument, nullptr, 'p'},
// Any options with optionals args would go here; e.g.,
// {"start_rdcd", optional_argument, nullptr, 'd'},
{"unauth_comm", no_argument, nullptr, 'u'},
{"pinned_cert", no_argument, nullptr, 'i'},
{"debug", no_argument, nullptr, 'd'},
{"help", no_argument, nullptr, 'h'},
{nullptr, 0, nullptr, 0}
};
{nullptr, 0, nullptr, 0}};
static const char* short_options = "a:p:uidh";
static void PrintHelp(void) {
std::cout <<
"Optional rdctst Arguments:\n"
"--address, -a <IPv4 address> specify address on which to listen; "
"default is 0.0.0.0\n"
"--port, -p <port> specify port on which to listen; "
"default is to listen on port 50051\n"
"--unauth_comm, -u don't do authentication with communications"
" with client. When this flag is not specified, by default, "
"PKI authentication is used\n"
"--pinned_cert, -i used \"pinned\" certificates instead of PKI "
"authentication. This is for test purposes.\n"
"--debug, -d output debug messages\n"
"--help, -h print this message\n";
std::cout << "Optional rdctst Arguments:\n"
"--address, -a <IPv4 address> specify address on which to listen; "
"default is 0.0.0.0\n"
"--port, -p <port> specify port on which to listen; "
"default is to listen on port 50051\n"
"--unauth_comm, -u don't do authentication with communications"
" with client. When this flag is not specified, by default, "
"PKI authentication is used\n"
"--pinned_cert, -i used \"pinned\" certificates instead of PKI "
"authentication. This is for test purposes.\n"
"--debug, -d output debug messages\n"
"--help, -h print this message\n";
}
uint32_t ProcessCmdline(RdcdCmdLineOpts* cmdl_opts,
int arg_cnt, char** arg_list) {
uint32_t ProcessCmdline(RdcdCmdLineOpts* cmdl_opts, int arg_cnt, char** arg_list) {
int a;
int ind = -1;
@@ -555,8 +533,7 @@ uint32_t ProcessCmdline(RdcdCmdLineOpts* cmdl_opts,
switch (a) {
case 'a':
if (!amd::rdc::IsIP(optarg)) {
std::cerr << "\"" << optarg <<
"\" is not a valid IP address." << std::endl;
std::cerr << "\"" << optarg << "\" is not a valid IP address." << std::endl;
return -1;
}
cmdl_opts->listen_address = optarg;
@@ -564,8 +541,7 @@ uint32_t ProcessCmdline(RdcdCmdLineOpts* cmdl_opts,
case 'p':
if (!amd::rdc::IsNumber(optarg)) {
std::cerr << "\"" << optarg <<
"\" is not a valid port number." << std::endl;
std::cerr << "\"" << optarg << "\" is not a valid port number." << std::endl;
return -1;
}
cmdl_opts->listen_port = optarg;
@@ -588,8 +564,7 @@ uint32_t ProcessCmdline(RdcdCmdLineOpts* cmdl_opts,
exit(0);
default:
std::cout << "Unknown command line option: \"" << a <<
"\". Ignoring..." << std::endl;
std::cout << "Unknown command line option: \"" << a << "\". Ignoring..." << std::endl;
PrintHelp();
return 0;
}
@@ -597,14 +572,13 @@ uint32_t ProcessCmdline(RdcdCmdLineOpts* cmdl_opts,
// Check for incompatibilities
if (cmdl_opts->use_pinned_certs && cmdl_opts->no_authentication) {
std::cerr << "--pinned_cert and --unauth_comm are incompatible options."
<< std::endl;
std::cerr << "--pinned_cert and --unauth_comm are incompatible options." << std::endl;
return -1;
}
return 0;
}
static void init_cmd_line_opts(RdcdCmdLineOpts *opts) {
static void init_cmd_line_opts(RdcdCmdLineOpts* opts) {
assert(opts != nullptr);
opts->listen_address = kDefaultListenAddress;
opts->listen_port = kDefaultListenPort;
@@ -631,22 +605,20 @@ int main(int argc, char** argv) {
// Can read the certificates and private key when authentication.
if (!cmd_line_opts.no_authentication) {
if (cmd_line_opts.use_pinned_certs &&
(access(kDefaultRDCServerCertPinPath, R_OK) != 0 ||
access(kDefaultRDCServerKeyPinPath, R_OK) != 0 ||
access(kDefaultRDCClientCertPinPath, R_OK) != 0)) {
std::cerr << "The user needs read access to the pinned "
<< "certificates and private key." << std::endl;
return 1;
if (cmd_line_opts.use_pinned_certs && (access(kDefaultRDCServerCertPinPath, R_OK) != 0 ||
access(kDefaultRDCServerKeyPinPath, R_OK) != 0 ||
access(kDefaultRDCClientCertPinPath, R_OK) != 0)) {
std::cerr << "The user needs read access to the pinned "
<< "certificates and private key." << std::endl;
return 1;
}
if (!cmd_line_opts.use_pinned_certs &&
(access(kDefaultRDCServerCertKeyPkiPath, R_OK) != 0 ||
access(kDefaultRDCServerCertPemPkiPath, R_OK) != 0 ||
access(kDefaultRDCClientCACertPemPkiPath, R_OK) != 0)) {
std::cerr << "The user needs read access to the PKI "
<< "certificates and private key." << std::endl;
return 1;
if (!cmd_line_opts.use_pinned_certs && (access(kDefaultRDCServerCertKeyPkiPath, R_OK) != 0 ||
access(kDefaultRDCServerCertPemPkiPath, R_OK) != 0 ||
access(kDefaultRDCClientCACertPemPkiPath, R_OK) != 0)) {
std::cerr << "The user needs read access to the PKI "
<< "certificates and private key." << std::endl;
return 1;
}
}
@@ -656,23 +628,20 @@ int main(int argc, char** argv) {
bool cap_enabled;
err =
::amd::rdc::GetCapability(CAP_DAC_OVERRIDE, CAP_EFFECTIVE, &cap_enabled);
err = ::amd::rdc::GetCapability(CAP_DAC_OVERRIDE, CAP_EFFECTIVE, &cap_enabled);
if (err) {
std::cerr << "Failed to get capability" << std::endl;
return 1;
}
if (cap_enabled) {
err =
amd::rdc::GetCapability(CAP_DAC_OVERRIDE, CAP_PERMITTED, &cap_enabled);
err = amd::rdc::GetCapability(CAP_DAC_OVERRIDE, CAP_PERMITTED, &cap_enabled);
if (err) {
std::cerr << "Failed to get capability" << std::endl;
return 1;
}
if (!cap_enabled) {
std::cerr <<
"CAP_DAC_OVERRIDE CAP_PERMITTED is not enabled" << std::endl;
std::cerr << "CAP_DAC_OVERRIDE CAP_PERMITTED is not enabled" << std::endl;
}
} else {
std::cerr << "CAP_DAC_OVERRIDE CAP_EFFECTIVE is not enabled." << std::endl;
@@ -685,28 +654,23 @@ int main(int argc, char** argv) {
// relax this restriction if some new feature requires it.
err = amd::rdc::ModifyCapability(CAP_DAC_OVERRIDE, CAP_INHERITABLE, false);
if (err) {
std::cerr << "Failed to disable CAP_DAC_OVERRIDE, CAP_INHERITABLE" <<
std::endl;
std::cerr << "Failed to disable CAP_DAC_OVERRIDE, CAP_INHERITABLE" << std::endl;
return 1;
}
// By default, disable CAP_DAC_OVERRIDE. Turn on, when needed.
err = amd::rdc::ModifyCapability(CAP_DAC_OVERRIDE, CAP_EFFECTIVE, false);
if (err) {
std::cerr << "Failed to disable CAP_DAC_OVERRIDE, CAP_EFFECTIVE" <<
std::endl;
std::cerr << "Failed to disable CAP_DAC_OVERRIDE, CAP_EFFECTIVE" << std::endl;
return 1;
}
// Create a thread to handle signals to shutdown gracefully
pthread_t sig_listen_thread;
int thr_ret = pthread_create(&sig_listen_thread, NULL,
ProcessSignalLoop, &rdc_server);
int thr_ret = pthread_create(&sig_listen_thread, NULL, ProcessSignalLoop, &rdc_server);
if (thr_ret) {
std::cerr <<
"Failed to create ProcessSignalLoop. pthread_create() returned " <<
thr_ret;
std::cerr << "Failed to create ProcessSignalLoop. pthread_create() returned " << thr_ret;
return 1;
}
@@ -723,13 +687,11 @@ int main(int argc, char** argv) {
// don't fail if it doesn't succeed
if (thr_ret != 0) {
std::cerr <<
"Failed to terminate ProcessSignalLoop. pthread_join() returned " <<
thr_ret;
std::cerr << "Failed to terminate ProcessSignalLoop. pthread_join() returned " << thr_ret;
}
if (sShutDownServer) {
std::cout << "RDC server successfully shut down." << std::endl;
std::cout << "RDC server successfully shut down." << std::endl;
return 0;
} else {
std::cerr << "RDC server failed to start." << std::endl;