diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
commit | 47e6e7c84f008a53061e661f31ae96629bc694ef (patch) | |
tree | 648a07f3b5b9d67ce19b0fd72e8caa1175c98f1a /src/pmdas/gfs2/pmda.c | |
download | pcp-debian/3.9.10.tar.gz |
Debian 3.9.10debian/3.9.10debian
Diffstat (limited to 'src/pmdas/gfs2/pmda.c')
-rw-r--r-- | src/pmdas/gfs2/pmda.c | 1063 |
1 files changed, 1063 insertions, 0 deletions
diff --git a/src/pmdas/gfs2/pmda.c b/src/pmdas/gfs2/pmda.c new file mode 100644 index 0000000..2090296 --- /dev/null +++ b/src/pmdas/gfs2/pmda.c @@ -0,0 +1,1063 @@ +/* + * Global Filesystem v2 (GFS2) PMDA + * + * Copyright (c) 2013 - 2014 Red Hat. + * + * 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 "pmapi.h" +#include "impl.h" +#include "pmda.h" +#include "domain.h" + +#include "pmdagfs2.h" + +#include <sys/types.h> +#include <ctype.h> + +static char *gfs2_sysfsdir = "/sys/kernel/debug/gfs2"; +static char *gfs2_sysdir = "/sys/fs/gfs2"; + +pmdaIndom indomtable[] = { + { .it_indom = GFS_FS_INDOM }, +}; + +#define INDOM(x) (indomtable[x].it_indom) + +/* + * all metrics supported in this PMDA - one table entry for each + * + */ +pmdaMetric metrictable[] = { + /* GLOCK */ + { .m_desc = { + PMDA_PMID(CLUSTER_GLOCKS, GLOCKS_TOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } }, + { .m_desc = { + PMDA_PMID(CLUSTER_GLOCKS, GLOCKS_SHARED), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } }, + { .m_desc = { + PMDA_PMID(CLUSTER_GLOCKS, GLOCKS_UNLOCKED), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } }, + { .m_desc = { + PMDA_PMID(CLUSTER_GLOCKS, GLOCKS_DEFERRED), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } }, + { .m_desc = { + PMDA_PMID(CLUSTER_GLOCKS, GLOCKS_EXCLUSIVE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } }, + /* SBSTATS */ + { .m_desc = { + PMDA_PMID(CLUSTER_SBSTATS, LOCKSTAT_SRTT), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,PM_TIME_NSEC,0,0,1,0) } }, + { .m_desc = { + PMDA_PMID(CLUSTER_SBSTATS, LOCKSTAT_SRTTVAR), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,PM_TIME_NSEC,0,0,1,0) } }, + { .m_desc = { + PMDA_PMID(CLUSTER_SBSTATS, LOCKSTAT_SRTTB), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,PM_TIME_NSEC,0,0,1,0) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_SBSTATS, LOCKSTAT_SRTTVARB), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,PM_TIME_NSEC,0,0,1,0) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_SBSTATS, LOCKSTAT_SIRT), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,PM_TIME_NSEC,0,0,1,0) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_SBSTATS, LOCKSTAT_SIRTVAR), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,PM_TIME_NSEC,0,0,1,0) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_SBSTATS, LOCKSTAT_DCOUNT), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_COUNTER, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_SBSTATS, LOCKSTAT_QCOUNT), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_COUNTER, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + /* GLSTATS */ + { .m_desc = { + PMDA_PMID(CLUSTER_GLSTATS, GLSTATS_TOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_GLSTATS, GLSTATS_TRANS), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_GLSTATS, GLSTATS_INODE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_GLSTATS, GLSTATS_RGRP), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_GLSTATS, GLSTATS_META), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_GLSTATS, GLSTATS_IOPEN), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_GLSTATS, GLSTATS_FLOCK), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_GLSTATS, GLSTATS_QUOTA), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_GLSTATS, GLSTATS_JOURNAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + /* TRACEPOINTS */ + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKSTATE_TOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKSTATE_NULLLOCK), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKSTATE_CONCURRENTREAD), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKSTATE_CONCURRENTWRITE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKSTATE_PROTECTEDREAD), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKSTATE_PROTECTEDWRITE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKSTATE_EXCLUSIVE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKSTATE_GLOCK_CHANGEDTARGET), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKSTATE_GLOCK_MISSEDTARGET), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKPUT_TOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKPUT_NULLLOCK), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKPUT_CONCURRENTREAD), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKPUT_CONCURRENTWRITE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKPUT_PROTECTEDREAD), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKPUT_PROTECTEDWRITE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKPUT_EXCLUSIVE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_DEMOTERQ_TOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_DEMOTERQ_NULLLOCK), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_DEMOTERQ_CONCURRENTREAD), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_DEMOTERQ_CONCURRENTWRITE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_DEMOTERQ_PROTECTEDREAD), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_DEMOTERQ_PROTECTEDWRITE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_DEMOTERQ_EXCLUSIVE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_DEMOTERQ_REQUESTED_REMOTE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_DEMOTERQ_REQUESTED_LOCAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_PROMOTE_TOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_PROMOTE_FIRST_NULLLOCK), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_PROMOTE_FIRST_CONCURRENTREAD), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_PROMOTE_FIRST_CONCURRENTWRITE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_PROMOTE_FIRST_PROTECTEDREAD), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_PROMOTE_FIRST_PROTECTEDWRITE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_PROMOTE_FIRST_EXCLUSIVE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_PROMOTE_OTHER_NULLLOCK), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_PROMOTE_OTHER_CONCURRENTREAD), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_PROMOTE_OTHER_CONCURRENTWRITE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_PROMOTE_OTHER_PROTECTEDREAD), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_PROMOTE_OTHER_PROTECTEDWRITE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_PROMOTE_OTHER_EXCLUSIVE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKQUEUE_TOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKQUEUE_QUEUE_TOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKQUEUE_QUEUE_NULLLOCK), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKQUEUE_QUEUE_CONCURRENTREAD), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKQUEUE_QUEUE_CONCURRENTWRITE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKQUEUE_QUEUE_PROTECTEDREAD), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKQUEUE_QUEUE_PROTECTEDWRITE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKQUEUE_QUEUE_EXCLUSIVE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKQUEUE_DEQUEUE_TOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKQUEUE_DEQUEUE_NULLLOCK), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKQUEUE_DEQUEUE_CONCURRENTREAD), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKQUEUE_DEQUEUE_CONCURRENTWRITE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKQUEUE_DEQUEUE_PROTECTEDREAD), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKQUEUE_DEQUEUE_PROTECTEDWRITE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKQUEUE_DEQUEUE_EXCLUSIVE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKLOCKTIME_TOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKLOCKTIME_TRANS), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKLOCKTIME_INDOE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKLOCKTIME_RGRP), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKLOCKTIME_META), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKLOCKTIME_IOPEN), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKLOCKTIME_FLOCK), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKLOCKTIME_QUOTA), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_GLOCKLOCKTIME_JOURNAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_PIN_TOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_PIN_PINTOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_PIN_UNPINTOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_PIN_LONGESTPINNED), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_LOGFLUSH_TOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_LOGBLOCKS_TOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_AILFLUSH_TOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_BLOCKALLOC_TOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_BLOCKALLOC_FREE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_BLOCKALLOC_USED), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_BLOCKALLOC_DINODE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_BLOCKALLOC_UNLINKED), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_BMAP_TOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_BMAP_CREATE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_BMAP_NOCREATE), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_RS_TOTAL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_RS_DEL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_RS_TDEL), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_RS_INS), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_TRACEPOINTS, FTRACE_RS_CLM), + PM_TYPE_U64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + /* WORST_GLOCKS */ + { .m_desc = { + PMDA_PMID(CLUSTER_WORSTGLOCK, WORSTGLOCK_LOCK_TYPE), + PM_TYPE_U32, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_WORSTGLOCK, WORSTGLOCK_NUMBER), + PM_TYPE_U32, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_WORSTGLOCK, WORSTGLOCK_SRTT), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_WORSTGLOCK, WORSTGLOCK_SRTTVAR), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_WORSTGLOCK, WORSTGLOCK_SRTTB), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_WORSTGLOCK, WORSTGLOCK_SRTTVARB), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_WORSTGLOCK, WORSTGLOCK_SIRT), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_WORSTGLOCK, WORSTGLOCK_SIRTVAR), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_WORSTGLOCK, WORSTGLOCK_DLM), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_WORSTGLOCK, WORSTGLOCK_QUEUE), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + /* LATENCY */ + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_GRANT_ALL), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_GRANT_NL), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_GRANT_CR), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_GRANT_CW), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_GRANT_PR), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_GRANT_PW), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_GRANT_EX), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_DEMOTE_ALL), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_DEMOTE_NL), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_DEMOTE_CR), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_DEMOTE_CW), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_DEMOTE_PR), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_DEMOTE_PW), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_DEMOTE_EX), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_QUEUE_ALL), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_QUEUE_NL), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_QUEUE_CR), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_QUEUE_CW), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_QUEUE_PR), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_QUEUE_PW), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + { .m_desc = { + PMDA_PMID(CLUSTER_LATENCY, LATENCY_QUEUE_EX), + PM_TYPE_64, GFS_FS_INDOM, PM_SEM_INSTANT, + PMDA_PMUNITS(0,0,1,0,PM_TIME_MSEC,PM_COUNT_ONE) }, }, + /* CONTROL */ + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_ALL), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_GLOCK_STATE_CHANGE), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_GLOCK_PUT), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_DEMOTE_RQ), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_PROMOTE), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_GLOCK_QUEUE), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_GLOCK_LOCK_TIME), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_PIN), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_LOG_FLUSH), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_LOG_BLOCKS), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_AIL_FLUSH), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_BLOCK_ALLOC), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_BMAP), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_RS), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_BUFFER_SIZE_KB), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_GLOBAL_TRACING), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_WORSTGLOCK), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_LATENCY), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, + { NULL, { + PMDA_PMID(CLUSTER_CONTROL, CONTROL_FTRACE_GLOCK_THRESHOLD), + PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_DISCRETE, + PMDA_PMUNITS(0,0,0,0,0,0) }, }, +}; + +int +metrictable_size(void) +{ + return sizeof(metrictable)/sizeof(metrictable[0]); +} + +static dev_t +gfs2_device_identifier(const char *name) +{ + char buffer[4096]; + int major, minor; + dev_t dev_id; + FILE *fp; + + dev_id = makedev(0, 0); /* Error case */ + + /* gfs2_glock_lock_time requires block device id for each filesystem + * in order to match to the lock data, this info can be found in + * /sys/fs/gfs2/NAME/id, we extract the data and store it in gfs2_fs->dev + * + */ + snprintf(buffer, sizeof(buffer), "%s/%s/id", gfs2_sysdir, name); + buffer[sizeof(buffer)-1] = '\0'; + + if ((fp = fopen(buffer, "r")) == NULL) + return oserror(); + + while (fgets(buffer, sizeof(buffer), fp) != NULL) { + sscanf(buffer, "%d:%d", &major, &minor); + dev_id = makedev(major, minor); + } + fclose(fp); + + return dev_id; +} + +/* + * Update the GFS2 filesystems instance domain. This will change + * as filesystems are mounted and unmounted (and re-mounted, etc). + * Using the pmdaCache interfaces simplifies things and provides us + * with guarantees around consistent instance numbering in all of + * those interesting corner cases. + */ +static int +gfs2_instance_refresh(void) +{ + int i, sts, count, gfs2_status; + struct dirent **files; + pmInDom indom = INDOM(GFS_FS_INDOM); + + pmdaCacheOp(indom, PMDA_CACHE_INACTIVE); + + /* update indom cache based on scan of /sys/fs/gfs2 */ + count = scandir(gfs2_sysdir, &files, NULL, NULL); + if (count < 0) { /* give some feedback as to GFS2 kernel state */ + if (oserror() == EPERM) + gfs2_status = PM_ERR_PERMISSION; + else if (oserror() == ENOENT) + gfs2_status = PM_ERR_AGAIN; /* we might see a mount later */ + else + gfs2_status = PM_ERR_APPVERSION; + } else { + gfs2_status = 0; /* we possibly have stats available */ + } + + for (i = 0; i < count; i++) { + struct gfs2_fs *fs; + const char *name = files[i]->d_name; + + if (name[0] == '.') + continue; + + sts = pmdaCacheLookupName(indom, name, NULL, (void **)&fs); + if (sts == PM_ERR_INST || (sts >= 0 && fs == NULL)){ + fs = calloc(1, sizeof(struct gfs2_fs)); + if (fs == NULL) + return PM_ERR_AGAIN; + + fs->dev_id = gfs2_device_identifier(name); + + if ((major(fs->dev_id) == 0) && (minor(fs->dev_id) == 0)) { + free(fs); + return PM_ERR_AGAIN; + } + } + else if (sts < 0) + continue; + + /* (re)activate this entry for the current query */ + pmdaCacheStore(indom, PMDA_CACHE_ADD, name, (void *)fs); + } + + for (i = 0; i < count; i++) + free(files[i]); + if (count > 0) + free(files); + return gfs2_status; +} + +static int +gfs2_instance(pmInDom indom, int inst, char *name, __pmInResult **result, pmdaExt *pmda) +{ + gfs2_instance_refresh(); + return pmdaInstance(indom, inst, name, result, pmda); +} + +static int +gfs2_fetch_refresh(pmdaExt *pmda, int *need_refresh) +{ + pmInDom indom = INDOM(GFS_FS_INDOM); + struct gfs2_fs *fs; + char *name; + int i, sts; + + if ((sts = gfs2_instance_refresh()) < 0) + return sts; + + for (pmdaCacheOp(indom, PMDA_CACHE_WALK_REWIND);;) { + if ((i = pmdaCacheOp(indom, PMDA_CACHE_WALK_NEXT)) < 0) + break; + if (!pmdaCacheLookup(indom, i, &name, (void **)&fs) || !fs) + continue; + if (need_refresh[CLUSTER_GLOCKS]) + gfs2_refresh_glocks(gfs2_sysfsdir, name, &fs->glocks); + if (need_refresh[CLUSTER_SBSTATS]) + gfs2_refresh_sbstats(gfs2_sysfsdir, name, &fs->sbstats); + if (need_refresh[CLUSTER_GLSTATS]) + gfs2_refresh_glstats(gfs2_sysfsdir, name, &fs->glstats); + } + + if (need_refresh[CLUSTER_TRACEPOINTS] || need_refresh[CLUSTER_WORSTGLOCK] || need_refresh[CLUSTER_LATENCY]) + gfs2_refresh_ftrace_stats(indom); + + return sts; +} + +static int +gfs2_fetch(int numpmid, pmID pmidlist[], pmResult **resp, pmdaExt *pmda) +{ + int i, sts, need_refresh[NUM_CLUSTERS] = { 0 }; + + for (i = 0; i < numpmid; i++) { + __pmID_int *idp = (__pmID_int *)&(pmidlist[i]); + if (idp->cluster < NUM_CLUSTERS) + need_refresh[idp->cluster]++; + } + + if ((sts = gfs2_fetch_refresh(pmda, need_refresh)) < 0) + return sts; + return pmdaFetch(numpmid, pmidlist, resp, pmda); +} + +/* + * callback provided to pmdaFetch + */ +static int +gfs2_fetchCallBack(pmdaMetric *mdesc, unsigned int inst, pmAtomValue *atom) +{ + __pmID_int *idp = (__pmID_int *)&(mdesc->m_desc.pmid); + struct gfs2_fs *fs; + int sts; + + switch (idp->cluster) { + case CLUSTER_GLOCKS: + sts = pmdaCacheLookup(INDOM(GFS_FS_INDOM), inst, NULL, (void **)&fs); + if (sts < 0) + return sts; + return gfs2_glocks_fetch(idp->item, &fs->glocks, atom); + + case CLUSTER_SBSTATS: + sts = pmdaCacheLookup(INDOM(GFS_FS_INDOM), inst, NULL, (void **)&fs); + if (sts < 0) + return sts; + return gfs2_sbstats_fetch(idp->item, &fs->sbstats, atom); + + case CLUSTER_GLSTATS: + sts = pmdaCacheLookup(INDOM(GFS_FS_INDOM), inst, NULL, (void **)&fs); + if (sts < 0) + return sts; + return gfs2_glstats_fetch(idp->item, &fs->glstats, atom); + + case CLUSTER_TRACEPOINTS: + sts = pmdaCacheLookup(INDOM(GFS_FS_INDOM), inst, NULL, (void **)&fs); + if (sts < 0) + return sts; + return gfs2_ftrace_fetch(idp->item, &fs->ftrace, atom); + + case CLUSTER_WORSTGLOCK: + sts = pmdaCacheLookup(INDOM(GFS_FS_INDOM), inst, NULL, (void**)&fs); + if (sts < 0) + return sts; + return gfs2_worst_glock_fetch(idp->item, &fs->worst_glock, atom); + + case CLUSTER_LATENCY: + sts = pmdaCacheLookup(INDOM(GFS_FS_INDOM), inst, NULL, (void**)&fs); + if (sts < 0) + return sts; + return gfs2_latency_fetch(idp->item, &fs->latency, atom); + + case CLUSTER_CONTROL: + return gfs2_control_fetch(idp->item, atom); + + default: /* unknown cluster */ + return PM_ERR_PMID; + } + + return 1; +} + +/* + * Enable all tracepoints by default on init + */ +static void +gfs2_tracepoints_init() +{ + FILE *fp; + + fp = fopen("/sys/kernel/debug/tracing/events/gfs2/enable", "w"); + if (!fp) { + fprintf(stderr, "Unable to automatically enable GFS2 tracepoints"); + } else { + fprintf(fp, "%d\n", 1); + fclose(fp); + } +} + +/* + * Set default trace_pipe buffer size per cpu on init (32MB) + */ +static void +gfs2_buffer_default_size_set() +{ + FILE *fp; + + fp = fopen("/sys/kernel/debug/tracing/buffer_size_kb", "w"); + if (!fp) { + fprintf(stderr, "Unable to set default buffer size"); + } else { + fprintf(fp, "%d\n", 32768); /* Default 32MB per cpu */ + fclose(fp); + } +} + +/* + * Some version of ftrace are missing the irq-info option which alters the + * trace-pipe output, because of this we check for the option and if exists + * we switch off irq info output in trace_pipe + */ +static void +gfs2_ftrace_irq_info_set() +{ + FILE *fp; + + fp = fopen("/sys/kernel/debug/tracing/options/irq-info", "w"); + if (fp) { + /* We only need to set value if irq-info exists */ + fprintf(fp, "0"); /* Switch off irq-info in trace_pipe */ + fclose(fp); + } +} + +static int +gfs2_store(pmResult *result, pmdaExt *pmda) +{ + int i; + int sts = 0; + pmValueSet *vsp; + __pmID_int *pmidp; + + for (i = 0; i < result->numpmid && !sts; i++) { + vsp = result->vset[i]; + pmidp = (__pmID_int *)&vsp->pmid; + + if (pmidp->cluster == CLUSTER_CONTROL && pmidp->item <= CONTROL_BUFFER_SIZE_KB) { + sts = gfs2_control_set_value(control_locations[pmidp->item], vsp); + } + + if (pmidp->cluster == CLUSTER_CONTROL && pmidp->item == CONTROL_WORSTGLOCK) { + sts = worst_glock_set_state(vsp); + } + + if (pmidp->cluster == CLUSTER_CONTROL && pmidp->item == CONTROL_LATENCY) { + sts = latency_set_state(vsp); + } + + if (pmidp->cluster == CLUSTER_CONTROL && pmidp->item == CONTROL_FTRACE_GLOCK_THRESHOLD) { + sts = ftrace_set_threshold(vsp); + } + } + return sts; +} + +static int +gfs2_text(int ident, int type, char **buf, pmdaExt *pmda) +{ + if ((type & PM_TEXT_PMID) == PM_TEXT_PMID) { + int sts = pmdaDynamicLookupText(ident, type, buf, pmda); + if (sts != -ENOENT) + return sts; + } + return pmdaText(ident, type, buf, pmda); +} + +static int +gfs2_pmid(const char *name, pmID *pmid, pmdaExt *pmda) +{ + __pmnsTree *tree = pmdaDynamicLookupName(pmda, name); + return pmdaTreePMID(tree, name, pmid); +} + +static int +gfs2_name(pmID pmid, char ***nameset, pmdaExt *pmda) +{ + __pmnsTree *tree = pmdaDynamicLookupPMID(pmda, pmid); + return pmdaTreeName(tree, pmid, nameset); +} + +static int +gfs2_children(const char *name, int flag, char ***kids, int **sts, pmdaExt *pmda) +{ + __pmnsTree *tree = pmdaDynamicLookupName(pmda, name); + return pmdaTreeChildren(tree, name, flag, kids, sts); +} + +/* + * Initialise the agent (both daemon and DSO). + */ +void +gfs2_init(pmdaInterface *dp) +{ + int nindoms = sizeof(indomtable)/sizeof(indomtable[0]); + int nmetrics = sizeof(metrictable)/sizeof(metrictable[0]); + + if (dp->status != 0) + return; + + dp->version.four.instance = gfs2_instance; + dp->version.four.store = gfs2_store; + dp->version.four.fetch = gfs2_fetch; + dp->version.four.text = gfs2_text; + dp->version.four.pmid = gfs2_pmid; + dp->version.four.name = gfs2_name; + dp->version.four.children = gfs2_children; + pmdaSetFetchCallBack(dp, gfs2_fetchCallBack); + + gfs2_sbstats_init(metrictable, nmetrics); + gfs2_worst_glock_init(metrictable, nmetrics); + + pmdaSetFlags(dp, PMDA_EXT_FLAG_HASHED); + pmdaInit(dp, indomtable, nindoms, metrictable, nmetrics); + + /* Set defaults */ + gfs2_tracepoints_init(); /* Enables gfs2 tracepoints */ + gfs2_buffer_default_size_set(); /* Sets default buffer size */ + gfs2_ftrace_irq_info_set(); /* Disables irq-info output with trace_pipe */ +} + +static pmLongOptions longopts[] = { + PMDA_OPTIONS_HEADER("Options"), + PMOPT_DEBUG, + PMDAOPT_DOMAIN, + PMDAOPT_LOGFILE, + PMOPT_HELP, + PMDA_OPTIONS_END +}; + +static pmdaOptions opts = { + .short_options = "D:d:l:?", + .long_options = longopts, +}; + +/* + * Set up the agent if running as a daemon. + */ +int +main(int argc, char **argv) +{ + int sep = __pmPathSeparator(); + pmdaInterface dispatch; + char helppath[MAXPATHLEN]; + + __pmSetProgname(argv[0]); + snprintf(helppath, sizeof(helppath), "%s%c" "gfs2" "%c" "help", + pmGetConfig("PCP_PMDAS_DIR"), sep, sep); + pmdaDaemon(&dispatch, PMDA_INTERFACE_4, pmProgname, GFS2, "gfs2.log", helppath); + + pmdaGetOptions(argc, argv, &opts, &dispatch); + if (opts.errors) { + pmdaUsageMessage(&opts); + exit(1); + } + + pmdaOpenLog(&dispatch); + gfs2_init(&dispatch); + pmdaConnect(&dispatch); + pmdaMain(&dispatch); + exit(0); +} |