|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2006-2009 Voltaire, Inc. All rights reserved.
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2010-2015 Mellanox Technologies LTD. All rights reserved.
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2009 HNR Consulting. All rights reserved.
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
* This software is available to you under a choice of one of two
|
|
Packit Service |
54dbc3 |
* licenses. You may choose to be licensed under the terms of the GNU
|
|
Packit Service |
54dbc3 |
* General Public License (GPL) Version 2, available from the file
|
|
Packit Service |
54dbc3 |
* COPYING in the main directory of this source tree, or the
|
|
Packit Service |
54dbc3 |
* OpenIB.org BSD license below:
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
* Redistribution and use in source and binary forms, with or
|
|
Packit Service |
54dbc3 |
* without modification, are permitted provided that the following
|
|
Packit Service |
54dbc3 |
* conditions are met:
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
* - Redistributions of source code must retain the above
|
|
Packit Service |
54dbc3 |
* copyright notice, this list of conditions and the following
|
|
Packit Service |
54dbc3 |
* disclaimer.
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
* - Redistributions in binary form must reproduce the above
|
|
Packit Service |
54dbc3 |
* copyright notice, this list of conditions and the following
|
|
Packit Service |
54dbc3 |
* disclaimer in the documentation and/or other materials
|
|
Packit Service |
54dbc3 |
* provided with the distribution.
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
Packit Service |
54dbc3 |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit Service |
54dbc3 |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
Packit Service |
54dbc3 |
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
Packit Service |
54dbc3 |
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
Packit Service |
54dbc3 |
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit Service |
54dbc3 |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
Packit Service |
54dbc3 |
* SOFTWARE.
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* Abstract:
|
|
Packit Service |
54dbc3 |
* Implementation of OpenSM QoS infrastructure primitives
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#if HAVE_CONFIG_H
|
|
Packit Service |
54dbc3 |
# include <config.h>
|
|
Packit Service |
54dbc3 |
#endif /* HAVE_CONFIG_H */
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#include <stdlib.h>
|
|
Packit Service |
54dbc3 |
#include <string.h>
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#include <iba/ib_types.h>
|
|
Packit Service |
54dbc3 |
#include <complib/cl_qmap.h>
|
|
Packit Service |
54dbc3 |
#include <complib/cl_debug.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_file_ids.h>
|
|
Packit Service |
54dbc3 |
#define FILE_ID OSM_FILE_QOS_C
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_opensm.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_subnet.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_qos_policy.h>
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
struct qos_config {
|
|
Packit Service |
54dbc3 |
uint8_t max_vls;
|
|
Packit Service |
54dbc3 |
uint8_t vl_high_limit;
|
|
Packit Service |
54dbc3 |
ib_vl_arb_table_t vlarb_high[2];
|
|
Packit Service |
54dbc3 |
ib_vl_arb_table_t vlarb_low[2];
|
|
Packit Service |
54dbc3 |
ib_slvl_table_t sl2vl;
|
|
Packit Service |
54dbc3 |
};
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
typedef struct qos_mad_item {
|
|
Packit Service |
54dbc3 |
cl_list_item_t list_item;
|
|
Packit Service |
54dbc3 |
osm_madw_t *p_madw;
|
|
Packit Service |
54dbc3 |
} qos_mad_item_t;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
typedef struct qos_mad_list {
|
|
Packit Service |
54dbc3 |
cl_list_item_t list_item;
|
|
Packit Service |
54dbc3 |
cl_qlist_t port_mad_list;
|
|
Packit Service |
54dbc3 |
} qos_mad_list_t;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void qos_build_config(struct qos_config *cfg,
|
|
Packit Service |
54dbc3 |
osm_qos_options_t * opt,
|
|
Packit Service |
54dbc3 |
osm_qos_options_t * dflt);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* QoS primitives
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static qos_mad_item_t *osm_qos_mad_create(IN osm_sm_t * sm,
|
|
Packit Service |
54dbc3 |
IN osm_physp_t * p,
|
|
Packit Service |
54dbc3 |
IN uint32_t data_size,
|
|
Packit Service |
54dbc3 |
IN uint8_t * p_data,
|
|
Packit Service |
54dbc3 |
IN ib_net16_t attr_id,
|
|
Packit Service |
54dbc3 |
IN uint32_t attr_mod)
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
qos_mad_item_t *p_mad;
|
|
Packit Service |
54dbc3 |
osm_madw_context_t context;
|
|
Packit Service |
54dbc3 |
osm_madw_t *p_madw;
|
|
Packit Service |
54dbc3 |
osm_node_t *p_node;
|
|
Packit Service |
54dbc3 |
osm_physp_t *physp0;
|
|
Packit Service |
54dbc3 |
ib_net64_t m_key;
|
|
Packit Service |
54dbc3 |
uint32_t timeout = 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_node = osm_physp_get_node_ptr(p);
|
|
Packit Service |
54dbc3 |
if (osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH &&
|
|
Packit Service |
54dbc3 |
osm_physp_get_port_num(p) != 0) {
|
|
Packit Service |
54dbc3 |
physp0 = osm_node_get_physp_ptr(p_node, 0);
|
|
Packit Service |
54dbc3 |
m_key = ib_port_info_get_m_key(&physp0->port_info);
|
|
Packit Service |
54dbc3 |
} else
|
|
Packit Service |
54dbc3 |
m_key = ib_port_info_get_m_key(&p->port_info);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
switch (attr_id){
|
|
Packit Service |
54dbc3 |
case IB_MAD_ATTR_SLVL_TABLE:
|
|
Packit Service |
54dbc3 |
context.slvl_context.node_guid = osm_node_get_node_guid(p_node);
|
|
Packit Service |
54dbc3 |
context.slvl_context.port_guid = osm_physp_get_port_guid(p);
|
|
Packit Service |
54dbc3 |
context.slvl_context.set_method = TRUE;
|
|
Packit Service |
54dbc3 |
if ((attr_mod & 0x30000) != 0) /* optimized ? */
|
|
Packit Service |
54dbc3 |
timeout = sm->p_subn->opt.long_transaction_timeout;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case IB_MAD_ATTR_VL_ARBITRATION:
|
|
Packit Service |
54dbc3 |
context.vla_context.node_guid = osm_node_get_node_guid(p_node);
|
|
Packit Service |
54dbc3 |
context.vla_context.port_guid = osm_physp_get_port_guid(p);
|
|
Packit Service |
54dbc3 |
context.vla_context.set_method = TRUE;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
default:
|
|
Packit Service |
54dbc3 |
return NULL;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_mad = (qos_mad_item_t *) malloc(sizeof(*p_mad));
|
|
Packit Service |
54dbc3 |
if (!p_mad)
|
|
Packit Service |
54dbc3 |
return NULL;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
memset(p_mad, 0, sizeof(*p_mad));
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_madw = osm_prepare_req_set(sm, osm_physp_get_dr_path_ptr(p),
|
|
Packit Service |
54dbc3 |
p_data, data_size,
|
|
Packit Service |
54dbc3 |
attr_id, cl_hton32(attr_mod),
|
|
Packit Service |
54dbc3 |
FALSE, m_key,
|
|
Packit Service |
54dbc3 |
timeout, CL_DISP_MSGID_NONE, &context);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (p_madw == NULL) {
|
|
Packit Service |
54dbc3 |
free(p_mad);
|
|
Packit Service |
54dbc3 |
return NULL;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
p_mad->p_madw = p_madw;
|
|
Packit Service |
54dbc3 |
return p_mad;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void osm_qos_mad_delete(qos_mad_item_t ** p_item)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
free(*p_item);
|
|
Packit Service |
54dbc3 |
*p_item = NULL;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static ib_api_status_t vlarb_update_table_block(osm_sm_t * sm,
|
|
Packit Service |
54dbc3 |
osm_physp_t * p,
|
|
Packit Service |
54dbc3 |
uint8_t port_num,
|
|
Packit Service |
54dbc3 |
unsigned force_update,
|
|
Packit Service |
54dbc3 |
const ib_vl_arb_table_t *
|
|
Packit Service |
54dbc3 |
table_block,
|
|
Packit Service |
54dbc3 |
unsigned block_length,
|
|
Packit Service |
54dbc3 |
unsigned block_num,
|
|
Packit Service |
54dbc3 |
cl_qlist_t *mad_list)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
struct osm_routing_engine *re = sm->p_subn->p_osm->routing_engine_used;
|
|
Packit Service |
54dbc3 |
ib_vl_arb_table_t block;
|
|
Packit Service |
54dbc3 |
uint32_t attr_mod;
|
|
Packit Service |
54dbc3 |
unsigned vl_mask, i;
|
|
Packit Service |
54dbc3 |
qos_mad_item_t *p_mad;
|
|
Packit Service |
54dbc3 |
vl_mask = (1 << (ib_port_info_get_op_vls(&p->port_info) - 1)) - 1;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
memset(&block, 0, sizeof(block));
|
|
Packit Service |
54dbc3 |
memcpy(&block, table_block, block_length * sizeof(block.vl_entry[0]));
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (re && re->update_vlarb)
|
|
Packit Service |
54dbc3 |
re->update_vlarb(re->context, p, port_num, &block,
|
|
Packit Service |
54dbc3 |
block_length, block_num);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
for (i = 0; i < block_length; i++)
|
|
Packit Service |
54dbc3 |
block.vl_entry[i].vl &= vl_mask;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!force_update &&
|
|
Packit Service |
54dbc3 |
!memcmp(&p->vl_arb[block_num], &block,
|
|
Packit Service |
54dbc3 |
block_length * sizeof(block.vl_entry[0])))
|
|
Packit Service |
54dbc3 |
return IB_SUCCESS;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
attr_mod = ((block_num + 1) << 16) | port_num;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_mad = osm_qos_mad_create(sm,p,sizeof(block),(uint8_t *) & block,
|
|
Packit Service |
54dbc3 |
IB_MAD_ATTR_VL_ARBITRATION, attr_mod);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!p_mad)
|
|
Packit Service |
54dbc3 |
return IB_INSUFFICIENT_MEMORY;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* Zero the stored VL Arbitration block, so in case the MAD will
|
|
Packit Service |
54dbc3 |
* end up with error, we will resend it in the next sweep.
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
memset(&p->vl_arb[block_num], 0,
|
|
Packit Service |
54dbc3 |
block_length * sizeof(block.vl_entry[0]));
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_qlist_insert_tail(mad_list, &p_mad->list_item);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return IB_SUCCESS;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static ib_api_status_t vlarb_update(osm_sm_t * sm, osm_physp_t * p,
|
|
Packit Service |
54dbc3 |
uint8_t port_num, unsigned force_update,
|
|
Packit Service |
54dbc3 |
const struct qos_config *qcfg,
|
|
Packit Service |
54dbc3 |
cl_qlist_t *mad_list)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
ib_api_status_t status = IB_SUCCESS;
|
|
Packit Service |
54dbc3 |
ib_port_info_t *p_pi = &p->port_info;
|
|
Packit Service |
54dbc3 |
unsigned len;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (ib_port_info_get_vl_cap(p_pi) == 1) { /* no VLArb if 1 data VL */
|
|
Packit Service |
54dbc3 |
p->vl_high_limit = 0;
|
|
Packit Service |
54dbc3 |
return status;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (p_pi->vl_arb_low_cap > 0) {
|
|
Packit Service |
54dbc3 |
len = p_pi->vl_arb_low_cap < IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK ?
|
|
Packit Service |
54dbc3 |
p_pi->vl_arb_low_cap : IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK;
|
|
Packit Service |
54dbc3 |
if ((status = vlarb_update_table_block(sm, p, port_num,
|
|
Packit Service |
54dbc3 |
force_update,
|
|
Packit Service |
54dbc3 |
&qcfg->vlarb_low[0],
|
|
Packit Service |
54dbc3 |
len, 0,
|
|
Packit Service |
54dbc3 |
mad_list)) != IB_SUCCESS)
|
|
Packit Service |
54dbc3 |
return status;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (p_pi->vl_arb_low_cap > IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK) {
|
|
Packit Service |
54dbc3 |
len = p_pi->vl_arb_low_cap % IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK;
|
|
Packit Service |
54dbc3 |
if ((status = vlarb_update_table_block(sm, p, port_num,
|
|
Packit Service |
54dbc3 |
force_update,
|
|
Packit Service |
54dbc3 |
&qcfg->vlarb_low[1],
|
|
Packit Service |
54dbc3 |
len, 1,
|
|
Packit Service |
54dbc3 |
mad_list)) != IB_SUCCESS)
|
|
Packit Service |
54dbc3 |
return status;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (p_pi->vl_arb_high_cap > 0) {
|
|
Packit Service |
54dbc3 |
len = p_pi->vl_arb_high_cap < IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK ?
|
|
Packit Service |
54dbc3 |
p_pi->vl_arb_high_cap : IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK;
|
|
Packit Service |
54dbc3 |
if ((status = vlarb_update_table_block(sm, p, port_num,
|
|
Packit Service |
54dbc3 |
force_update,
|
|
Packit Service |
54dbc3 |
&qcfg->vlarb_high[0],
|
|
Packit Service |
54dbc3 |
len, 2,
|
|
Packit Service |
54dbc3 |
mad_list)) != IB_SUCCESS)
|
|
Packit Service |
54dbc3 |
return status;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (p_pi->vl_arb_high_cap > IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK) {
|
|
Packit Service |
54dbc3 |
len = p_pi->vl_arb_high_cap % IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK;
|
|
Packit Service |
54dbc3 |
if ((status = vlarb_update_table_block(sm, p, port_num,
|
|
Packit Service |
54dbc3 |
force_update,
|
|
Packit Service |
54dbc3 |
&qcfg->vlarb_high[1],
|
|
Packit Service |
54dbc3 |
len, 3,
|
|
Packit Service |
54dbc3 |
mad_list)) != IB_SUCCESS)
|
|
Packit Service |
54dbc3 |
return status;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return status;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static ib_api_status_t sl2vl_update_table(osm_sm_t * sm, osm_physp_t * p,
|
|
Packit Service |
54dbc3 |
uint8_t in_port, uint32_t attr_mod,
|
|
Packit Service |
54dbc3 |
unsigned force_update,
|
|
Packit Service |
54dbc3 |
const ib_slvl_table_t * sl2vl_table,
|
|
Packit Service |
54dbc3 |
cl_qlist_t *mad_list)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
ib_slvl_table_t tbl, *p_tbl;
|
|
Packit Service |
54dbc3 |
unsigned vl_mask;
|
|
Packit Service |
54dbc3 |
uint8_t vl1, vl2;
|
|
Packit Service |
54dbc3 |
int i;
|
|
Packit Service |
54dbc3 |
qos_mad_item_t *p_mad;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
vl_mask = (1 << (ib_port_info_get_op_vls(&p->port_info) - 1)) - 1;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
for (i = 0; i < IB_MAX_NUM_VLS / 2; i++) {
|
|
Packit Service |
54dbc3 |
vl1 = sl2vl_table->raw_vl_by_sl[i] >> 4;
|
|
Packit Service |
54dbc3 |
vl2 = sl2vl_table->raw_vl_by_sl[i] & 0xf;
|
|
Packit Service |
54dbc3 |
if (vl1 != 15)
|
|
Packit Service |
54dbc3 |
vl1 &= vl_mask;
|
|
Packit Service |
54dbc3 |
if (vl2 != 15)
|
|
Packit Service |
54dbc3 |
vl2 &= vl_mask;
|
|
Packit Service |
54dbc3 |
tbl.raw_vl_by_sl[i] = (vl1 << 4) | vl2;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_tbl = osm_physp_get_slvl_tbl(p, in_port);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!force_update && !memcmp(p_tbl, &tbl, sizeof(tbl)))
|
|
Packit Service |
54dbc3 |
return IB_SUCCESS;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_mad = osm_qos_mad_create(sm, p, sizeof(tbl), (uint8_t *) & tbl,
|
|
Packit Service |
54dbc3 |
IB_MAD_ATTR_SLVL_TABLE, attr_mod);
|
|
Packit Service |
54dbc3 |
if (!p_mad)
|
|
Packit Service |
54dbc3 |
return IB_INSUFFICIENT_MEMORY;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* Zero the stored SL2VL block, so in case the MAD will
|
|
Packit Service |
54dbc3 |
* end up with error, we will resend it in the next sweep.
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
memset(p_tbl, 0, sizeof(tbl));
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_qlist_insert_tail(mad_list, &p_mad->list_item);
|
|
Packit Service |
54dbc3 |
return IB_SUCCESS;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static int qos_extports_setup(osm_sm_t * sm, osm_node_t *node,
|
|
Packit Service |
54dbc3 |
const struct qos_config *qcfg,
|
|
Packit Service |
54dbc3 |
cl_qlist_t *port_mad_list)
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
osm_physp_t *p0, *p;
|
|
Packit Service |
54dbc3 |
unsigned force_update;
|
|
Packit Service |
54dbc3 |
unsigned num_ports = osm_node_get_num_physp(node);
|
|
Packit Service |
54dbc3 |
struct osm_routing_engine *re = sm->p_subn->p_osm->routing_engine_used;
|
|
Packit Service |
54dbc3 |
int ret = 0;
|
|
Packit Service |
54dbc3 |
unsigned in, out;
|
|
Packit Service |
54dbc3 |
uint8_t op_vl, common_op_vl = 0, max_num = 0;
|
|
Packit Service |
54dbc3 |
uint8_t op_vl_arr[15];
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* Do nothing unless the most recent routing attempt was successful.
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
if (!re)
|
|
Packit Service |
54dbc3 |
return ret;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
for (out = 1; out < num_ports; out++) {
|
|
Packit Service |
54dbc3 |
p = osm_node_get_physp_ptr(node, out);
|
|
Packit Service |
54dbc3 |
if (!p)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
if (ib_port_info_get_port_state(&p->port_info) == IB_LINK_DOWN)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
force_update = p->need_update || sm->p_subn->need_update;
|
|
Packit Service |
54dbc3 |
p->vl_high_limit = qcfg->vl_high_limit;
|
|
Packit Service |
54dbc3 |
if (vlarb_update(sm, p, p->port_num, force_update, qcfg,
|
|
Packit Service |
54dbc3 |
port_mad_list))
|
|
Packit Service |
54dbc3 |
ret = -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p0 = osm_node_get_physp_ptr(node, 0);
|
|
Packit Service |
54dbc3 |
if (!(p0->port_info.capability_mask & IB_PORT_CAP_HAS_SL_MAP))
|
|
Packit Service |
54dbc3 |
return ret;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (ib_switch_info_get_opt_sl2vlmapping(&node->sw->switch_info) &&
|
|
Packit Service |
54dbc3 |
sm->p_subn->opt.use_optimized_slvl && !re->update_sl2vl) {
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* we should find the op_vl that is used by majority of ports */
|
|
Packit Service |
54dbc3 |
memset(&op_vl_arr[0], 0, sizeof(op_vl_arr));
|
|
Packit Service |
54dbc3 |
p0 = osm_node_get_physp_ptr(node, 1);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
for (out = 1; out < num_ports; out++) {
|
|
Packit Service |
54dbc3 |
p = osm_node_get_physp_ptr(node, out);
|
|
Packit Service |
54dbc3 |
if (!p)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
if (ib_port_info_get_port_state(&p->port_info) ==
|
|
Packit Service |
54dbc3 |
IB_LINK_DOWN)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
op_vl = ib_port_info_get_op_vls(&p->port_info);
|
|
Packit Service |
54dbc3 |
op_vl_arr[op_vl]++;
|
|
Packit Service |
54dbc3 |
if (op_vl_arr[op_vl] > max_num){
|
|
Packit Service |
54dbc3 |
max_num = op_vl_arr[op_vl];
|
|
Packit Service |
54dbc3 |
common_op_vl = op_vl;
|
|
Packit Service |
54dbc3 |
/* remember the port with most common op_vl */
|
|
Packit Service |
54dbc3 |
p0 = p;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (!p0)
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
force_update = node->sw->need_update || sm->p_subn->need_update;
|
|
Packit Service |
54dbc3 |
if (sl2vl_update_table(sm, p0, p0->port_num, 0x30000, force_update,
|
|
Packit Service |
54dbc3 |
&qcfg->sl2vl, port_mad_list))
|
|
Packit Service |
54dbc3 |
ret = -1;
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* Overwrite default ALL configuration if port's
|
|
Packit Service |
54dbc3 |
* op_vl is different.
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
for (out = 1; out < num_ports; out++) {
|
|
Packit Service |
54dbc3 |
p = osm_node_get_physp_ptr(node, out);
|
|
Packit Service |
54dbc3 |
if (!p)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
if (ib_port_info_get_port_state(&p->port_info) ==
|
|
Packit Service |
54dbc3 |
IB_LINK_DOWN)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
force_update = p->need_update || force_update;
|
|
Packit Service |
54dbc3 |
if (ib_port_info_get_op_vls(&p->port_info) !=
|
|
Packit Service |
54dbc3 |
common_op_vl &&
|
|
Packit Service |
54dbc3 |
sl2vl_update_table(sm, p, p->port_num, 0x20000 | out,
|
|
Packit Service |
54dbc3 |
force_update, &qcfg->sl2vl,
|
|
Packit Service |
54dbc3 |
port_mad_list))
|
|
Packit Service |
54dbc3 |
ret = -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
return ret;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* non optimized sl2vl configuration */
|
|
Packit Service |
54dbc3 |
out = ib_switch_info_is_enhanced_port0(&node->sw->switch_info) ? 0 : 1;
|
|
Packit Service |
54dbc3 |
for (; out < num_ports; out++) {
|
|
Packit Service |
54dbc3 |
p = osm_node_get_physp_ptr(node, out);
|
|
Packit Service |
54dbc3 |
if (!p)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
if (ib_port_info_get_port_state(&p->port_info) == IB_LINK_DOWN)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
force_update = p->need_update || sm->p_subn->need_update;
|
|
Packit Service |
54dbc3 |
/* go over all in ports */
|
|
Packit Service |
54dbc3 |
for (in = 0; in < num_ports; in++) {
|
|
Packit Service |
54dbc3 |
const ib_slvl_table_t *port_sl2vl = &qcfg->sl2vl;
|
|
Packit Service |
54dbc3 |
ib_slvl_table_t routing_sl2vl;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (re->update_sl2vl) {
|
|
Packit Service |
54dbc3 |
routing_sl2vl = *port_sl2vl;
|
|
Packit Service |
54dbc3 |
re->update_sl2vl(re->context,
|
|
Packit Service |
54dbc3 |
p, in, out, &routing_sl2vl);
|
|
Packit Service |
54dbc3 |
port_sl2vl = &routing_sl2vl;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (sl2vl_update_table(sm, p, in, in << 8 | out,
|
|
Packit Service |
54dbc3 |
force_update, port_sl2vl,
|
|
Packit Service |
54dbc3 |
port_mad_list))
|
|
Packit Service |
54dbc3 |
ret = -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return ret;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static int qos_endport_setup(osm_sm_t * sm, osm_physp_t * p,
|
|
Packit Service |
54dbc3 |
const struct qos_config *qcfg, int vlarb_only,
|
|
Packit Service |
54dbc3 |
cl_qlist_t *port_mad_list)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
unsigned force_update = p->need_update || sm->p_subn->need_update;
|
|
Packit Service |
54dbc3 |
struct osm_routing_engine *re = sm->p_subn->p_osm->routing_engine_used;
|
|
Packit Service |
54dbc3 |
const ib_slvl_table_t *port_sl2vl = &qcfg->sl2vl;
|
|
Packit Service |
54dbc3 |
ib_slvl_table_t routing_sl2vl;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p->vl_high_limit = qcfg->vl_high_limit;
|
|
Packit Service |
54dbc3 |
if (vlarb_update(sm, p, 0, force_update, qcfg, port_mad_list))
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
if (vlarb_only)
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!(p->port_info.capability_mask & IB_PORT_CAP_HAS_SL_MAP))
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (re && re->update_sl2vl) {
|
|
Packit Service |
54dbc3 |
routing_sl2vl = *port_sl2vl;
|
|
Packit Service |
54dbc3 |
re->update_sl2vl(re->context, p, 0, 0, &routing_sl2vl);
|
|
Packit Service |
54dbc3 |
port_sl2vl = &routing_sl2vl;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (sl2vl_update_table(sm, p, 0, 0, force_update, port_sl2vl,
|
|
Packit Service |
54dbc3 |
port_mad_list))
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
int osm_qos_setup(osm_opensm_t * p_osm)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
struct qos_config ca_config, sw0_config, swe_config, rtr_config;
|
|
Packit Service |
54dbc3 |
struct qos_config *cfg;
|
|
Packit Service |
54dbc3 |
cl_qmap_t *p_tbl;
|
|
Packit Service |
54dbc3 |
cl_map_item_t *p_next;
|
|
Packit Service |
54dbc3 |
osm_port_t *p_port;
|
|
Packit Service |
54dbc3 |
osm_node_t *p_node;
|
|
Packit Service |
54dbc3 |
int ret = 0;
|
|
Packit Service |
54dbc3 |
int vlarb_only;
|
|
Packit Service |
54dbc3 |
qos_mad_list_t *p_list, *p_list_next;
|
|
Packit Service |
54dbc3 |
qos_mad_item_t *p_port_mad;
|
|
Packit Service |
54dbc3 |
cl_qlist_t qos_mad_list;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!p_osm->subn.opt.qos)
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG_ENTER(&p_osm->log);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
qos_build_config(&ca_config, &p_osm->subn.opt.qos_ca_options,
|
|
Packit Service |
54dbc3 |
&p_osm->subn.opt.qos_options);
|
|
Packit Service |
54dbc3 |
qos_build_config(&sw0_config, &p_osm->subn.opt.qos_sw0_options,
|
|
Packit Service |
54dbc3 |
&p_osm->subn.opt.qos_options);
|
|
Packit Service |
54dbc3 |
qos_build_config(&swe_config, &p_osm->subn.opt.qos_swe_options,
|
|
Packit Service |
54dbc3 |
&p_osm->subn.opt.qos_options);
|
|
Packit Service |
54dbc3 |
qos_build_config(&rtr_config, &p_osm->subn.opt.qos_rtr_options,
|
|
Packit Service |
54dbc3 |
&p_osm->subn.opt.qos_options);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_qlist_init(&qos_mad_list);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_excl_acquire(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* read QoS policy config file */
|
|
Packit Service |
54dbc3 |
osm_qos_parse_policy_file(&p_osm->subn);
|
|
Packit Service |
54dbc3 |
p_tbl = &p_osm->subn.port_guid_tbl;
|
|
Packit Service |
54dbc3 |
p_next = cl_qmap_head(p_tbl);
|
|
Packit Service |
54dbc3 |
while (p_next != cl_qmap_end(p_tbl)) {
|
|
Packit Service |
54dbc3 |
vlarb_only = 0;
|
|
Packit Service |
54dbc3 |
p_port = (osm_port_t *) p_next;
|
|
Packit Service |
54dbc3 |
p_next = cl_qmap_next(p_next);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_list = (qos_mad_list_t *) malloc(sizeof(*p_list));
|
|
Packit Service |
54dbc3 |
if (!p_list) {
|
|
Packit Service |
54dbc3 |
cl_plock_release(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
memset(p_list, 0, sizeof(*p_list));
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_qlist_init(&p_list->port_mad_list);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_node = p_port->p_node;
|
|
Packit Service |
54dbc3 |
if (p_node->sw) {
|
|
Packit Service |
54dbc3 |
if (qos_extports_setup(&p_osm->sm, p_node, &swe_config,
|
|
Packit Service |
54dbc3 |
&p_list->port_mad_list)) {
|
|
Packit Service |
54dbc3 |
cl_plock_release(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
ret = -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* skip base port 0 */
|
|
Packit Service |
54dbc3 |
if (!ib_switch_info_is_enhanced_port0
|
|
Packit Service |
54dbc3 |
(&p_node->sw->switch_info))
|
|
Packit Service |
54dbc3 |
goto Continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (ib_switch_info_get_opt_sl2vlmapping(&p_node->sw->switch_info) &&
|
|
Packit Service |
54dbc3 |
p_osm->sm.p_subn->opt.use_optimized_slvl &&
|
|
Packit Service |
54dbc3 |
!memcmp(&swe_config.sl2vl, &sw0_config.sl2vl,
|
|
Packit Service |
54dbc3 |
sizeof(swe_config.sl2vl)))
|
|
Packit Service |
54dbc3 |
vlarb_only = 1;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cfg = &sw0_config;
|
|
Packit Service |
54dbc3 |
} else if (osm_node_get_type(p_node) == IB_NODE_TYPE_ROUTER)
|
|
Packit Service |
54dbc3 |
cfg = &rtr_config;
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
cfg = &ca_config;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (qos_endport_setup(&p_osm->sm, p_port->p_physp, cfg,
|
|
Packit Service |
54dbc3 |
vlarb_only, &p_list->port_mad_list)) {
|
|
Packit Service |
54dbc3 |
cl_plock_release(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
ret = -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
Continue:
|
|
Packit Service |
54dbc3 |
/* if MAD list is not empty, add it to the global MAD list */
|
|
Packit Service |
54dbc3 |
if (cl_qlist_count(&p_list->port_mad_list)) {
|
|
Packit Service |
54dbc3 |
cl_qlist_insert_tail(&qos_mad_list, &p_list->list_item);
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
free(p_list);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
while (cl_qlist_count(&qos_mad_list)) {
|
|
Packit Service |
54dbc3 |
p_list_next = (qos_mad_list_t *) cl_qlist_head(&qos_mad_list);
|
|
Packit Service |
54dbc3 |
while (p_list_next !=
|
|
Packit Service |
54dbc3 |
(qos_mad_list_t *) cl_qlist_end(&qos_mad_list)) {
|
|
Packit Service |
54dbc3 |
p_list = p_list_next;
|
|
Packit Service |
54dbc3 |
p_list_next = (qos_mad_list_t *)
|
|
Packit Service |
54dbc3 |
cl_qlist_next(&p_list->list_item);
|
|
Packit Service |
54dbc3 |
/* next MAD to send*/
|
|
Packit Service |
54dbc3 |
p_port_mad = (qos_mad_item_t *)
|
|
Packit Service |
54dbc3 |
cl_qlist_remove_head(&p_list->port_mad_list);
|
|
Packit Service |
54dbc3 |
osm_send_req_mad(&p_osm->sm, p_port_mad->p_madw);
|
|
Packit Service |
54dbc3 |
osm_qos_mad_delete(&p_port_mad);
|
|
Packit Service |
54dbc3 |
/* remove the QoS MAD from global MAD list */
|
|
Packit Service |
54dbc3 |
if (cl_qlist_count(&p_list->port_mad_list) == 0) {
|
|
Packit Service |
54dbc3 |
cl_qlist_remove_item(&qos_mad_list, &p_list->list_item);
|
|
Packit Service |
54dbc3 |
free(p_list);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_release(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
OSM_LOG_EXIT(&p_osm->log);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return ret;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* QoS config stuff
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
static int parse_one_unsigned(const char *str, char delim, unsigned *val)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char *end;
|
|
Packit Service |
54dbc3 |
*val = strtoul(str, &end, 0);
|
|
Packit Service |
54dbc3 |
if (*end)
|
|
Packit Service |
54dbc3 |
end++;
|
|
Packit Service |
54dbc3 |
return (int)(end - str);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static int parse_vlarb_entry(const char *str, ib_vl_arb_element_t * e)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
unsigned val;
|
|
Packit Service |
54dbc3 |
const char *p = str;
|
|
Packit Service |
54dbc3 |
p += parse_one_unsigned(p, ':', &val;;
|
|
Packit Service |
54dbc3 |
e->vl = val % 15;
|
|
Packit Service |
54dbc3 |
p += parse_one_unsigned(p, ',', &val;;
|
|
Packit Service |
54dbc3 |
e->weight = (uint8_t) val;
|
|
Packit Service |
54dbc3 |
return (int)(p - str);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static int parse_sl2vl_entry(const char *str, uint8_t * raw)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
unsigned val1, val2;
|
|
Packit Service |
54dbc3 |
const char *p = str;
|
|
Packit Service |
54dbc3 |
p += parse_one_unsigned(p, ',', &val1);
|
|
Packit Service |
54dbc3 |
p += parse_one_unsigned(p, ',', &val2);
|
|
Packit Service |
54dbc3 |
*raw = (val1 << 4) | (val2 & 0xf);
|
|
Packit Service |
54dbc3 |
return (int)(p - str);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void qos_build_config(struct qos_config *cfg, osm_qos_options_t * opt,
|
|
Packit Service |
54dbc3 |
osm_qos_options_t * dflt)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
int i;
|
|
Packit Service |
54dbc3 |
const char *p;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
memset(cfg, 0, sizeof(*cfg));
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (opt->max_vls > 0)
|
|
Packit Service |
54dbc3 |
cfg->max_vls = opt->max_vls;
|
|
Packit Service |
54dbc3 |
else {
|
|
Packit Service |
54dbc3 |
if (dflt->max_vls > 0)
|
|
Packit Service |
54dbc3 |
cfg->max_vls = dflt->max_vls;
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
cfg->max_vls = OSM_DEFAULT_QOS_MAX_VLS;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (opt->high_limit >= 0)
|
|
Packit Service |
54dbc3 |
cfg->vl_high_limit = (uint8_t) opt->high_limit;
|
|
Packit Service |
54dbc3 |
else {
|
|
Packit Service |
54dbc3 |
if (dflt->high_limit >= 0)
|
|
Packit Service |
54dbc3 |
cfg->vl_high_limit = (uint8_t) dflt->high_limit;
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
cfg->vl_high_limit = (uint8_t) OSM_DEFAULT_QOS_HIGH_LIMIT;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (opt->vlarb_high)
|
|
Packit Service |
54dbc3 |
p = opt->vlarb_high;
|
|
Packit Service |
54dbc3 |
else {
|
|
Packit Service |
54dbc3 |
if (dflt->vlarb_high)
|
|
Packit Service |
54dbc3 |
p = dflt->vlarb_high;
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
p = OSM_DEFAULT_QOS_VLARB_HIGH;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
for (i = 0; i < 2 * IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK; i++) {
|
|
Packit Service |
54dbc3 |
p += parse_vlarb_entry(p,
|
|
Packit Service |
54dbc3 |
&cfg->vlarb_high[i /
|
|
Packit Service |
54dbc3 |
IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK].
|
|
Packit Service |
54dbc3 |
vl_entry[i %
|
|
Packit Service |
54dbc3 |
IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK]);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (opt->vlarb_low)
|
|
Packit Service |
54dbc3 |
p = opt->vlarb_low;
|
|
Packit Service |
54dbc3 |
else {
|
|
Packit Service |
54dbc3 |
if (dflt->vlarb_low)
|
|
Packit Service |
54dbc3 |
p = dflt->vlarb_low;
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
p = OSM_DEFAULT_QOS_VLARB_LOW;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
for (i = 0; i < 2 * IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK; i++) {
|
|
Packit Service |
54dbc3 |
p += parse_vlarb_entry(p,
|
|
Packit Service |
54dbc3 |
&cfg->vlarb_low[i /
|
|
Packit Service |
54dbc3 |
IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK].
|
|
Packit Service |
54dbc3 |
vl_entry[i %
|
|
Packit Service |
54dbc3 |
IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK]);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p = opt->sl2vl ? opt->sl2vl : dflt->sl2vl;
|
|
Packit Service |
54dbc3 |
if (opt->sl2vl)
|
|
Packit Service |
54dbc3 |
p = opt->sl2vl;
|
|
Packit Service |
54dbc3 |
else {
|
|
Packit Service |
54dbc3 |
if (dflt->sl2vl)
|
|
Packit Service |
54dbc3 |
p = dflt->sl2vl;
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
p = OSM_DEFAULT_QOS_SL2VL;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
for (i = 0; i < IB_MAX_NUM_VLS / 2; i++)
|
|
Packit Service |
54dbc3 |
p += parse_sl2vl_entry(p, &cfg->sl2vl.raw_vl_by_sl[i]);
|
|
Packit Service |
54dbc3 |
}
|