|
Packit Service |
aa3af4 |
/*
|
|
Packit Service |
aa3af4 |
* Copyright (c) 2001-2020 Mellanox Technologies, Ltd. All rights reserved.
|
|
Packit Service |
aa3af4 |
*
|
|
Packit Service |
aa3af4 |
* This software is available to you under a choice of one of two
|
|
Packit Service |
aa3af4 |
* licenses. You may choose to be licensed under the terms of the GNU
|
|
Packit Service |
aa3af4 |
* General Public License (GPL) Version 2, available from the file
|
|
Packit Service |
aa3af4 |
* COPYING in the main directory of this source tree, or the
|
|
Packit Service |
aa3af4 |
* BSD license below:
|
|
Packit Service |
aa3af4 |
*
|
|
Packit Service |
aa3af4 |
* Redistribution and use in source and binary forms, with or
|
|
Packit Service |
aa3af4 |
* without modification, are permitted provided that the following
|
|
Packit Service |
aa3af4 |
* conditions are met:
|
|
Packit Service |
aa3af4 |
*
|
|
Packit Service |
aa3af4 |
* - Redistributions of source code must retain the above
|
|
Packit Service |
aa3af4 |
* copyright notice, this list of conditions and the following
|
|
Packit Service |
aa3af4 |
* disclaimer.
|
|
Packit Service |
aa3af4 |
*
|
|
Packit Service |
aa3af4 |
* - Redistributions in binary form must reproduce the above
|
|
Packit Service |
aa3af4 |
* copyright notice, this list of conditions and the following
|
|
Packit Service |
aa3af4 |
* disclaimer in the documentation and/or other materials
|
|
Packit Service |
aa3af4 |
* provided with the distribution.
|
|
Packit Service |
aa3af4 |
*
|
|
Packit Service |
aa3af4 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
Packit Service |
aa3af4 |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit Service |
aa3af4 |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
Packit Service |
aa3af4 |
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
Packit Service |
aa3af4 |
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
Packit Service |
aa3af4 |
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit Service |
aa3af4 |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
Packit Service |
aa3af4 |
* SOFTWARE.
|
|
Packit Service |
aa3af4 |
*/
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
#include <vector>
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
#include "utils/bullseye.h"
|
|
Packit Service |
aa3af4 |
#include "vlogger/vlogger.h"
|
|
Packit Service |
aa3af4 |
#include "ib_ctx_handler_collection.h"
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
#include "vma/ib/base/verbs_extra.h"
|
|
Packit Service |
aa3af4 |
#include "vma/util/utils.h"
|
|
Packit Service |
aa3af4 |
#include "vma/event/event_handler_manager.h"
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
#define MODULE_NAME "ib_ctx_collection"
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
#define ibchc_logpanic __log_panic
|
|
Packit Service |
aa3af4 |
#define ibchc_logerr __log_err
|
|
Packit Service |
aa3af4 |
#define ibchc_logwarn __log_warn
|
|
Packit Service |
aa3af4 |
#define ibchc_loginfo __log_info
|
|
Packit Service |
aa3af4 |
#define ibchc_logdbg __log_info_dbg
|
|
Packit Service |
aa3af4 |
#define ibchc_logfunc __log_info_func
|
|
Packit Service |
aa3af4 |
#define ibchc_logfuncall __log_info_funcall
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
ib_ctx_handler_collection* g_p_ib_ctx_handler_collection = NULL;
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
void check_flow_steering_log_num_mgm_entry_size()
|
|
Packit Service |
aa3af4 |
{
|
|
Packit Service |
aa3af4 |
static bool checked_mlx4_steering = false;
|
|
Packit Service |
aa3af4 |
if (checked_mlx4_steering) {
|
|
Packit Service |
aa3af4 |
return;
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
checked_mlx4_steering = true;
|
|
Packit Service |
aa3af4 |
char flow_steering_val[4] = {0};
|
|
Packit Service |
aa3af4 |
if (priv_safe_try_read_file((const char*)FLOW_STEERING_MGM_ENTRY_SIZE_PARAM_FILE, flow_steering_val, sizeof(flow_steering_val)) == -1) {
|
|
Packit Service |
aa3af4 |
vlog_printf(VLOG_DEBUG, "Flow steering option for mlx4 driver does not exist in current OFED version\n");
|
|
Packit Service |
aa3af4 |
} else if (flow_steering_val[0] != '-' || (strtol(&flow_steering_val[1], NULL, 0) % 2) == 0) {
|
|
Packit Service |
aa3af4 |
char module_info[3] = {0};
|
|
Packit Service |
aa3af4 |
if (!run_and_retreive_system_command("modinfo mlx4_core > /dev/null 2>&1 ; echo $?",
|
|
Packit Service |
aa3af4 |
module_info, sizeof(module_info)) &&
|
|
Packit Service |
aa3af4 |
(strlen(module_info) > 0)) {
|
|
Packit Service |
aa3af4 |
if (module_info[0] == '0') {
|
|
Packit Service |
aa3af4 |
vlog_printf(VLOG_WARNING, "***************************************************************************************\n");
|
|
Packit Service |
aa3af4 |
vlog_printf(VLOG_WARNING, "* VMA will not operate properly while flow steering option is disabled *\n");
|
|
Packit Service |
aa3af4 |
vlog_printf(VLOG_WARNING, "* In order to enable flow steering please restart your VMA applications after running *\n");
|
|
Packit Service |
aa3af4 |
vlog_printf(VLOG_WARNING, "* the following: *\n");
|
|
Packit Service |
aa3af4 |
vlog_printf(VLOG_WARNING, "* For your information the following steps will restart your network interface *\n");
|
|
Packit Service |
aa3af4 |
vlog_printf(VLOG_WARNING, "* 1. \"echo options mlx4_core log_num_mgm_entry_size=-1 > /etc/modprobe.d/mlnx.conf\" *\n");
|
|
Packit Service |
aa3af4 |
vlog_printf(VLOG_WARNING, "* 2. Restart openibd or rdma service depending on your system configuration *\n");
|
|
Packit Service |
aa3af4 |
vlog_printf(VLOG_WARNING, "* Read more about the Flow Steering support in the VMA's User Manual *\n");
|
|
Packit Service |
aa3af4 |
vlog_printf(VLOG_WARNING, "***************************************************************************************\n");
|
|
Packit Service |
aa3af4 |
} else {
|
|
Packit Service |
aa3af4 |
vlog_printf(VLOG_DEBUG, "***************************************************************************************\n");
|
|
Packit Service |
aa3af4 |
vlog_printf(VLOG_DEBUG, "* VMA will not operate properly while flow steering option is disabled *\n");
|
|
Packit Service |
aa3af4 |
vlog_printf(VLOG_DEBUG, "* Read more about the Flow Steering support in the VMA's User Manual *\n");
|
|
Packit Service |
aa3af4 |
vlog_printf(VLOG_DEBUG, "***************************************************************************************\n");
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
ib_ctx_handler_collection::ib_ctx_handler_collection()
|
|
Packit Service |
aa3af4 |
{
|
|
Packit Service |
aa3af4 |
ibchc_logdbg("");
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
/* Read ib table from kernel and save it in local variable. */
|
|
Packit Service |
aa3af4 |
update_tbl();
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
//Print table
|
|
Packit Service |
aa3af4 |
print_val_tbl();
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
ibchc_logdbg("Done");
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
ib_ctx_handler_collection::~ib_ctx_handler_collection()
|
|
Packit Service |
aa3af4 |
{
|
|
Packit Service |
aa3af4 |
ibchc_logdbg("");
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
ib_context_map_t::iterator ib_ctx_iter;
|
|
Packit Service |
aa3af4 |
while ((ib_ctx_iter = m_ib_ctx_map.begin()) != m_ib_ctx_map.end()) {
|
|
Packit Service |
aa3af4 |
ib_ctx_handler* p_ib_ctx_handler = ib_ctx_iter->second;
|
|
Packit Service |
aa3af4 |
delete p_ib_ctx_handler;
|
|
Packit Service |
aa3af4 |
m_ib_ctx_map.erase(ib_ctx_iter);
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
ibchc_logdbg("Done");
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
void ib_ctx_handler_collection::update_tbl(const char *ifa_name)
|
|
Packit Service |
aa3af4 |
{
|
|
Packit Service |
aa3af4 |
struct ibv_device **dev_list = NULL;
|
|
Packit Service |
aa3af4 |
ib_ctx_handler * p_ib_ctx_handler = NULL;
|
|
Packit Service |
aa3af4 |
int num_devices = 0;
|
|
Packit Service |
aa3af4 |
int i;
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
ibchc_logdbg("Checking for offload capable IB devices...");
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
dev_list = vma_ibv_get_device_list(&num_devices);
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
BULLSEYE_EXCLUDE_BLOCK_START
|
|
Packit Service |
aa3af4 |
if (!dev_list) {
|
|
Packit Service |
aa3af4 |
ibchc_logerr("Failure in vma_ibv_get_device_list() (error=%d %m)", errno);
|
|
Packit Service |
aa3af4 |
ibchc_logerr("Please check rdma configuration");
|
|
Packit Service |
aa3af4 |
throw_vma_exception("No IB capable devices found!");
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
if (!num_devices) {
|
|
Packit Service |
aa3af4 |
vlog_levels_t _level = ifa_name ? VLOG_DEBUG : VLOG_ERROR; // Print an error only during initialization.
|
|
Packit Service |
aa3af4 |
vlog_printf(_level, "VMA does not detect IB capable devices\n");
|
|
Packit Service |
aa3af4 |
vlog_printf(_level, "No performance gain is expected in current configuration\n");
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
BULLSEYE_EXCLUDE_BLOCK_END
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
for (i = 0; i < num_devices; i++) {
|
|
Packit Service |
aa3af4 |
struct ib_ctx_handler::ib_ctx_handler_desc desc = {dev_list[i]};
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
/* 2. Skip existing devices (compare by name) */
|
|
Packit Service |
aa3af4 |
if (ifa_name && !check_device_name_ib_name(ifa_name, dev_list[i]->name)) {
|
|
Packit Service |
aa3af4 |
continue;
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
if (ib_ctx_handler::is_mlx4(dev_list[i]->name)) {
|
|
Packit Service |
aa3af4 |
// Note: mlx4 does not support this capability.
|
|
Packit Service |
aa3af4 |
if(safe_mce_sys().enable_socketxtreme) {
|
|
Packit Service |
aa3af4 |
ibchc_logdbg("Blocking offload: mlx4 interfaces in socketxtreme mode");
|
|
Packit Service |
aa3af4 |
continue;
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
// Check if mlx4 steering creation is supported.
|
|
Packit Service |
aa3af4 |
check_flow_steering_log_num_mgm_entry_size();
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
/* 3. Add new ib devices */
|
|
Packit Service |
aa3af4 |
p_ib_ctx_handler = new ib_ctx_handler(&desc);
|
|
Packit Service |
aa3af4 |
if (!p_ib_ctx_handler) {
|
|
Packit Service |
aa3af4 |
ibchc_logerr("failed allocating new ib_ctx_handler (errno=%d %m)", errno);
|
|
Packit Service |
aa3af4 |
continue;
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
m_ib_ctx_map[p_ib_ctx_handler->get_ibv_device()] = p_ib_ctx_handler;
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
ibchc_logdbg("Check completed. Found %d offload capable IB devices", m_ib_ctx_map.size());
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
if (dev_list) {
|
|
Packit Service |
aa3af4 |
ibv_free_device_list(dev_list);
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
void ib_ctx_handler_collection::print_val_tbl()
|
|
Packit Service |
aa3af4 |
{
|
|
Packit Service |
aa3af4 |
ib_context_map_t::iterator itr;
|
|
Packit Service |
aa3af4 |
for (itr = m_ib_ctx_map.begin(); itr != m_ib_ctx_map.end(); itr++) {
|
|
Packit Service |
aa3af4 |
ib_ctx_handler* p_ib_ctx_handler = itr->second;
|
|
Packit Service |
aa3af4 |
p_ib_ctx_handler->print_val();
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
ib_ctx_handler* ib_ctx_handler_collection::get_ib_ctx(const char *ifa_name)
|
|
Packit Service |
aa3af4 |
{
|
|
Packit Service |
aa3af4 |
char active_slave[IFNAMSIZ] = {0};
|
|
Packit Service |
aa3af4 |
unsigned int slave_flags = 0;
|
|
Packit Service |
aa3af4 |
ib_context_map_t::iterator ib_ctx_iter;
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
if (check_netvsc_device_exist(ifa_name)) {
|
|
Packit Service |
aa3af4 |
if (!get_netvsc_slave(ifa_name, active_slave, slave_flags)) {
|
|
Packit Service |
aa3af4 |
return NULL;
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
ifa_name = (const char *)active_slave;
|
|
Packit Service |
aa3af4 |
} else if (check_device_exist(ifa_name, BOND_DEVICE_FILE)) {
|
|
Packit Service |
aa3af4 |
/* active/backup: return active slave */
|
|
Packit Service |
aa3af4 |
if (!get_bond_active_slave_name(ifa_name, active_slave, sizeof(active_slave))) {
|
|
Packit Service |
aa3af4 |
char slaves[IFNAMSIZ * 16] = {0};
|
|
Packit Service |
aa3af4 |
char* slave_name;
|
|
Packit Service |
aa3af4 |
char* save_ptr;
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
/* active/active: return the first slave */
|
|
Packit Service |
aa3af4 |
if (!get_bond_slaves_name_list(ifa_name, slaves, sizeof(slaves))) {
|
|
Packit Service |
aa3af4 |
return NULL;
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
slave_name = strtok_r(slaves, " ", &save_ptr);
|
|
Packit Service |
aa3af4 |
if (NULL == slave_name) {
|
|
Packit Service |
aa3af4 |
return NULL;
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
save_ptr = strchr(slave_name, '\n');
|
|
Packit Service |
aa3af4 |
if (save_ptr) *save_ptr = '\0'; // Remove the tailing 'new line" char
|
|
Packit Service |
aa3af4 |
strncpy(active_slave, slave_name, sizeof(active_slave) - 1);
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
ifa_name = (const char *)active_slave;
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
for (ib_ctx_iter = m_ib_ctx_map.begin(); ib_ctx_iter != m_ib_ctx_map.end(); ib_ctx_iter++) {
|
|
Packit Service |
aa3af4 |
if (check_device_name_ib_name(ifa_name, ib_ctx_iter->second->get_ibname())) {
|
|
Packit Service |
aa3af4 |
return ib_ctx_iter->second;
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
return NULL;
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
|
|
Packit Service |
aa3af4 |
void ib_ctx_handler_collection::del_ib_ctx(ib_ctx_handler* ib_ctx)
|
|
Packit Service |
aa3af4 |
{
|
|
Packit Service |
aa3af4 |
if (ib_ctx) {
|
|
Packit Service |
aa3af4 |
ib_context_map_t::iterator ib_ctx_iter = m_ib_ctx_map.find(ib_ctx->get_ibv_device());
|
|
Packit Service |
aa3af4 |
if (ib_ctx_iter != m_ib_ctx_map.end()) {
|
|
Packit Service |
aa3af4 |
delete ib_ctx_iter->second;
|
|
Packit Service |
aa3af4 |
m_ib_ctx_map.erase(ib_ctx_iter);
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
}
|
|
Packit Service |
aa3af4 |
}
|