|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2008-2009 Voltaire, Inc. All rights reserved.
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2007 The Regents of the University of California.
|
|
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 |
#if HAVE_CONFIG_H
|
|
Packit Service |
54dbc3 |
# include <config.h>
|
|
Packit Service |
54dbc3 |
#endif /* HAVE_CONFIG_H */
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_PERF_MGR
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#include <stdlib.h>
|
|
Packit Service |
54dbc3 |
#include <errno.h>
|
|
Packit Service |
54dbc3 |
#include <limits.h>
|
|
Packit Service |
54dbc3 |
#include <dlfcn.h>
|
|
Packit Service |
54dbc3 |
#include <sys/stat.h>
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_file_ids.h>
|
|
Packit Service |
54dbc3 |
#define FILE_ID OSM_FILE_PERFMGR_DB_C
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_perfmgr_db.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_perfmgr.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_opensm.h>
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void free_node(db_node_t * node);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/** =========================================================================
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
perfmgr_db_t *perfmgr_db_construct(osm_perfmgr_t *perfmgr)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
perfmgr_db_t *db = malloc(sizeof(*db));
|
|
Packit Service |
54dbc3 |
if (!db)
|
|
Packit Service |
54dbc3 |
return NULL;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_qmap_init(&db->pc_data);
|
|
Packit Service |
54dbc3 |
cl_plock_construct(&db->lock);
|
|
Packit Service |
54dbc3 |
cl_plock_init(&db->lock);
|
|
Packit Service |
54dbc3 |
db->perfmgr = perfmgr;
|
|
Packit Service |
54dbc3 |
return db;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/** =========================================================================
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
void perfmgr_db_destroy(perfmgr_db_t * db)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cl_map_item_t *item, *next_item;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (db) {
|
|
Packit Service |
54dbc3 |
item = cl_qmap_head(&db->pc_data);
|
|
Packit Service |
54dbc3 |
while (item != cl_qmap_end(&db->pc_data)) {
|
|
Packit Service |
54dbc3 |
next_item = cl_qmap_next(item);
|
|
Packit Service |
54dbc3 |
free_node((db_node_t *)item);
|
|
Packit Service |
54dbc3 |
item = next_item;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
cl_plock_destroy(&db->lock);
|
|
Packit Service |
54dbc3 |
free(db);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**********************************************************************
|
|
Packit Service |
54dbc3 |
* Internal call db->lock should be held when calling
|
|
Packit Service |
54dbc3 |
**********************************************************************/
|
|
Packit Service |
54dbc3 |
static inline db_node_t *get(perfmgr_db_t * db, uint64_t guid)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cl_map_item_t *rc = cl_qmap_get(&db->pc_data, guid);
|
|
Packit Service |
54dbc3 |
const cl_map_item_t *end = cl_qmap_end(&db->pc_data);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (rc == end)
|
|
Packit Service |
54dbc3 |
return NULL;
|
|
Packit Service |
54dbc3 |
return (db_node_t *) rc;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static inline perfmgr_db_err_t bad_node_port(db_node_t * node, uint8_t port)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
if (!node)
|
|
Packit Service |
54dbc3 |
return PERFMGR_EVENT_DB_GUIDNOTFOUND;
|
|
Packit Service |
54dbc3 |
if (port >= node->num_ports || (!node->esp0 && port == 0))
|
|
Packit Service |
54dbc3 |
return PERFMGR_EVENT_DB_PORTNOTFOUND;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return PERFMGR_EVENT_DB_SUCCESS;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static inline void mark_port_valid(db_node_t * node, uint8_t port)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
node->ports[port].valid = TRUE;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/** =========================================================================
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
static db_node_t *malloc_node(uint64_t guid, boolean_t esp0,
|
|
Packit Service |
54dbc3 |
uint8_t num_ports, char *name)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
int i = 0;
|
|
Packit Service |
54dbc3 |
time_t cur_time = 0;
|
|
Packit Service |
54dbc3 |
db_node_t *rc = malloc(sizeof(*rc));
|
|
Packit Service |
54dbc3 |
if (!rc)
|
|
Packit Service |
54dbc3 |
return NULL;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
rc->ports = calloc(num_ports, sizeof(db_port_t));
|
|
Packit Service |
54dbc3 |
if (!rc->ports)
|
|
Packit Service |
54dbc3 |
goto free_rc;
|
|
Packit Service |
54dbc3 |
rc->num_ports = num_ports;
|
|
Packit Service |
54dbc3 |
rc->node_guid = guid;
|
|
Packit Service |
54dbc3 |
rc->esp0 = esp0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cur_time = time(NULL);
|
|
Packit Service |
54dbc3 |
for (i = 0; i < num_ports; i++) {
|
|
Packit Service |
54dbc3 |
rc->ports[i].last_reset = cur_time;
|
|
Packit Service |
54dbc3 |
rc->ports[i].err_previous.time = cur_time;
|
|
Packit Service |
54dbc3 |
rc->ports[i].dc_previous.time = cur_time;
|
|
Packit Service |
54dbc3 |
rc->ports[i].valid = FALSE;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
snprintf(rc->node_name, sizeof(rc->node_name), "%s", name);
|
|
Packit Service |
54dbc3 |
rc->active = FALSE;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return rc;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
free_rc:
|
|
Packit Service |
54dbc3 |
free(rc);
|
|
Packit Service |
54dbc3 |
return NULL;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/** =========================================================================
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
static void free_node(db_node_t * node)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
if (!node)
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
if (node->ports)
|
|
Packit Service |
54dbc3 |
free(node->ports);
|
|
Packit Service |
54dbc3 |
free(node);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* insert nodes to the database */
|
|
Packit Service |
54dbc3 |
static perfmgr_db_err_t insert(perfmgr_db_t * db, db_node_t * node)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cl_map_item_t *rc = cl_qmap_insert(&db->pc_data, node->node_guid,
|
|
Packit Service |
54dbc3 |
(cl_map_item_t *) node);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if ((void *)rc != (void *)node)
|
|
Packit Service |
54dbc3 |
return PERFMGR_EVENT_DB_FAIL;
|
|
Packit Service |
54dbc3 |
return PERFMGR_EVENT_DB_SUCCESS;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t
|
|
Packit Service |
54dbc3 |
perfmgr_db_create_entry(perfmgr_db_t * db, uint64_t guid, boolean_t esp0,
|
|
Packit Service |
54dbc3 |
uint8_t num_ports, char *name)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t rc = PERFMGR_EVENT_DB_SUCCESS;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_excl_acquire(&db->lock);
|
|
Packit Service |
54dbc3 |
if (!get(db, guid)) {
|
|
Packit Service |
54dbc3 |
db_node_t *pc_node = malloc_node(guid, esp0, num_ports,
|
|
Packit Service |
54dbc3 |
name);
|
|
Packit Service |
54dbc3 |
if (!pc_node) {
|
|
Packit Service |
54dbc3 |
rc = PERFMGR_EVENT_DB_NOMEM;
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (insert(db, pc_node)) {
|
|
Packit Service |
54dbc3 |
free_node(pc_node);
|
|
Packit Service |
54dbc3 |
rc = PERFMGR_EVENT_DB_FAIL;
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
Exit:
|
|
Packit Service |
54dbc3 |
cl_plock_release(&db->lock);
|
|
Packit Service |
54dbc3 |
return rc;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t
|
|
Packit Service |
54dbc3 |
perfmgr_db_update_name(perfmgr_db_t * db, uint64_t node_guid, char *name)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
db_node_t *node = NULL;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_excl_acquire(&db->lock);
|
|
Packit Service |
54dbc3 |
node = get(db, node_guid);
|
|
Packit Service |
54dbc3 |
if (node)
|
|
Packit Service |
54dbc3 |
snprintf(node->node_name, sizeof(node->node_name), "%s", name);
|
|
Packit Service |
54dbc3 |
cl_plock_release(&db->lock);
|
|
Packit Service |
54dbc3 |
return (PERFMGR_EVENT_DB_SUCCESS);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t
|
|
Packit Service |
54dbc3 |
perfmgr_db_delete_entry(perfmgr_db_t * db, uint64_t guid)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cl_map_item_t * rc = cl_qmap_remove(&db->pc_data, guid);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (rc == cl_qmap_end(&db->pc_data))
|
|
Packit Service |
54dbc3 |
return(PERFMGR_EVENT_DB_GUIDNOTFOUND);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
db_node_t *pc_node = (db_node_t *)rc;
|
|
Packit Service |
54dbc3 |
free_node(pc_node);
|
|
Packit Service |
54dbc3 |
return(PERFMGR_EVENT_DB_SUCCESS);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t
|
|
Packit Service |
54dbc3 |
perfmgr_db_delete_inactive(perfmgr_db_t * db, unsigned *cnt)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t rc = PERFMGR_EVENT_DB_SUCCESS;
|
|
Packit Service |
54dbc3 |
int i = 0;
|
|
Packit Service |
54dbc3 |
int num = 0;
|
|
Packit Service |
54dbc3 |
uint64_t * guid_list = NULL;
|
|
Packit Service |
54dbc3 |
cl_map_item_t * p_map_item = cl_qmap_head(&db->pc_data);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (p_map_item == cl_qmap_end(&db->pc_data)) {
|
|
Packit Service |
54dbc3 |
rc = PERFMGR_EVENT_DB_SUCCESS;
|
|
Packit Service |
54dbc3 |
goto Done;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
while (p_map_item != cl_qmap_end(&db->pc_data)) {
|
|
Packit Service |
54dbc3 |
db_node_t *n = (db_node_t *)p_map_item;
|
|
Packit Service |
54dbc3 |
if (n->active == FALSE) {
|
|
Packit Service |
54dbc3 |
guid_list = realloc(guid_list,
|
|
Packit Service |
54dbc3 |
sizeof(*guid_list) * (num+1));
|
|
Packit Service |
54dbc3 |
if (!guid_list) {
|
|
Packit Service |
54dbc3 |
num = 0;
|
|
Packit Service |
54dbc3 |
rc = PERFMGR_EVENT_DB_NOMEM;
|
|
Packit Service |
54dbc3 |
goto Done;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
guid_list[num] = n->node_guid;
|
|
Packit Service |
54dbc3 |
num++;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
p_map_item = cl_qmap_next(p_map_item);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
for (i = 0 ; i < num; i++)
|
|
Packit Service |
54dbc3 |
perfmgr_db_delete_entry(db, guid_list[i]);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
free(guid_list);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
Done:
|
|
Packit Service |
54dbc3 |
if (cnt)
|
|
Packit Service |
54dbc3 |
*cnt = num;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return(rc);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t
|
|
Packit Service |
54dbc3 |
perfmgr_db_mark_active(perfmgr_db_t *db, uint64_t guid, boolean_t active)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
db_node_t *node = NULL;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_excl_acquire(&db->lock);
|
|
Packit Service |
54dbc3 |
node = get(db, guid);
|
|
Packit Service |
54dbc3 |
if (node)
|
|
Packit Service |
54dbc3 |
node->active = active;
|
|
Packit Service |
54dbc3 |
cl_plock_release(&db->lock);
|
|
Packit Service |
54dbc3 |
return (PERFMGR_EVENT_DB_SUCCESS);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**********************************************************************
|
|
Packit Service |
54dbc3 |
* Dump a reading vs the previous reading to stdout
|
|
Packit Service |
54dbc3 |
**********************************************************************/
|
|
Packit Service |
54dbc3 |
static inline void
|
|
Packit Service |
54dbc3 |
debug_dump_err_reading(perfmgr_db_t * db, uint64_t guid, uint8_t port_num,
|
|
Packit Service |
54dbc3 |
db_port_t * port, perfmgr_db_err_reading_t * cur)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
osm_log_t *log = db->perfmgr->log;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!OSM_LOG_IS_ACTIVE_V2(log, OSM_LOG_DEBUG))
|
|
Packit Service |
54dbc3 |
return; /* optimize this a bit */
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"GUID 0x%" PRIx64 " Port %u:\n", guid, port_num);
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"sym %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n",
|
|
Packit Service |
54dbc3 |
cur->symbol_err_cnt, port->err_previous.symbol_err_cnt,
|
|
Packit Service |
54dbc3 |
port->err_total.symbol_err_cnt);
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"ler %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n",
|
|
Packit Service |
54dbc3 |
cur->link_err_recover, port->err_previous.link_err_recover,
|
|
Packit Service |
54dbc3 |
port->err_total.link_err_recover);
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"ld %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n",
|
|
Packit Service |
54dbc3 |
cur->link_downed, port->err_previous.link_downed,
|
|
Packit Service |
54dbc3 |
port->err_total.link_downed);
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"re %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", cur->rcv_err,
|
|
Packit Service |
54dbc3 |
port->err_previous.rcv_err, port->err_total.rcv_err);
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"rrp %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n",
|
|
Packit Service |
54dbc3 |
cur->rcv_rem_phys_err, port->err_previous.rcv_rem_phys_err,
|
|
Packit Service |
54dbc3 |
port->err_total.rcv_rem_phys_err);
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"rsr %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n",
|
|
Packit Service |
54dbc3 |
cur->rcv_switch_relay_err,
|
|
Packit Service |
54dbc3 |
port->err_previous.rcv_switch_relay_err,
|
|
Packit Service |
54dbc3 |
port->err_total.rcv_switch_relay_err);
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"xd %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n",
|
|
Packit Service |
54dbc3 |
cur->xmit_discards, port->err_previous.xmit_discards,
|
|
Packit Service |
54dbc3 |
port->err_total.xmit_discards);
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"xce %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n",
|
|
Packit Service |
54dbc3 |
cur->xmit_constraint_err,
|
|
Packit Service |
54dbc3 |
port->err_previous.xmit_constraint_err,
|
|
Packit Service |
54dbc3 |
port->err_total.xmit_constraint_err);
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"rce %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n",
|
|
Packit Service |
54dbc3 |
cur->rcv_constraint_err, port->err_previous.rcv_constraint_err,
|
|
Packit Service |
54dbc3 |
port->err_total.rcv_constraint_err);
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"li %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n",
|
|
Packit Service |
54dbc3 |
cur->link_integrity, port->err_previous.link_integrity,
|
|
Packit Service |
54dbc3 |
port->err_total.link_integrity);
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"bo %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n",
|
|
Packit Service |
54dbc3 |
cur->buffer_overrun, port->err_previous.buffer_overrun,
|
|
Packit Service |
54dbc3 |
port->err_total.buffer_overrun);
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"vld %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n",
|
|
Packit Service |
54dbc3 |
cur->vl15_dropped, port->err_previous.vl15_dropped,
|
|
Packit Service |
54dbc3 |
port->err_total.vl15_dropped);
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"xw %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n",
|
|
Packit Service |
54dbc3 |
cur->xmit_wait, port->err_previous.xmit_wait,
|
|
Packit Service |
54dbc3 |
port->err_total.xmit_wait);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**********************************************************************
|
|
Packit Service |
54dbc3 |
* perfmgr_db_err_reading_t functions
|
|
Packit Service |
54dbc3 |
**********************************************************************/
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t
|
|
Packit Service |
54dbc3 |
perfmgr_db_add_err_reading(perfmgr_db_t * db, uint64_t guid, uint8_t port,
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_reading_t * reading)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
db_port_t *p_port = NULL;
|
|
Packit Service |
54dbc3 |
db_node_t *node = NULL;
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_reading_t *previous = NULL;
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t rc = PERFMGR_EVENT_DB_SUCCESS;
|
|
Packit Service |
54dbc3 |
osm_epi_pe_event_t epi_pe_data;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_excl_acquire(&db->lock);
|
|
Packit Service |
54dbc3 |
node = get(db, guid);
|
|
Packit Service |
54dbc3 |
if ((rc = bad_node_port(node, port)) != PERFMGR_EVENT_DB_SUCCESS)
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
mark_port_valid(node, port);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_port = &(node->ports[port]);
|
|
Packit Service |
54dbc3 |
previous = &(node->ports[port].err_previous);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
debug_dump_err_reading(db, guid, port, p_port, reading);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
epi_pe_data.time_diff_s = (reading->time - previous->time);
|
|
Packit Service |
54dbc3 |
osm_epi_create_port_id(&epi_pe_data.port_id, guid, port,
|
|
Packit Service |
54dbc3 |
node->node_name);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* calculate changes from previous reading */
|
|
Packit Service |
54dbc3 |
epi_pe_data.symbol_err_cnt =
|
|
Packit Service |
54dbc3 |
(reading->symbol_err_cnt - previous->symbol_err_cnt);
|
|
Packit Service |
54dbc3 |
p_port->err_total.symbol_err_cnt += epi_pe_data.symbol_err_cnt;
|
|
Packit Service |
54dbc3 |
epi_pe_data.link_err_recover =
|
|
Packit Service |
54dbc3 |
(reading->link_err_recover - previous->link_err_recover);
|
|
Packit Service |
54dbc3 |
p_port->err_total.link_err_recover += epi_pe_data.link_err_recover;
|
|
Packit Service |
54dbc3 |
epi_pe_data.link_downed =
|
|
Packit Service |
54dbc3 |
(reading->link_downed - previous->link_downed);
|
|
Packit Service |
54dbc3 |
p_port->err_total.link_downed += epi_pe_data.link_downed;
|
|
Packit Service |
54dbc3 |
epi_pe_data.rcv_err = (reading->rcv_err - previous->rcv_err);
|
|
Packit Service |
54dbc3 |
p_port->err_total.rcv_err += epi_pe_data.rcv_err;
|
|
Packit Service |
54dbc3 |
epi_pe_data.rcv_rem_phys_err =
|
|
Packit Service |
54dbc3 |
(reading->rcv_rem_phys_err - previous->rcv_rem_phys_err);
|
|
Packit Service |
54dbc3 |
p_port->err_total.rcv_rem_phys_err += epi_pe_data.rcv_rem_phys_err;
|
|
Packit Service |
54dbc3 |
epi_pe_data.rcv_switch_relay_err =
|
|
Packit Service |
54dbc3 |
(reading->rcv_switch_relay_err - previous->rcv_switch_relay_err);
|
|
Packit Service |
54dbc3 |
p_port->err_total.rcv_switch_relay_err +=
|
|
Packit Service |
54dbc3 |
epi_pe_data.rcv_switch_relay_err;
|
|
Packit Service |
54dbc3 |
epi_pe_data.xmit_discards =
|
|
Packit Service |
54dbc3 |
(reading->xmit_discards - previous->xmit_discards);
|
|
Packit Service |
54dbc3 |
p_port->err_total.xmit_discards += epi_pe_data.xmit_discards;
|
|
Packit Service |
54dbc3 |
epi_pe_data.xmit_constraint_err =
|
|
Packit Service |
54dbc3 |
(reading->xmit_constraint_err - previous->xmit_constraint_err);
|
|
Packit Service |
54dbc3 |
p_port->err_total.xmit_constraint_err +=
|
|
Packit Service |
54dbc3 |
epi_pe_data.xmit_constraint_err;
|
|
Packit Service |
54dbc3 |
epi_pe_data.rcv_constraint_err =
|
|
Packit Service |
54dbc3 |
(reading->rcv_constraint_err - previous->rcv_constraint_err);
|
|
Packit Service |
54dbc3 |
p_port->err_total.rcv_constraint_err += epi_pe_data.rcv_constraint_err;
|
|
Packit Service |
54dbc3 |
epi_pe_data.link_integrity =
|
|
Packit Service |
54dbc3 |
(reading->link_integrity - previous->link_integrity);
|
|
Packit Service |
54dbc3 |
p_port->err_total.link_integrity += epi_pe_data.link_integrity;
|
|
Packit Service |
54dbc3 |
epi_pe_data.buffer_overrun =
|
|
Packit Service |
54dbc3 |
(reading->buffer_overrun - previous->buffer_overrun);
|
|
Packit Service |
54dbc3 |
p_port->err_total.buffer_overrun += epi_pe_data.buffer_overrun;
|
|
Packit Service |
54dbc3 |
epi_pe_data.vl15_dropped =
|
|
Packit Service |
54dbc3 |
(reading->vl15_dropped - previous->vl15_dropped);
|
|
Packit Service |
54dbc3 |
p_port->err_total.vl15_dropped += epi_pe_data.vl15_dropped;
|
|
Packit Service |
54dbc3 |
epi_pe_data.xmit_wait =
|
|
Packit Service |
54dbc3 |
(reading->xmit_wait - previous->xmit_wait);
|
|
Packit Service |
54dbc3 |
p_port->err_total.xmit_wait += epi_pe_data.xmit_wait;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_port->err_previous = *reading;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* mark the time this total was updated */
|
|
Packit Service |
54dbc3 |
p_port->err_total.time = reading->time;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
osm_opensm_report_event(db->perfmgr->osm, OSM_EVENT_ID_PORT_ERRORS,
|
|
Packit Service |
54dbc3 |
&epi_pe_data);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
Exit:
|
|
Packit Service |
54dbc3 |
cl_plock_release(&db->lock);
|
|
Packit Service |
54dbc3 |
return rc;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t perfmgr_db_get_prev_err(perfmgr_db_t * db, uint64_t guid,
|
|
Packit Service |
54dbc3 |
uint8_t port,
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_reading_t * reading)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
db_node_t *node = NULL;
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t rc = PERFMGR_EVENT_DB_SUCCESS;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_acquire(&db->lock);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
node = get(db, guid);
|
|
Packit Service |
54dbc3 |
if ((rc = bad_node_port(node, port)) != PERFMGR_EVENT_DB_SUCCESS)
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
*reading = node->ports[port].err_previous;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
Exit:
|
|
Packit Service |
54dbc3 |
cl_plock_release(&db->lock);
|
|
Packit Service |
54dbc3 |
return rc;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t
|
|
Packit Service |
54dbc3 |
perfmgr_db_clear_prev_err(perfmgr_db_t * db, uint64_t guid, uint8_t port)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
db_node_t *node = NULL;
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_reading_t *previous = NULL;
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t rc = PERFMGR_EVENT_DB_SUCCESS;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_excl_acquire(&db->lock);
|
|
Packit Service |
54dbc3 |
node = get(db, guid);
|
|
Packit Service |
54dbc3 |
if ((rc = bad_node_port(node, port)) != PERFMGR_EVENT_DB_SUCCESS)
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
previous = &(node->ports[port].err_previous);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
memset(previous, 0, sizeof(*previous));
|
|
Packit Service |
54dbc3 |
node->ports[port].err_previous.time = time(NULL);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
Exit:
|
|
Packit Service |
54dbc3 |
cl_plock_release(&db->lock);
|
|
Packit Service |
54dbc3 |
return rc;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static inline void
|
|
Packit Service |
54dbc3 |
debug_dump_dc_reading(perfmgr_db_t * db, uint64_t guid, uint8_t port_num,
|
|
Packit Service |
54dbc3 |
db_port_t * port, perfmgr_db_data_cnt_reading_t * cur)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
osm_log_t *log = db->perfmgr->log;
|
|
Packit Service |
54dbc3 |
if (!OSM_LOG_IS_ACTIVE_V2(log, OSM_LOG_DEBUG))
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"xd %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n",
|
|
Packit Service |
54dbc3 |
cur->xmit_data, port->dc_previous.xmit_data,
|
|
Packit Service |
54dbc3 |
port->dc_total.xmit_data);
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"rd %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", cur->rcv_data,
|
|
Packit Service |
54dbc3 |
port->dc_previous.rcv_data, port->dc_total.rcv_data);
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"xp %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n",
|
|
Packit Service |
54dbc3 |
cur->xmit_pkts, port->dc_previous.xmit_pkts,
|
|
Packit Service |
54dbc3 |
port->dc_total.xmit_pkts);
|
|
Packit Service |
54dbc3 |
osm_log_v2(log, OSM_LOG_DEBUG, FILE_ID,
|
|
Packit Service |
54dbc3 |
"rp %" PRIu64 " <-- %" PRIu64 " (%" PRIu64 ")\n", cur->rcv_pkts,
|
|
Packit Service |
54dbc3 |
port->dc_previous.rcv_pkts, port->dc_total.rcv_pkts);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**********************************************************************
|
|
Packit Service |
54dbc3 |
* perfmgr_db_data_cnt_reading_t functions
|
|
Packit Service |
54dbc3 |
**********************************************************************/
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t
|
|
Packit Service |
54dbc3 |
perfmgr_db_add_dc_reading(perfmgr_db_t * db, uint64_t guid, uint8_t port,
|
|
Packit Service |
54dbc3 |
perfmgr_db_data_cnt_reading_t * reading,
|
|
Packit Service |
54dbc3 |
int ietf_sup)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
db_port_t *p_port = NULL;
|
|
Packit Service |
54dbc3 |
db_node_t *node = NULL;
|
|
Packit Service |
54dbc3 |
perfmgr_db_data_cnt_reading_t *previous = NULL;
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t rc = PERFMGR_EVENT_DB_SUCCESS;
|
|
Packit Service |
54dbc3 |
osm_epi_dc_event_t epi_dc_data;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_excl_acquire(&db->lock);
|
|
Packit Service |
54dbc3 |
node = get(db, guid);
|
|
Packit Service |
54dbc3 |
if ((rc = bad_node_port(node, port)) != PERFMGR_EVENT_DB_SUCCESS)
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
mark_port_valid(node, port);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_port = &node->ports[port];
|
|
Packit Service |
54dbc3 |
previous = &node->ports[port].dc_previous;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
debug_dump_dc_reading(db, guid, port, p_port, reading);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
epi_dc_data.time_diff_s = reading->time - previous->time;
|
|
Packit Service |
54dbc3 |
osm_epi_create_port_id(&epi_dc_data.port_id, guid, port,
|
|
Packit Service |
54dbc3 |
node->node_name);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* calculate changes from previous reading */
|
|
Packit Service |
54dbc3 |
epi_dc_data.xmit_data = reading->xmit_data - previous->xmit_data;
|
|
Packit Service |
54dbc3 |
p_port->dc_total.xmit_data += epi_dc_data.xmit_data;
|
|
Packit Service |
54dbc3 |
epi_dc_data.rcv_data = reading->rcv_data - previous->rcv_data;
|
|
Packit Service |
54dbc3 |
p_port->dc_total.rcv_data += epi_dc_data.rcv_data;
|
|
Packit Service |
54dbc3 |
epi_dc_data.xmit_pkts = reading->xmit_pkts - previous->xmit_pkts;
|
|
Packit Service |
54dbc3 |
p_port->dc_total.xmit_pkts += epi_dc_data.xmit_pkts;
|
|
Packit Service |
54dbc3 |
epi_dc_data.rcv_pkts = reading->rcv_pkts - previous->rcv_pkts;
|
|
Packit Service |
54dbc3 |
p_port->dc_total.rcv_pkts += epi_dc_data.rcv_pkts;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (ietf_sup)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
epi_dc_data.unicast_xmit_pkts =
|
|
Packit Service |
54dbc3 |
reading->unicast_xmit_pkts - previous->unicast_xmit_pkts;
|
|
Packit Service |
54dbc3 |
p_port->dc_total.unicast_xmit_pkts += epi_dc_data.unicast_xmit_pkts;
|
|
Packit Service |
54dbc3 |
epi_dc_data.unicast_rcv_pkts =
|
|
Packit Service |
54dbc3 |
reading->unicast_rcv_pkts - previous->unicast_rcv_pkts;
|
|
Packit Service |
54dbc3 |
p_port->dc_total.unicast_rcv_pkts += epi_dc_data.unicast_rcv_pkts;
|
|
Packit Service |
54dbc3 |
epi_dc_data.multicast_xmit_pkts =
|
|
Packit Service |
54dbc3 |
reading->multicast_xmit_pkts - previous->multicast_xmit_pkts;
|
|
Packit Service |
54dbc3 |
p_port->dc_total.multicast_xmit_pkts += epi_dc_data.multicast_xmit_pkts;
|
|
Packit Service |
54dbc3 |
epi_dc_data.multicast_rcv_pkts =
|
|
Packit Service |
54dbc3 |
reading->multicast_rcv_pkts - previous->multicast_rcv_pkts;
|
|
Packit Service |
54dbc3 |
p_port->dc_total.multicast_rcv_pkts += epi_dc_data.multicast_rcv_pkts;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_port->dc_previous = *reading;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* mark the time this total was updated */
|
|
Packit Service |
54dbc3 |
p_port->dc_total.time = reading->time;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
osm_opensm_report_event(db->perfmgr->osm,
|
|
Packit Service |
54dbc3 |
OSM_EVENT_ID_PORT_DATA_COUNTERS, &epi_dc_data);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
Exit:
|
|
Packit Service |
54dbc3 |
cl_plock_release(&db->lock);
|
|
Packit Service |
54dbc3 |
return rc;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t perfmgr_db_get_prev_dc(perfmgr_db_t * db, uint64_t guid,
|
|
Packit Service |
54dbc3 |
uint8_t port,
|
|
Packit Service |
54dbc3 |
perfmgr_db_data_cnt_reading_t * reading)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
db_node_t *node = NULL;
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t rc = PERFMGR_EVENT_DB_SUCCESS;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_acquire(&db->lock);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
node = get(db, guid);
|
|
Packit Service |
54dbc3 |
if ((rc = bad_node_port(node, port)) != PERFMGR_EVENT_DB_SUCCESS)
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
*reading = node->ports[port].dc_previous;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
Exit:
|
|
Packit Service |
54dbc3 |
cl_plock_release(&db->lock);
|
|
Packit Service |
54dbc3 |
return rc;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t
|
|
Packit Service |
54dbc3 |
perfmgr_db_clear_prev_dc(perfmgr_db_t * db, uint64_t guid, uint8_t port)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
db_node_t *node = NULL;
|
|
Packit Service |
54dbc3 |
perfmgr_db_data_cnt_reading_t *previous = NULL;
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t rc = PERFMGR_EVENT_DB_SUCCESS;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_excl_acquire(&db->lock);
|
|
Packit Service |
54dbc3 |
node = get(db, guid);
|
|
Packit Service |
54dbc3 |
if ((rc = bad_node_port(node, port)) != PERFMGR_EVENT_DB_SUCCESS)
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
previous = &node->ports[port].dc_previous;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
memset(previous, 0, sizeof(*previous));
|
|
Packit Service |
54dbc3 |
node->ports[port].dc_previous.time = time(NULL);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
Exit:
|
|
Packit Service |
54dbc3 |
cl_plock_release(&db->lock);
|
|
Packit Service |
54dbc3 |
return rc;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void clear_counters(cl_map_item_t * const p_map_item, void *context)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
db_node_t *node = (db_node_t *) p_map_item;
|
|
Packit Service |
54dbc3 |
int i = 0;
|
|
Packit Service |
54dbc3 |
time_t ts = time(NULL);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
for (i = 0; i < node->num_ports; i++) {
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.symbol_err_cnt = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.link_err_recover = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.link_downed = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.rcv_err = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.rcv_rem_phys_err = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.rcv_switch_relay_err = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.xmit_discards = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.xmit_constraint_err = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.rcv_constraint_err = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.link_integrity = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.buffer_overrun = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.vl15_dropped = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.xmit_wait = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.time = ts;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.xmit_data = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.rcv_data = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.xmit_pkts = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.rcv_pkts = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.unicast_xmit_pkts = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.unicast_rcv_pkts = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.multicast_xmit_pkts = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.multicast_rcv_pkts = 0;
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.time = ts;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
node->ports[i].last_reset = ts;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**********************************************************************
|
|
Packit Service |
54dbc3 |
* Clear all the counters from the db
|
|
Packit Service |
54dbc3 |
**********************************************************************/
|
|
Packit Service |
54dbc3 |
void perfmgr_db_clear_counters(perfmgr_db_t * db)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cl_plock_excl_acquire(&db->lock);
|
|
Packit Service |
54dbc3 |
cl_qmap_apply_func(&db->pc_data, clear_counters, (void *)db);
|
|
Packit Service |
54dbc3 |
cl_plock_release(&db->lock);
|
|
Packit Service |
54dbc3 |
#if 0
|
|
Packit Service |
54dbc3 |
if (db->db_impl->clear_counters)
|
|
Packit Service |
54dbc3 |
db->db_impl->clear_counters(db->db_data);
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**********************************************************************
|
|
Packit Service |
54dbc3 |
* Output a tab delimited output of the port counters
|
|
Packit Service |
54dbc3 |
**********************************************************************/
|
|
Packit Service |
54dbc3 |
static void dump_node_mr(db_node_t * node, FILE * fp)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
int i = 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
fprintf(fp, "\nName\tGUID\tActive\tPort\tLast Reset\t"
|
|
Packit Service |
54dbc3 |
"Last Error Update\tLast Data Update\t"
|
|
Packit Service |
54dbc3 |
"%s\t%s\t"
|
|
Packit Service |
54dbc3 |
"%s\t%s\t%s\t%s\t%s\t%s\t%s\t"
|
|
Packit Service |
54dbc3 |
"%s\t%s\t%s\t%s\t%s\t%s\t%s\t"
|
|
Packit Service |
54dbc3 |
"%s\t%s\t%s\t%s\t%s\n",
|
|
Packit Service |
54dbc3 |
"symbol_err_cnt",
|
|
Packit Service |
54dbc3 |
"link_err_recover",
|
|
Packit Service |
54dbc3 |
"link_downed",
|
|
Packit Service |
54dbc3 |
"rcv_err",
|
|
Packit Service |
54dbc3 |
"rcv_rem_phys_err",
|
|
Packit Service |
54dbc3 |
"rcv_switch_relay_err",
|
|
Packit Service |
54dbc3 |
"xmit_discards",
|
|
Packit Service |
54dbc3 |
"xmit_constraint_err",
|
|
Packit Service |
54dbc3 |
"rcv_constraint_err",
|
|
Packit Service |
54dbc3 |
"link_int_err",
|
|
Packit Service |
54dbc3 |
"buf_overrun_err",
|
|
Packit Service |
54dbc3 |
"vl15_dropped",
|
|
Packit Service |
54dbc3 |
"xmit_wait",
|
|
Packit Service |
54dbc3 |
"xmit_data",
|
|
Packit Service |
54dbc3 |
"rcv_data",
|
|
Packit Service |
54dbc3 |
"xmit_pkts",
|
|
Packit Service |
54dbc3 |
"rcv_pkts",
|
|
Packit Service |
54dbc3 |
"unicast_xmit_pkts",
|
|
Packit Service |
54dbc3 |
"unicast_rcv_pkts",
|
|
Packit Service |
54dbc3 |
"multicast_xmit_pkts",
|
|
Packit Service |
54dbc3 |
"multicast_rcv_pkts");
|
|
Packit Service |
54dbc3 |
for (i = (node->esp0) ? 0 : 1; i < node->num_ports; i++) {
|
|
Packit Service |
54dbc3 |
char lr[128];
|
|
Packit Service |
54dbc3 |
char *last_reset = ctime_r(&node->ports[i].last_reset, lr);
|
|
Packit Service |
54dbc3 |
char leu[128];
|
|
Packit Service |
54dbc3 |
char *last_err_update = ctime_r(&node->ports[i].err_total.time, leu);
|
|
Packit Service |
54dbc3 |
char ldu[128];
|
|
Packit Service |
54dbc3 |
char *last_data_update = ctime_r(&node->ports[i].dc_total.time, ldu);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!node->ports[i].valid)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
last_reset[strlen(last_reset) - 1] = '\0'; /* remove \n */
|
|
Packit Service |
54dbc3 |
last_err_update[strlen(last_err_update) - 1] = '\0'; /* remove \n */
|
|
Packit Service |
54dbc3 |
last_data_update[strlen(last_data_update) - 1] = '\0'; /* remove \n */
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
fprintf(fp,
|
|
Packit Service |
54dbc3 |
"%s\t0x%" PRIx64 "\t%s\t%d\t%s\t%s\t%s\t%" PRIu64 "\t%" PRIu64 "\t"
|
|
Packit Service |
54dbc3 |
"%" PRIu64 "\t%" PRIu64 "\t%" PRIu64 "\t%" PRIu64 "\t"
|
|
Packit Service |
54dbc3 |
"%" PRIu64 "\t%" PRIu64 "\t%" PRIu64 "\t" "%" PRIu64
|
|
Packit Service |
54dbc3 |
"\t%" PRIu64 "\t%" PRIu64 "\t" "%" PRIu64 "\t%" PRIu64
|
|
Packit Service |
54dbc3 |
"\t%" PRIu64 "\t%" PRIu64 "\t" "%" PRIu64 "\t%" PRIu64
|
|
Packit Service |
54dbc3 |
"\t%" PRIu64 "\t%" PRIu64 "\t%" PRIu64 "\n", node->node_name,
|
|
Packit Service |
54dbc3 |
node->node_guid,
|
|
Packit Service |
54dbc3 |
node->active ? "TRUE" : "FALSE",
|
|
Packit Service |
54dbc3 |
i, last_reset, last_err_update, last_data_update,
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.symbol_err_cnt,
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.link_err_recover,
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.link_downed,
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.rcv_err,
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.rcv_rem_phys_err,
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.rcv_switch_relay_err,
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.xmit_discards,
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.xmit_constraint_err,
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.rcv_constraint_err,
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.link_integrity,
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.buffer_overrun,
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.vl15_dropped,
|
|
Packit Service |
54dbc3 |
node->ports[i].err_total.xmit_wait,
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.xmit_data,
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.rcv_data,
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.xmit_pkts,
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.rcv_pkts,
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.unicast_xmit_pkts,
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.unicast_rcv_pkts,
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.multicast_xmit_pkts,
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.multicast_rcv_pkts);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void dump_hr_dc(FILE *fp, uint64_t val64, int data)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
const char *unit = "";
|
|
Packit Service |
54dbc3 |
uint64_t tmp = val64;
|
|
Packit Service |
54dbc3 |
float val = 0.0;
|
|
Packit Service |
54dbc3 |
int ui = 0;
|
|
Packit Service |
54dbc3 |
uint64_t div = 1;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
tmp /= 1024;
|
|
Packit Service |
54dbc3 |
while (tmp) {
|
|
Packit Service |
54dbc3 |
ui++;
|
|
Packit Service |
54dbc3 |
tmp /= 1024;
|
|
Packit Service |
54dbc3 |
div *= 1024;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
val = (float)(val64);
|
|
Packit Service |
54dbc3 |
if (data) {
|
|
Packit Service |
54dbc3 |
val *= 4;
|
|
Packit Service |
54dbc3 |
if (val/div > 1024) {
|
|
Packit Service |
54dbc3 |
ui++;
|
|
Packit Service |
54dbc3 |
div *= 1024;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
val /= div;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
switch (ui) {
|
|
Packit Service |
54dbc3 |
case 1:
|
|
Packit Service |
54dbc3 |
unit = "K";
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 2:
|
|
Packit Service |
54dbc3 |
unit = "M";
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 3:
|
|
Packit Service |
54dbc3 |
unit = "G";
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 4:
|
|
Packit Service |
54dbc3 |
unit = "T";
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 5:
|
|
Packit Service |
54dbc3 |
unit = "P";
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 6:
|
|
Packit Service |
54dbc3 |
unit = "E";
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
fprintf(fp, " (%5.3f%s%s)\n", val, unit, data ? "B" : "");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**********************************************************************
|
|
Packit Service |
54dbc3 |
* Output a human readable output of the port counters
|
|
Packit Service |
54dbc3 |
**********************************************************************/
|
|
Packit Service |
54dbc3 |
static void dump_node_hr(db_node_t * node, FILE * fp, char *port, int err_only)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
int i = (node->esp0) ? 0 : 1;
|
|
Packit Service |
54dbc3 |
int num_ports = node->num_ports;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (port) {
|
|
Packit Service |
54dbc3 |
char *end = NULL;
|
|
Packit Service |
54dbc3 |
int p = strtoul(port, &end, 0);
|
|
Packit Service |
54dbc3 |
if (port + strlen(port) == end && p >= i && p < num_ports) {
|
|
Packit Service |
54dbc3 |
i = p;
|
|
Packit Service |
54dbc3 |
num_ports = p+1;
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
fprintf(fp, "Warning: \"%s\" is not a valid port\n", port);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
for (/* set above */; i < num_ports; i++) {
|
|
Packit Service |
54dbc3 |
char lr[128];
|
|
Packit Service |
54dbc3 |
char *last_reset = ctime_r(&node->ports[i].last_reset, lr);
|
|
Packit Service |
54dbc3 |
char leu[128];
|
|
Packit Service |
54dbc3 |
char *last_err_update = ctime_r(&node->ports[i].err_total.time, leu);
|
|
Packit Service |
54dbc3 |
char ldu[128];
|
|
Packit Service |
54dbc3 |
char *last_data_update = ctime_r(&node->ports[i].dc_total.time, ldu);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!node->ports[i].valid)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
last_reset[strlen(last_reset) - 1] = '\0'; /* remove \n */
|
|
Packit Service |
54dbc3 |
last_err_update[strlen(last_err_update) - 1] = '\0'; /* remove \n */
|
|
Packit Service |
54dbc3 |
last_data_update[strlen(last_data_update) - 1] = '\0'; /* remove \n */
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_reading_t *err = &node->ports[i].err_total;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (err_only
|
|
Packit Service |
54dbc3 |
&& err->symbol_err_cnt == 0
|
|
Packit Service |
54dbc3 |
&& err->link_err_recover == 0
|
|
Packit Service |
54dbc3 |
&& err->link_downed == 0
|
|
Packit Service |
54dbc3 |
&& err->rcv_err == 0
|
|
Packit Service |
54dbc3 |
&& err->rcv_rem_phys_err == 0
|
|
Packit Service |
54dbc3 |
&& err->rcv_switch_relay_err == 0
|
|
Packit Service |
54dbc3 |
&& err->xmit_discards == 0
|
|
Packit Service |
54dbc3 |
&& err->xmit_constraint_err == 0
|
|
Packit Service |
54dbc3 |
&& err->rcv_constraint_err == 0
|
|
Packit Service |
54dbc3 |
&& err->link_integrity == 0
|
|
Packit Service |
54dbc3 |
&& err->buffer_overrun == 0
|
|
Packit Service |
54dbc3 |
&& err->vl15_dropped == 0
|
|
Packit Service |
54dbc3 |
&& err->xmit_wait == 0)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
fprintf(fp, "\"%s\" 0x%" PRIx64 " active %s port %d\n"
|
|
Packit Service |
54dbc3 |
" Last Reset : %s\n"
|
|
Packit Service |
54dbc3 |
" Last Error Update : %s\n",
|
|
Packit Service |
54dbc3 |
node->node_name, node->node_guid,
|
|
Packit Service |
54dbc3 |
node->active ? "TRUE":"FALSE", i, last_reset,
|
|
Packit Service |
54dbc3 |
last_err_update);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!err_only || err->symbol_err_cnt != 0)
|
|
Packit Service |
54dbc3 |
fprintf(fp, " symbol_err_cnt : %" PRIu64 "\n",
|
|
Packit Service |
54dbc3 |
err->symbol_err_cnt);
|
|
Packit Service |
54dbc3 |
if (!err_only || err->link_err_recover != 0)
|
|
Packit Service |
54dbc3 |
fprintf(fp, " link_err_recover : %" PRIu64 "\n",
|
|
Packit Service |
54dbc3 |
err->link_err_recover);
|
|
Packit Service |
54dbc3 |
if (!err_only || err->link_downed != 0)
|
|
Packit Service |
54dbc3 |
fprintf(fp, " link_downed : %" PRIu64 "\n",
|
|
Packit Service |
54dbc3 |
err->link_downed);
|
|
Packit Service |
54dbc3 |
if (!err_only || err->rcv_err != 0)
|
|
Packit Service |
54dbc3 |
fprintf(fp, " rcv_err : %" PRIu64 "\n",
|
|
Packit Service |
54dbc3 |
err->rcv_err);
|
|
Packit Service |
54dbc3 |
if (!err_only || err->rcv_rem_phys_err != 0)
|
|
Packit Service |
54dbc3 |
fprintf(fp, " rcv_rem_phys_err : %" PRIu64 "\n",
|
|
Packit Service |
54dbc3 |
err->rcv_rem_phys_err);
|
|
Packit Service |
54dbc3 |
if (!err_only || err->rcv_switch_relay_err != 0)
|
|
Packit Service |
54dbc3 |
fprintf(fp, " rcv_switch_relay_err : %" PRIu64 "\n",
|
|
Packit Service |
54dbc3 |
err->rcv_switch_relay_err);
|
|
Packit Service |
54dbc3 |
if (!err_only || err->xmit_discards != 0)
|
|
Packit Service |
54dbc3 |
fprintf(fp, " xmit_discards : %" PRIu64 "\n",
|
|
Packit Service |
54dbc3 |
err->xmit_discards);
|
|
Packit Service |
54dbc3 |
if (!err_only || err->xmit_constraint_err != 0)
|
|
Packit Service |
54dbc3 |
fprintf(fp, " xmit_constraint_err : %" PRIu64 "\n",
|
|
Packit Service |
54dbc3 |
err->xmit_constraint_err);
|
|
Packit Service |
54dbc3 |
if (!err_only || err->rcv_constraint_err != 0)
|
|
Packit Service |
54dbc3 |
fprintf(fp, " rcv_constraint_err : %" PRIu64 "\n",
|
|
Packit Service |
54dbc3 |
err->rcv_constraint_err);
|
|
Packit Service |
54dbc3 |
if (!err_only || err->link_integrity != 0)
|
|
Packit Service |
54dbc3 |
fprintf(fp, " link_integrity_err : %" PRIu64 "\n",
|
|
Packit Service |
54dbc3 |
err->link_integrity);
|
|
Packit Service |
54dbc3 |
if (!err_only || err->buffer_overrun != 0)
|
|
Packit Service |
54dbc3 |
fprintf(fp, " buf_overrun_err : %" PRIu64 "\n",
|
|
Packit Service |
54dbc3 |
err->buffer_overrun);
|
|
Packit Service |
54dbc3 |
if (!err_only || err->vl15_dropped != 0)
|
|
Packit Service |
54dbc3 |
fprintf(fp, " vl15_dropped : %" PRIu64 "\n",
|
|
Packit Service |
54dbc3 |
err->vl15_dropped);
|
|
Packit Service |
54dbc3 |
if (!err_only || err->xmit_wait != 0)
|
|
Packit Service |
54dbc3 |
fprintf(fp, " xmit_wait : %" PRIu64 "\n",
|
|
Packit Service |
54dbc3 |
err->xmit_wait);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (err_only)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
fprintf(fp, " Last Data Update : %s\n",
|
|
Packit Service |
54dbc3 |
last_data_update);
|
|
Packit Service |
54dbc3 |
fprintf(fp, " xmit_data : %" PRIu64,
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.xmit_data);
|
|
Packit Service |
54dbc3 |
dump_hr_dc(fp, node->ports[i].dc_total.xmit_data, 1);
|
|
Packit Service |
54dbc3 |
fprintf(fp, " rcv_data : %" PRIu64,
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.rcv_data);
|
|
Packit Service |
54dbc3 |
dump_hr_dc(fp, node->ports[i].dc_total.rcv_data, 1);
|
|
Packit Service |
54dbc3 |
fprintf(fp, " xmit_pkts : %" PRIu64,
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.xmit_pkts);
|
|
Packit Service |
54dbc3 |
dump_hr_dc(fp, node->ports[i].dc_total.xmit_pkts, 0);
|
|
Packit Service |
54dbc3 |
fprintf(fp, " rcv_pkts : %" PRIu64,
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.rcv_pkts);
|
|
Packit Service |
54dbc3 |
dump_hr_dc(fp, node->ports[i].dc_total.rcv_pkts, 0);
|
|
Packit Service |
54dbc3 |
fprintf(fp, " unicast_xmit_pkts : %" PRIu64,
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.unicast_xmit_pkts);
|
|
Packit Service |
54dbc3 |
dump_hr_dc(fp, node->ports[i].dc_total.unicast_xmit_pkts, 0);
|
|
Packit Service |
54dbc3 |
fprintf(fp, " unicast_rcv_pkts : %" PRIu64,
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.unicast_rcv_pkts);
|
|
Packit Service |
54dbc3 |
dump_hr_dc(fp, node->ports[i].dc_total.unicast_rcv_pkts, 0);
|
|
Packit Service |
54dbc3 |
fprintf(fp, " multicast_xmit_pkts : %" PRIu64,
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.multicast_xmit_pkts);
|
|
Packit Service |
54dbc3 |
dump_hr_dc(fp, node->ports[i].dc_total.multicast_xmit_pkts, 0);
|
|
Packit Service |
54dbc3 |
fprintf(fp, " multicast_rcv_pkts : %" PRIu64,
|
|
Packit Service |
54dbc3 |
node->ports[i].dc_total.multicast_rcv_pkts);
|
|
Packit Service |
54dbc3 |
dump_hr_dc(fp, node->ports[i].dc_total.multicast_rcv_pkts, 0);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* Define a context for the __db_dump callback */
|
|
Packit Service |
54dbc3 |
typedef struct {
|
|
Packit Service |
54dbc3 |
FILE *fp;
|
|
Packit Service |
54dbc3 |
perfmgr_db_dump_t dump_type;
|
|
Packit Service |
54dbc3 |
} dump_context_t;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void db_dump(cl_map_item_t * const p_map_item, void *context)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
db_node_t *node = (db_node_t *) p_map_item;
|
|
Packit Service |
54dbc3 |
dump_context_t *c = (dump_context_t *) context;
|
|
Packit Service |
54dbc3 |
FILE *fp = c->fp;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
switch (c->dump_type) {
|
|
Packit Service |
54dbc3 |
case PERFMGR_EVENT_DB_DUMP_MR:
|
|
Packit Service |
54dbc3 |
dump_node_mr(node, fp);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case PERFMGR_EVENT_DB_DUMP_HR:
|
|
Packit Service |
54dbc3 |
default:
|
|
Packit Service |
54dbc3 |
dump_node_hr(node, fp, NULL, 0);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**********************************************************************
|
|
Packit Service |
54dbc3 |
* print all node data to fp
|
|
Packit Service |
54dbc3 |
**********************************************************************/
|
|
Packit Service |
54dbc3 |
void
|
|
Packit Service |
54dbc3 |
perfmgr_db_print_all(perfmgr_db_t * db, FILE *fp, int err_only)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cl_map_item_t *item;
|
|
Packit Service |
54dbc3 |
db_node_t *node;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_acquire(&db->lock);
|
|
Packit Service |
54dbc3 |
item = cl_qmap_head(&db->pc_data);
|
|
Packit Service |
54dbc3 |
while (item != cl_qmap_end(&db->pc_data)) {
|
|
Packit Service |
54dbc3 |
node = (db_node_t *)item;
|
|
Packit Service |
54dbc3 |
dump_node_hr(node, fp, NULL, err_only);
|
|
Packit Service |
54dbc3 |
item = cl_qmap_next(item);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
cl_plock_release(&db->lock);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**********************************************************************
|
|
Packit Service |
54dbc3 |
* print node data to fp
|
|
Packit Service |
54dbc3 |
**********************************************************************/
|
|
Packit Service |
54dbc3 |
void
|
|
Packit Service |
54dbc3 |
perfmgr_db_print_by_name(perfmgr_db_t * db, char *nodename, FILE *fp,
|
|
Packit Service |
54dbc3 |
char *port, int err_only)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cl_map_item_t *item;
|
|
Packit Service |
54dbc3 |
db_node_t *node;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_acquire(&db->lock);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* find the node */
|
|
Packit Service |
54dbc3 |
item = cl_qmap_head(&db->pc_data);
|
|
Packit Service |
54dbc3 |
while (item != cl_qmap_end(&db->pc_data)) {
|
|
Packit Service |
54dbc3 |
node = (db_node_t *)item;
|
|
Packit Service |
54dbc3 |
if (strcmp(node->node_name, nodename) == 0) {
|
|
Packit Service |
54dbc3 |
dump_node_hr(node, fp, port, err_only);
|
|
Packit Service |
54dbc3 |
goto done;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
item = cl_qmap_next(item);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
fprintf(fp, "Node %s not found...\n", nodename);
|
|
Packit Service |
54dbc3 |
done:
|
|
Packit Service |
54dbc3 |
cl_plock_release(&db->lock);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**********************************************************************
|
|
Packit Service |
54dbc3 |
* print node data to fp
|
|
Packit Service |
54dbc3 |
**********************************************************************/
|
|
Packit Service |
54dbc3 |
void
|
|
Packit Service |
54dbc3 |
perfmgr_db_print_by_guid(perfmgr_db_t * db, uint64_t nodeguid, FILE *fp,
|
|
Packit Service |
54dbc3 |
char *port, int err_only)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cl_map_item_t *node;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_acquire(&db->lock);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
node = cl_qmap_get(&db->pc_data, nodeguid);
|
|
Packit Service |
54dbc3 |
if (node != cl_qmap_end(&db->pc_data))
|
|
Packit Service |
54dbc3 |
dump_node_hr((db_node_t *)node, fp, port, err_only);
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
fprintf(fp, "Node 0x%" PRIx64 " not found...\n", nodeguid);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_release(&db->lock);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**********************************************************************
|
|
Packit Service |
54dbc3 |
* dump the data to the file "file"
|
|
Packit Service |
54dbc3 |
**********************************************************************/
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_t
|
|
Packit Service |
54dbc3 |
perfmgr_db_dump(perfmgr_db_t * db, char *file, perfmgr_db_dump_t dump_type)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
dump_context_t context;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
context.fp = fopen(file, "w+");
|
|
Packit Service |
54dbc3 |
if (!context.fp)
|
|
Packit Service |
54dbc3 |
return PERFMGR_EVENT_DB_FAIL;
|
|
Packit Service |
54dbc3 |
context.dump_type = dump_type;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_acquire(&db->lock);
|
|
Packit Service |
54dbc3 |
cl_qmap_apply_func(&db->pc_data, db_dump, (void *)&context);
|
|
Packit Service |
54dbc3 |
cl_plock_release(&db->lock);
|
|
Packit Service |
54dbc3 |
fclose(context.fp);
|
|
Packit Service |
54dbc3 |
return PERFMGR_EVENT_DB_SUCCESS;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**********************************************************************
|
|
Packit Service |
54dbc3 |
* Fill in the various DB objects from their wire counter parts
|
|
Packit Service |
54dbc3 |
**********************************************************************/
|
|
Packit Service |
54dbc3 |
void
|
|
Packit Service |
54dbc3 |
perfmgr_db_fill_err_read(ib_port_counters_t * wire_read,
|
|
Packit Service |
54dbc3 |
perfmgr_db_err_reading_t * reading,
|
|
Packit Service |
54dbc3 |
boolean_t xmit_wait_sup)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
reading->symbol_err_cnt = cl_ntoh16(wire_read->symbol_err_cnt);
|
|
Packit Service |
54dbc3 |
reading->link_err_recover = wire_read->link_err_recover;
|
|
Packit Service |
54dbc3 |
reading->link_downed = wire_read->link_downed;
|
|
Packit Service |
54dbc3 |
reading->rcv_err = cl_ntoh16(wire_read->rcv_err);
|
|
Packit Service |
54dbc3 |
reading->rcv_rem_phys_err = cl_ntoh16(wire_read->rcv_rem_phys_err);
|
|
Packit Service |
54dbc3 |
reading->rcv_switch_relay_err =
|
|
Packit Service |
54dbc3 |
cl_ntoh16(wire_read->rcv_switch_relay_err);
|
|
Packit Service |
54dbc3 |
reading->xmit_discards = cl_ntoh16(wire_read->xmit_discards);
|
|
Packit Service |
54dbc3 |
reading->xmit_constraint_err = wire_read->xmit_constraint_err;
|
|
Packit Service |
54dbc3 |
reading->rcv_constraint_err = wire_read->rcv_constraint_err;
|
|
Packit Service |
54dbc3 |
reading->link_integrity =
|
|
Packit Service |
54dbc3 |
PC_LINK_INT(wire_read->link_int_buffer_overrun);
|
|
Packit Service |
54dbc3 |
reading->buffer_overrun =
|
|
Packit Service |
54dbc3 |
PC_BUF_OVERRUN(wire_read->link_int_buffer_overrun);
|
|
Packit Service |
54dbc3 |
reading->vl15_dropped = cl_ntoh16(wire_read->vl15_dropped);
|
|
Packit Service |
54dbc3 |
if (xmit_wait_sup)
|
|
Packit Service |
54dbc3 |
reading->xmit_wait = cl_ntoh32(wire_read->xmit_wait);
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
reading->xmit_wait = 0;
|
|
Packit Service |
54dbc3 |
reading->time = time(NULL);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
void
|
|
Packit Service |
54dbc3 |
perfmgr_db_fill_data_cnt_read_pc(ib_port_counters_t * wire_read,
|
|
Packit Service |
54dbc3 |
perfmgr_db_data_cnt_reading_t * reading)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
reading->xmit_data = cl_ntoh32(wire_read->xmit_data);
|
|
Packit Service |
54dbc3 |
reading->rcv_data = cl_ntoh32(wire_read->rcv_data);
|
|
Packit Service |
54dbc3 |
reading->xmit_pkts = cl_ntoh32(wire_read->xmit_pkts);
|
|
Packit Service |
54dbc3 |
reading->rcv_pkts = cl_ntoh32(wire_read->rcv_pkts);
|
|
Packit Service |
54dbc3 |
reading->unicast_xmit_pkts = 0;
|
|
Packit Service |
54dbc3 |
reading->unicast_rcv_pkts = 0;
|
|
Packit Service |
54dbc3 |
reading->multicast_xmit_pkts = 0;
|
|
Packit Service |
54dbc3 |
reading->multicast_rcv_pkts = 0;
|
|
Packit Service |
54dbc3 |
reading->time = time(NULL);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
void
|
|
Packit Service |
54dbc3 |
perfmgr_db_fill_data_cnt_read_pce(ib_port_counters_ext_t * wire_read,
|
|
Packit Service |
54dbc3 |
perfmgr_db_data_cnt_reading_t * reading,
|
|
Packit Service |
54dbc3 |
int ietf_sup)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
reading->xmit_data = cl_ntoh64(wire_read->xmit_data);
|
|
Packit Service |
54dbc3 |
reading->rcv_data = cl_ntoh64(wire_read->rcv_data);
|
|
Packit Service |
54dbc3 |
reading->xmit_pkts = cl_ntoh64(wire_read->xmit_pkts);
|
|
Packit Service |
54dbc3 |
reading->rcv_pkts = cl_ntoh64(wire_read->rcv_pkts);
|
|
Packit Service |
54dbc3 |
if (ietf_sup)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
reading->unicast_xmit_pkts = cl_ntoh64(wire_read->unicast_xmit_pkts);
|
|
Packit Service |
54dbc3 |
reading->unicast_rcv_pkts = cl_ntoh64(wire_read->unicast_rcv_pkts);
|
|
Packit Service |
54dbc3 |
reading->multicast_xmit_pkts =
|
|
Packit Service |
54dbc3 |
cl_ntoh64(wire_read->multicast_xmit_pkts);
|
|
Packit Service |
54dbc3 |
reading->multicast_rcv_pkts = cl_ntoh64(wire_read->multicast_rcv_pkts);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
reading->time = time(NULL);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
#endif /* ENABLE_OSM_PERF_MGR */
|