summaryrefslogtreecommitdiff
path: root/src/pmdas/infiniband/pmda.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pmdas/infiniband/pmda.c')
-rw-r--r--src/pmdas/infiniband/pmda.c418
1 files changed, 418 insertions, 0 deletions
diff --git a/src/pmdas/infiniband/pmda.c b/src/pmdas/infiniband/pmda.c
new file mode 100644
index 0000000..20c5ba1
--- /dev/null
+++ b/src/pmdas/infiniband/pmda.c
@@ -0,0 +1,418 @@
+/*
+ * Copyright (C) 2013 Red Hat.
+ * Copyright (C) 2007,2008 Silicon Graphics, Inc. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+#include "ibpmda.h"
+
+/*
+ * Metric Table
+ */
+pmdaMetric metrictab[] = {
+ /* infiniband.hca.type */
+ { NULL,
+ {PMDA_PMID(0,METRIC_ib_hca_type),
+ PM_TYPE_STRING, IB_HCA_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
+
+ /* infiniband.hca.ca_type */
+ { NULL,
+ {PMDA_PMID(0,METRIC_ib_hca_ca_type),
+ PM_TYPE_STRING, IB_HCA_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
+
+ /* infiniband.hca.numports */
+ { NULL,
+ {PMDA_PMID(0,METRIC_ib_hca_numports),
+ PM_TYPE_32, IB_HCA_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
+
+ /* infiniband.hca.fw_ver */
+ { NULL,
+ {PMDA_PMID(0,METRIC_ib_hca_fw_ver),
+ PM_TYPE_STRING, IB_HCA_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
+
+ /* infiniband.hca.hw_ver */
+ { NULL,
+ {PMDA_PMID(0,METRIC_ib_hca_hw_ver),
+ PM_TYPE_STRING, IB_HCA_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
+
+ /* infiniband.hca.node_guid */
+ { NULL,
+ {PMDA_PMID(0,METRIC_ib_hca_node_guid),
+ PM_TYPE_U64, IB_HCA_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
+
+ /* infiniband.hca.system_guid */
+ { NULL,
+ {PMDA_PMID(0,METRIC_ib_hca_system_guid),
+ PM_TYPE_U64, IB_HCA_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
+
+ /* infiniband.port.guid */
+ { NULL,
+ {PMDA_PMID(0,METRIC_ib_port_guid),
+ PM_TYPE_U64, IB_PORT_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
+
+ /* infiniband.port.gid_prefix */
+ { NULL,
+ {PMDA_PMID(0,METRIC_ib_port_gid_prefix),
+ PM_TYPE_U64, IB_PORT_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
+
+ /* infiniband.port.lid */
+ { NULL,
+ {PMDA_PMID(0,METRIC_ib_port_lid),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
+
+ /* infiniband.port.state */
+ { NULL,
+ {PMDA_PMID(0,METRIC_ib_port_state),
+ PM_TYPE_STRING, IB_PORT_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
+
+ /* infiniband.port.phystate */
+ { NULL,
+ {PMDA_PMID(0,METRIC_ib_port_phystate),
+ PM_TYPE_STRING, IB_PORT_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
+
+ /* infiniband.port.rate */
+ { NULL,
+ {PMDA_PMID(0,METRIC_ib_port_rate),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
+
+ /* infiniband.port.capabilities */
+ { NULL,
+ {PMDA_PMID(0,METRIC_ib_port_capabilities),
+ PM_TYPE_STRING, IB_PORT_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
+
+ /* infiniband.port.linkspeed */
+ { NULL,
+ {PMDA_PMID(0,METRIC_ib_port_linkspeed),
+ PM_TYPE_STRING, IB_PORT_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
+
+ /* infiniband.port.linkwidth */
+ { NULL,
+ {PMDA_PMID(0,METRIC_ib_port_linkwidth),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
+
+ /* infiniband.port.in.bytes */
+ { (void *)IBPMDA_RCV_BYTES,
+ {PMDA_PMID(1,METRIC_ib_port_in_bytes),
+ PM_TYPE_64, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(1,0,0,PM_SPACE_BYTE,0,0) }, },
+
+ /* infiniband.port.in.packets */
+ { (void *)IBPMDA_RCV_PKTS,
+ {PMDA_PMID(1,METRIC_ib_port_in_packets),
+ PM_TYPE_64, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) }, },
+
+ /* infiniband.port.in.errors.drop */
+ { (void *)IBPMDA_ERR_SWITCH_REL,
+ {PMDA_PMID(1,METRIC_ib_port_in_errors_drop),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+
+ /* infiniband.port.in.errors.filter */
+ { (void *)IBPMDA_ERR_RCVCONSTR,
+ {PMDA_PMID(1,METRIC_ib_port_in_errors_filter),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+
+ /* infiniband.port.in.errors.local */
+ { (void *)IBPMDA_ERR_RCV,
+ {PMDA_PMID(1,METRIC_ib_port_in_errors_local),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+
+ /* infiniband.port.in.errors.filter */
+ { (void *)IBPMDA_ERR_PHYSRCV,
+ {PMDA_PMID(1,METRIC_ib_port_in_errors_remote),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+
+ /* infiniband.port.out.bytes */
+ { (void *)IBPMDA_XMT_BYTES,
+ {PMDA_PMID(1,METRIC_ib_port_out_bytes),
+ PM_TYPE_64, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(1,0,0,PM_SPACE_BYTE,0,0) }, },
+
+ /* infiniband.port.out.packets */
+ {(void *)IBPMDA_XMT_PKTS,
+ {PMDA_PMID(1,METRIC_ib_port_out_packets),
+ PM_TYPE_64, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) }, },
+
+ /* infiniband.port.out.errors.drop */
+ { (void *)IBPMDA_XMT_DISCARDS,
+ {PMDA_PMID(1,METRIC_ib_port_out_errors_drop),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+
+ /* infiniband.port.out.errors.filter */
+ { (void *)IBPMDA_ERR_XMTCONSTR,
+ {PMDA_PMID(1,METRIC_ib_port_out_errors_filter),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+
+ /* infiniband.port.total.bytes */
+ { (void *)-1,
+ {PMDA_PMID(1,METRIC_ib_port_total_bytes),
+ PM_TYPE_64, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(1,0,0,PM_SPACE_BYTE,0,0) } },
+
+ /* infiniband.port.total.packets */
+ { (void *)-1,
+ {PMDA_PMID(1,METRIC_ib_port_total_packets),
+ PM_TYPE_64, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+
+ /* infiniband.port.total.errors.drop */
+ { (void *)-1,
+ {PMDA_PMID(1,METRIC_ib_port_total_errors_drop),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+
+ /* infiniband.port.total.errors.filter */
+ { (void *)-1,
+ {PMDA_PMID(1,METRIC_ib_port_total_errors_filter),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+
+ /* infiniband.port.total.errors.link */
+ { (void *)IBPMDA_LINK_DOWNED,
+ {PMDA_PMID(1,METRIC_ib_port_total_errors_link),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+
+ /* infiniband.port.total.errors.recover */
+ { (void *)IBPMDA_LINK_RECOVERS,
+ {PMDA_PMID(1,METRIC_ib_port_total_errors_recover),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+
+ /* infiniband.port.total.errors.integrity */
+ { (void *)IBPMDA_ERR_LOCALINTEG,
+ {PMDA_PMID(1,METRIC_ib_port_total_errors_integrity),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+
+ /* infiniband.port.total.errors.vl15 */
+ { (void *)IBPMDA_VL15_DROPPED,
+ {PMDA_PMID(1,METRIC_ib_port_total_errors_vl15),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+
+ /* infiniband.port.total.errors.overrun */
+ { (void *)IBPMDA_ERR_EXCESS_OVR,
+ {PMDA_PMID(1,METRIC_ib_port_total_errors_overrun),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+
+ /* infiniband.port.total.errors.symbol */
+ { (void *)IBPMDA_ERR_SYM,
+ {PMDA_PMID(1,METRIC_ib_port_total_errors_symbol),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+
+ /* infiniband.control.query_timeout */
+ { NULL,
+ {PMDA_PMID(2,METRIC_ib_control_query_timeout),
+ PM_TYPE_32, IB_PORT_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) } },
+
+ /* infiniband.control.hiwat */
+ { NULL,
+ {PMDA_PMID(2,METRIC_ib_control_hiwat),
+ PM_TYPE_U32, IB_CNT_INDOM, PM_SEM_DISCRETE,
+ PMDA_PMUNITS(0,0,0,0,0,0) } },
+
+ /* infiniband.port.switch.in.bytes */
+ { NULL,
+ {PMDA_PMID(3,METRIC_ib_port_switch_in_bytes),
+ PM_TYPE_U64, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(1,0,0,PM_SPACE_BYTE,0,0) } },
+
+ /* infiniband.port.switch.in.packets */
+ { NULL,
+ {PMDA_PMID(3,METRIC_ib_port_switch_in_packets),
+ PM_TYPE_U64, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+
+ /* infiniband.port.switch.out.bytes */
+ { NULL,
+ {PMDA_PMID(3,METRIC_ib_port_switch_out_bytes),
+ PM_TYPE_U64, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(1,0,0,PM_SPACE_BYTE,0,0) } },
+
+ /* infiniband.port.switch.out.packets */
+ { NULL,
+ {PMDA_PMID(3,METRIC_ib_port_switch_out_packets),
+ PM_TYPE_U64, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+
+ /* infiniband.port.switch.total.bytes */
+ { NULL,
+ {PMDA_PMID(3,METRIC_ib_port_switch_total_bytes),
+ PM_TYPE_U64, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(1,0,0,PM_SPACE_BYTE,0,0) } },
+
+ /* infiniband.port.switch.total.packets */
+ { NULL,
+ {PMDA_PMID(3,METRIC_ib_port_switch_total_packets),
+ PM_TYPE_U64, IB_PORT_INDOM, PM_SEM_COUNTER,
+ PMDA_PMUNITS(0,0,1,0,0,0) } },
+};
+
+pmdaIndom indomtab[] = {
+ { IB_HCA_INDOM, 0, NULL },
+ { IB_PORT_INDOM, 0, NULL },
+ { IB_CNT_INDOM, 0, NULL },
+};
+
+static void
+foreach_inst(pmInDom indom, void (*cb)(void *state))
+{
+ int i;
+ pmdaCacheOp (indom, PMDA_CACHE_WALK_REWIND);
+
+ while ((i = pmdaCacheOp (indom, PMDA_CACHE_WALK_NEXT)) >= 0) {
+ void *state = NULL;
+
+ if (pmdaCacheLookup (indom, i, NULL, &state) != PMDA_CACHE_ACTIVE) {
+ abort();
+ }
+ cb (state);
+ }
+}
+
+int
+ib_fetch(int numpmid, pmID pmidlist[], pmResult **resp, pmdaExt *pmda)
+{
+ int rv;
+
+ foreach_inst (indomtab[IB_PORT_INDOM].it_indom, ib_rearm_for_update);
+ rv = pmdaFetch (numpmid, pmidlist, resp, pmda);
+ foreach_inst (indomtab[IB_PORT_INDOM].it_indom, ib_reset_perfcounters);
+
+ return (rv);
+}
+
+void
+ibpmda_init(const char *confpath, int writeconf, pmdaInterface *dp)
+{
+ char defconf[MAXPATHLEN];
+ int sep = __pmPathSeparator();
+ int i;
+
+ if (dp->status != 0)
+ return;
+
+ if (confpath == NULL) {
+ snprintf(defconf, sizeof(defconf), "%s%c" "infiniband" "%c" "config",
+ pmGetConfig("PCP_PMDAS_DIR"), sep, sep);
+ confpath = defconf;
+ }
+
+ for (i=0; i < ARRAYSZ(indomtab); i++) {
+ __pmindom_int(&indomtab[i].it_indom)->domain = dp->domain;
+ if (IB_CNT_INDOM != __pmindom_int(&indomtab[i].it_indom)->serial) {
+ pmdaCacheOp (indomtab[i].it_indom, PMDA_CACHE_LOAD);
+ }
+ }
+
+
+ if ((dp->status = ib_load_config(confpath, writeconf, indomtab, ARRAYSZ(indomtab))))
+ return;
+
+ for (i=0; i < ARRAYSZ(indomtab); i++) {
+ if (IB_CNT_INDOM != __pmindom_int(&indomtab[i].it_indom)->serial) {
+ pmdaCacheOp (indomtab[i].it_indom, PMDA_CACHE_SAVE);
+ }
+ }
+
+ dp->version.two.fetch = ib_fetch;
+ dp->version.two.store = ib_store;
+ pmdaSetFetchCallBack(dp, ib_fetch_val);
+
+ pmdaInit(dp, indomtab, ARRAYSZ(indomtab), metrictab, ARRAYSZ(metrictab));
+}
+
+static void
+usage(void)
+{
+ fprintf(stderr, "Usage: %s [options]\n\n", pmProgname);
+ fputs("Options:\n"
+ " -d domain use domain (numeric) for metrics domain of PMDA\n"
+ " -l logfile write log into logfile rather than using default log name\n"
+ " -c path to configuration file\n"
+ " -w write the basic configuration file\n",
+ stderr);
+ exit(1);
+}
+
+int
+main(int argc, char **argv)
+{
+ int err = 0;
+ int sep = __pmPathSeparator();
+ pmdaInterface dispatch;
+ char helppath[MAXPATHLEN];
+ char *confpath = NULL;
+ int opt;
+ int writeconf = 0;
+
+ __pmSetProgname(argv[0]);
+ snprintf(helppath, sizeof(helppath), "%s%c" "infiniband" "%c" "help",
+ pmGetConfig("PCP_PMDAS_DIR"), sep, sep);
+ pmdaDaemon(&dispatch, PMDA_INTERFACE_3, pmProgname, IB, "infiniband.log", helppath);
+
+ while ((opt = pmdaGetOpt(argc, argv, "D:c:d:l:w?", &dispatch, &err)) != EOF) {
+ switch (opt) {
+ case 'c':
+ confpath = optarg;
+ break;
+ case 'w':
+ writeconf = 1;
+ break;
+ default:
+ err++;
+ }
+ }
+
+ if (err) {
+ usage();
+ }
+
+ if (!writeconf) {
+ /* If writeconf is specified, then errors should go to stdout
+ * since the PMDA daemon will exit immediately after writing
+ * out the default config file
+ */
+ pmdaOpenLog(&dispatch);
+ }
+ ibpmda_init(confpath, writeconf, &dispatch);
+ pmdaConnect(&dispatch);
+ pmdaMain(&dispatch);
+ exit(0);
+}