1219820Sjeff/* 2219820Sjeff * Copyright (c) 2008 Voltaire, Inc. All rights reserved. 3219820Sjeff * Copyright (c) 2007 The Regents of the University of California. 4219820Sjeff * 5219820Sjeff * This software is available to you under a choice of one of two 6219820Sjeff * licenses. You may choose to be licensed under the terms of the GNU 7219820Sjeff * General Public License (GPL) Version 2, available from the file 8219820Sjeff * COPYING in the main directory of this source tree, or the 9219820Sjeff * OpenIB.org BSD license below: 10219820Sjeff * 11219820Sjeff * Redistribution and use in source and binary forms, with or 12219820Sjeff * without modification, are permitted provided that the following 13219820Sjeff * conditions are met: 14219820Sjeff * 15219820Sjeff * - Redistributions of source code must retain the above 16219820Sjeff * copyright notice, this list of conditions and the following 17219820Sjeff * disclaimer. 18219820Sjeff * 19219820Sjeff * - Redistributions in binary form must reproduce the above 20219820Sjeff * copyright notice, this list of conditions and the following 21219820Sjeff * disclaimer in the documentation and/or other materials 22219820Sjeff * provided with the distribution. 23219820Sjeff * 24219820Sjeff * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25219820Sjeff * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26219820Sjeff * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27219820Sjeff * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28219820Sjeff * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29219820Sjeff * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30219820Sjeff * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31219820Sjeff * SOFTWARE. 32219820Sjeff * 33219820Sjeff */ 34219820Sjeff 35219820Sjeff#ifndef _PERFMGR_EVENT_DB_H_ 36219820Sjeff#define _PERFMGR_EVENT_DB_H_ 37219820Sjeff 38219820Sjeff#ifdef ENABLE_OSM_PERF_MGR 39219820Sjeff 40219820Sjeff#include <stdio.h> 41219820Sjeff#include <time.h> 42219820Sjeff#include <iba/ib_types.h> 43219820Sjeff#include <complib/cl_qmap.h> 44219820Sjeff#include <complib/cl_passivelock.h> 45219820Sjeff 46219820Sjeff#ifdef __cplusplus 47219820Sjeff# define BEGIN_C_DECLS extern "C" { 48219820Sjeff# define END_C_DECLS } 49219820Sjeff#else /* !__cplusplus */ 50219820Sjeff# define BEGIN_C_DECLS 51219820Sjeff# define END_C_DECLS 52219820Sjeff#endif /* __cplusplus */ 53219820Sjeff 54219820SjeffBEGIN_C_DECLS 55219820Sjeff 56219820Sjeffstruct osm_perfmgr; 57219820Sjeff/****h* OpenSM/PerfMgr Event Database 58219820Sjeff* DESCRIPTION 59219820Sjeff* Database interface to record subnet events 60219820Sjeff* 61219820Sjeff* Implementations of this object _MUST_ be thread safe. 62219820Sjeff* 63219820Sjeff* AUTHOR 64219820Sjeff* Ira Weiny, LLNL 65219820Sjeff* 66219820Sjeff*********/ 67219820Sjefftypedef enum { 68219820Sjeff PERFMGR_EVENT_DB_SUCCESS = 0, 69219820Sjeff PERFMGR_EVENT_DB_FAIL, 70219820Sjeff PERFMGR_EVENT_DB_NOMEM, 71219820Sjeff PERFMGR_EVENT_DB_GUIDNOTFOUND, 72219820Sjeff PERFMGR_EVENT_DB_PORTNOTFOUND, 73219820Sjeff PERFMGR_EVENT_DB_NOT_IMPL 74219820Sjeff} perfmgr_db_err_t; 75219820Sjeff 76219820Sjeff/** ========================================================================= 77219820Sjeff * Port error reading 78219820Sjeff */ 79219820Sjefftypedef struct { 80219820Sjeff uint64_t symbol_err_cnt; 81219820Sjeff uint64_t link_err_recover; 82219820Sjeff uint64_t link_downed; 83219820Sjeff uint64_t rcv_err; 84219820Sjeff uint64_t rcv_rem_phys_err; 85219820Sjeff uint64_t rcv_switch_relay_err; 86219820Sjeff uint64_t xmit_discards; 87219820Sjeff uint64_t xmit_constraint_err; 88219820Sjeff uint64_t rcv_constraint_err; 89219820Sjeff uint64_t link_integrity; 90219820Sjeff uint64_t buffer_overrun; 91219820Sjeff uint64_t vl15_dropped; 92219820Sjeff time_t time; 93219820Sjeff} perfmgr_db_err_reading_t; 94219820Sjeff 95219820Sjeff/** ========================================================================= 96219820Sjeff * Port data count reading 97219820Sjeff */ 98219820Sjefftypedef struct { 99219820Sjeff uint64_t xmit_data; /* can be used for std or extended */ 100219820Sjeff uint64_t rcv_data; /* can be used for std or extended */ 101219820Sjeff uint64_t xmit_pkts; /* can be used for std or extended */ 102219820Sjeff uint64_t rcv_pkts; /* can be used for std or extended */ 103219820Sjeff uint64_t unicast_xmit_pkts; 104219820Sjeff uint64_t unicast_rcv_pkts; 105219820Sjeff uint64_t multicast_xmit_pkts; 106219820Sjeff uint64_t multicast_rcv_pkts; 107219820Sjeff time_t time; 108219820Sjeff} perfmgr_db_data_cnt_reading_t; 109219820Sjeff 110219820Sjeff/** ========================================================================= 111219820Sjeff * Port select errors 112219820Sjeff */ 113219820Sjefftypedef struct { 114219820Sjeff uint64_t xmit_wait; 115219820Sjeff time_t time; 116219820Sjeff} perfmgr_db_ps_reading_t; 117219820Sjeff 118219820Sjeff/** ========================================================================= 119219820Sjeff * Dump output options 120219820Sjeff */ 121219820Sjefftypedef enum { 122219820Sjeff PERFMGR_EVENT_DB_DUMP_HR = 0, /* Human readable */ 123219820Sjeff PERFMGR_EVENT_DB_DUMP_MR /* Machine readable */ 124219820Sjeff} perfmgr_db_dump_t; 125219820Sjeff 126219820Sjeff/** ========================================================================= 127219820Sjeff * Port counter object. 128219820Sjeff * Store all the port counters for a single port. 129219820Sjeff */ 130219820Sjefftypedef struct _db_port { 131219820Sjeff perfmgr_db_err_reading_t err_total; 132219820Sjeff perfmgr_db_err_reading_t err_previous; 133219820Sjeff perfmgr_db_data_cnt_reading_t dc_total; 134219820Sjeff perfmgr_db_data_cnt_reading_t dc_previous; 135219820Sjeff time_t last_reset; 136219820Sjeff} _db_port_t; 137219820Sjeff 138219820Sjeff/** ========================================================================= 139219820Sjeff * group port counters for ports into the nodes 140219820Sjeff */ 141219820Sjeff#define NODE_NAME_SIZE (IB_NODE_DESCRIPTION_SIZE << 1) 142219820Sjefftypedef struct _db_node { 143219820Sjeff cl_map_item_t map_item; /* must be first */ 144219820Sjeff uint64_t node_guid; 145219820Sjeff _db_port_t *ports; 146219820Sjeff uint8_t num_ports; 147219820Sjeff char node_name[NODE_NAME_SIZE]; 148219820Sjeff} _db_node_t; 149219820Sjeff 150219820Sjeff/** ========================================================================= 151219820Sjeff * all nodes in the system. 152219820Sjeff */ 153219820Sjefftypedef struct _db { 154219820Sjeff cl_qmap_t pc_data; /* stores type (_db_node_t *) */ 155219820Sjeff cl_plock_t lock; 156219820Sjeff struct osm_perfmgr *perfmgr; 157219820Sjeff} perfmgr_db_t; 158219820Sjeff 159219820Sjeff/** 160219820Sjeff * functions 161219820Sjeff */ 162219820Sjeffperfmgr_db_t *perfmgr_db_construct(struct osm_perfmgr *perfmgr); 163219820Sjeffvoid perfmgr_db_destroy(perfmgr_db_t * db); 164219820Sjeff 165219820Sjeffperfmgr_db_err_t perfmgr_db_create_entry(perfmgr_db_t * db, uint64_t guid, 166219820Sjeff uint8_t num_ports, char *node_name); 167219820Sjeff 168219820Sjeffperfmgr_db_err_t perfmgr_db_add_err_reading(perfmgr_db_t * db, uint64_t guid, 169219820Sjeff uint8_t port, 170219820Sjeff perfmgr_db_err_reading_t * reading); 171219820Sjeffperfmgr_db_err_t perfmgr_db_get_prev_err(perfmgr_db_t * db, uint64_t guid, 172219820Sjeff uint8_t port, 173219820Sjeff perfmgr_db_err_reading_t * reading); 174219820Sjeffperfmgr_db_err_t perfmgr_db_clear_prev_err(perfmgr_db_t * db, uint64_t guid, 175219820Sjeff uint8_t port); 176219820Sjeff 177219820Sjeffperfmgr_db_err_t perfmgr_db_add_dc_reading(perfmgr_db_t * db, uint64_t guid, 178219820Sjeff uint8_t port, 179219820Sjeff perfmgr_db_data_cnt_reading_t * 180219820Sjeff reading); 181219820Sjeffperfmgr_db_err_t perfmgr_db_get_prev_dc(perfmgr_db_t * db, uint64_t guid, 182219820Sjeff uint8_t port, 183219820Sjeff perfmgr_db_data_cnt_reading_t * 184219820Sjeff reading); 185219820Sjeffperfmgr_db_err_t perfmgr_db_clear_prev_dc(perfmgr_db_t * db, uint64_t guid, 186219820Sjeff uint8_t port); 187219820Sjeff 188219820Sjeffvoid perfmgr_db_clear_counters(perfmgr_db_t * db); 189219820Sjeffperfmgr_db_err_t perfmgr_db_dump(perfmgr_db_t * db, char *file, 190219820Sjeff perfmgr_db_dump_t dump_type); 191219820Sjeffvoid perfmgr_db_print_by_name(perfmgr_db_t * db, char *nodename, FILE *fp); 192219820Sjeffvoid perfmgr_db_print_by_guid(perfmgr_db_t * db, uint64_t guid, FILE *fp); 193219820Sjeff 194219820Sjeff/** ========================================================================= 195219820Sjeff * helper functions to fill in the various db objects from wire objects 196219820Sjeff */ 197219820Sjeff 198219820Sjeffvoid perfmgr_db_fill_err_read(ib_port_counters_t * wire_read, 199219820Sjeff perfmgr_db_err_reading_t * reading); 200219820Sjeffvoid perfmgr_db_fill_data_cnt_read_pc(ib_port_counters_t * wire_read, 201219820Sjeff perfmgr_db_data_cnt_reading_t * reading); 202219820Sjeffvoid perfmgr_db_fill_data_cnt_read_epc(ib_port_counters_ext_t * wire_read, 203219820Sjeff perfmgr_db_data_cnt_reading_t * reading); 204219820Sjeff 205219820SjeffEND_C_DECLS 206219820Sjeff 207219820Sjeff#endif /* ENABLE_OSM_PERF_MGR */ 208219820Sjeff 209219820Sjeff#endif /* _PERFMGR_PM_DB_H_ */ 210