**/
#include "collectd.h"
+
#include "common.h"
#include "plugin.h"
(double)(_system_configuration.Xfrac))
#endif
-#define NS_TO_TICKS(ns) ((ns) / XINTFRAC)
+#define CLOCKTICKS_TO_TICKS(cticks) ((cticks) / XINTFRAC)
static const char *config_keys[] =
{
static _Bool pool_stats = 0;
static _Bool report_by_serial = 0;
+#if PERFSTAT_SUPPORTS_DONATION
static _Bool donate_flag = 0;
+#endif
static char serial[SYS_NMLN];
static perfstat_partition_total_t lparstats_old;
return (-1);
}
+#if PERFSTAT_SUPPORTS_DONATION
if (!lparstats_old.type.b.shared_enabled
&& lparstats_old.type.b.donate_enabled)
{
donate_flag = 1;
}
+#endif
if (pool_stats && !lparstats_old.type.b.pool_util_authority)
{
lpar_submit ("wait", (double) wait_ticks / (double) ticks);
lpar_submit ("idle", (double) idle_ticks / (double) ticks);
+#if PERFSTAT_SUPPORTS_DONATION
if (donate_flag)
{
/* donated => ticks given to another partition
/* Donated ticks will be accounted for as stolen ticks in other LPARs */
consumed_ticks += idle_stolen_ticks + busy_stolen_ticks;
}
+#endif
lpar_submit ("consumed", (double) consumed_ticks / (double) ticks);
if (pool_stats)
{
char typinst[DATA_MAX_NAME_LEN];
- u_longlong_t pool_busy_ns;
- u_longlong_t pool_max_ns;
- u_longlong_t pool_idle_ns = 0;
-
- pool_busy_ns = lparstats.pool_busy_time - lparstats_old.pool_busy_time;
- pool_max_ns = lparstats.pool_max_time - lparstats_old.pool_max_time;
- if (pool_max_ns > pool_busy_ns)
- pool_idle_ns = pool_max_ns - pool_busy_ns;
+ u_longlong_t pool_idle_cticks;
+ double pool_idle_cpus;
+ double pool_busy_cpus;
+
+ /* We're calculating "busy" from "idle" and the total number of
+ * CPUs, because the "busy" member didn't exist in early versions
+ * of libperfstat. It was added somewhere between AIX 5.3 ML5 and ML9. */
+ pool_idle_cticks = lparstats.pool_idle_time - lparstats_old.pool_idle_time;
+ pool_idle_cpus = CLOCKTICKS_TO_TICKS ((double) pool_idle_cticks) / (double) ticks;
+ pool_busy_cpus = ((double) lparstats.phys_cpus_pool) - pool_idle_cpus;
+ if (pool_busy_cpus < 0.0)
+ pool_busy_cpus = 0.0;
- /* Pool stats are in CPU x ns */
ssnprintf (typinst, sizeof (typinst), "pool-%X-busy", lparstats.pool_id);
- lpar_submit (typinst, NS_TO_TICKS ((double) pool_busy_ns) / (double) ticks);
+ lpar_submit (typinst, pool_busy_cpus);
ssnprintf (typinst, sizeof (typinst), "pool-%X-idle", lparstats.pool_id);
- lpar_submit (typinst, NS_TO_TICKS ((double) pool_idle_ns) / (double) ticks);
+ lpar_submit (typinst, pool_idle_cpus);
}
memcpy (&lparstats_old, &lparstats, sizeof (lparstats_old));