1/* 2 * Copyright (c) 2008 Voltaire, Inc. All rights reserved. 3 * Copyright (c) 2007 The Regents of the University of California. 4 * 5 * This software is available to you under a choice of one of two 6 * licenses. You may choose to be licensed under the terms of the GNU 7 * General Public License (GPL) Version 2, available from the file 8 * COPYING in the main directory of this source tree, or the 9 * OpenIB.org BSD license below: 10 * 11 * Redistribution and use in source and binary forms, with or 12 * without modification, are permitted provided that the following 13 * conditions are met: 14 * 15 * - Redistributions of source code must retain the above 16 * copyright notice, this list of conditions and the following 17 * disclaimer. 18 * 19 * - Redistributions in binary form must reproduce the above 20 * copyright notice, this list of conditions and the following 21 * disclaimer in the documentation and/or other materials 22 * provided with the distribution. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 * SOFTWARE. 32 * 33 */ 34 35#ifndef _PERFMGR_EVENT_DB_H_ 36#define _PERFMGR_EVENT_DB_H_ 37 38#ifdef ENABLE_OSM_PERF_MGR 39 40#include <stdio.h> 41#include <time.h> 42#include <iba/ib_types.h> 43#include <complib/cl_qmap.h> 44#include <complib/cl_passivelock.h> 45 46#ifdef __cplusplus 47# define BEGIN_C_DECLS extern "C" { 48# define END_C_DECLS } 49#else /* !__cplusplus */ 50# define BEGIN_C_DECLS 51# define END_C_DECLS 52#endif /* __cplusplus */ 53 54BEGIN_C_DECLS 55 56struct osm_perfmgr; 57/****h* OpenSM/PerfMgr Event Database 58* DESCRIPTION 59* Database interface to record subnet events 60* 61* Implementations of this object _MUST_ be thread safe. 62* 63* AUTHOR 64* Ira Weiny, LLNL 65* 66*********/ 67typedef enum { 68 PERFMGR_EVENT_DB_SUCCESS = 0, 69 PERFMGR_EVENT_DB_FAIL, 70 PERFMGR_EVENT_DB_NOMEM, 71 PERFMGR_EVENT_DB_GUIDNOTFOUND, 72 PERFMGR_EVENT_DB_PORTNOTFOUND, 73 PERFMGR_EVENT_DB_NOT_IMPL 74} perfmgr_db_err_t; 75 76/** ========================================================================= 77 * Port error reading 78 */ 79typedef struct { 80 uint64_t symbol_err_cnt; 81 uint64_t link_err_recover; 82 uint64_t link_downed; 83 uint64_t rcv_err; 84 uint64_t rcv_rem_phys_err; 85 uint64_t rcv_switch_relay_err; 86 uint64_t xmit_discards; 87 uint64_t xmit_constraint_err; 88 uint64_t rcv_constraint_err; 89 uint64_t link_integrity; 90 uint64_t buffer_overrun; 91 uint64_t vl15_dropped; 92 time_t time; 93} perfmgr_db_err_reading_t; 94 95/** ========================================================================= 96 * Port data count reading 97 */ 98typedef struct { 99 uint64_t xmit_data; /* can be used for std or extended */ 100 uint64_t rcv_data; /* can be used for std or extended */ 101 uint64_t xmit_pkts; /* can be used for std or extended */ 102 uint64_t rcv_pkts; /* can be used for std or extended */ 103 uint64_t unicast_xmit_pkts; 104 uint64_t unicast_rcv_pkts; 105 uint64_t multicast_xmit_pkts; 106 uint64_t multicast_rcv_pkts; 107 time_t time; 108} perfmgr_db_data_cnt_reading_t; 109 110/** ========================================================================= 111 * Port select errors 112 */ 113typedef struct { 114 uint64_t xmit_wait; 115 time_t time; 116} perfmgr_db_ps_reading_t; 117 118/** ========================================================================= 119 * Dump output options 120 */ 121typedef enum { 122 PERFMGR_EVENT_DB_DUMP_HR = 0, /* Human readable */ 123 PERFMGR_EVENT_DB_DUMP_MR /* Machine readable */ 124} perfmgr_db_dump_t; 125 126/** ========================================================================= 127 * Port counter object. 128 * Store all the port counters for a single port. 129 */ 130typedef struct _db_port { 131 perfmgr_db_err_reading_t err_total; 132 perfmgr_db_err_reading_t err_previous; 133 perfmgr_db_data_cnt_reading_t dc_total; 134 perfmgr_db_data_cnt_reading_t dc_previous; 135 time_t last_reset; 136} _db_port_t; 137 138/** ========================================================================= 139 * group port counters for ports into the nodes 140 */ 141#define NODE_NAME_SIZE (IB_NODE_DESCRIPTION_SIZE << 1) 142typedef struct _db_node { 143 cl_map_item_t map_item; /* must be first */ 144 uint64_t node_guid; 145 _db_port_t *ports; 146 uint8_t num_ports; 147 char node_name[NODE_NAME_SIZE]; 148} _db_node_t; 149 150/** ========================================================================= 151 * all nodes in the system. 152 */ 153typedef struct _db { 154 cl_qmap_t pc_data; /* stores type (_db_node_t *) */ 155 cl_plock_t lock; 156 struct osm_perfmgr *perfmgr; 157} perfmgr_db_t; 158 159/** 160 * functions 161 */ 162perfmgr_db_t *perfmgr_db_construct(struct osm_perfmgr *perfmgr); 163void perfmgr_db_destroy(perfmgr_db_t * db); 164 165perfmgr_db_err_t perfmgr_db_create_entry(perfmgr_db_t * db, uint64_t guid, 166 uint8_t num_ports, char *node_name); 167 168perfmgr_db_err_t perfmgr_db_add_err_reading(perfmgr_db_t * db, uint64_t guid, 169 uint8_t port, 170 perfmgr_db_err_reading_t * reading); 171perfmgr_db_err_t perfmgr_db_get_prev_err(perfmgr_db_t * db, uint64_t guid, 172 uint8_t port, 173 perfmgr_db_err_reading_t * reading); 174perfmgr_db_err_t perfmgr_db_clear_prev_err(perfmgr_db_t * db, uint64_t guid, 175 uint8_t port); 176 177perfmgr_db_err_t perfmgr_db_add_dc_reading(perfmgr_db_t * db, uint64_t guid, 178 uint8_t port, 179 perfmgr_db_data_cnt_reading_t * 180 reading); 181perfmgr_db_err_t perfmgr_db_get_prev_dc(perfmgr_db_t * db, uint64_t guid, 182 uint8_t port, 183 perfmgr_db_data_cnt_reading_t * 184 reading); 185perfmgr_db_err_t perfmgr_db_clear_prev_dc(perfmgr_db_t * db, uint64_t guid, 186 uint8_t port); 187 188void perfmgr_db_clear_counters(perfmgr_db_t * db); 189perfmgr_db_err_t perfmgr_db_dump(perfmgr_db_t * db, char *file, 190 perfmgr_db_dump_t dump_type); 191void perfmgr_db_print_by_name(perfmgr_db_t * db, char *nodename, FILE *fp); 192void perfmgr_db_print_by_guid(perfmgr_db_t * db, uint64_t guid, FILE *fp); 193 194/** ========================================================================= 195 * helper functions to fill in the various db objects from wire objects 196 */ 197 198void perfmgr_db_fill_err_read(ib_port_counters_t * wire_read, 199 perfmgr_db_err_reading_t * reading); 200void perfmgr_db_fill_data_cnt_read_pc(ib_port_counters_t * wire_read, 201 perfmgr_db_data_cnt_reading_t * reading); 202void perfmgr_db_fill_data_cnt_read_epc(ib_port_counters_ext_t * wire_read, 203 perfmgr_db_data_cnt_reading_t * reading); 204 205END_C_DECLS 206 207#endif /* ENABLE_OSM_PERF_MGR */ 208 209#endif /* _PERFMGR_PM_DB_H_ */ 210