1 /*
   2  * Copyright (c) 2012, 2016 SAP SE. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 // Encapsulates the libperfstat library.
  26 //
  27 // The purpose of this code is to dynamically load the libperfstat library
  28 // instead of statically linking against it. The libperfstat library is an
  29 // AIX-specific library which only exists on AIX, not on PASE. If I want to
  30 // share binaries between AIX and PASE, I cannot directly link against libperfstat.so.
  31 
  32 #ifndef OS_AIX_VM_LIBPERFSTAT_AIX_HPP
  33 #define OS_AIX_VM_LIBPERFSTAT_AIX_HPP
  34 
  35 #include <sys/types.h>
  36 #include <stdlib.h>
  37 
  38 ///////////////////////////////////////////////////////////////////////////////////////////////
  39 // These are excerpts from the AIX 5.3, 6.1, 7.1 libperfstat.h -
  40 // this is all we need from libperfstat.h and I want to avoid having to include <libperfstat.h>
  41 //
  42 // Note: I define all structures as if I were to include libperfstat.h on an AIX 5.2
  43 // build machine.
  44 //
  45 // The ratio behind that is that if I would build on an AIX 5.2 build machine,
  46 // include libperfstat.h and hard-link against libperfstat.a, the program should
  47 // work without recompilation on all newer AIX versions.
  48 //
  49 
  50 #define IDENTIFIER_LENGTH 64    /* length of strings included in the structures */
  51 
  52 
  53 typedef struct { /* structure element identifier */
  54   char name[IDENTIFIER_LENGTH]; /* name of the identifier */
  55 } perfstat_id_t;
  56 
  57 #define CEC_ID_LEN 40           /* CEC identifier length */
  58 #define MAXCORRALNAMELEN 25     /* length of the wpar name */
  59 #define FIRST_WPARNAME ""       /* pseudo-name for the first WPAR */
  60 #define FIRST_WPARID -1         /* pseudo-id for the first WPAR */
  61 
  62 typedef unsigned short cid_t;   /* workload partition identifier */
  63 
  64 typedef struct { /* Virtual memory utilization */
  65   u_longlong_t virt_total;    /* total virtual memory (in 4KB pages) */
  66   u_longlong_t real_total;    /* total real memory (in 4KB pages) */
  67   u_longlong_t real_free;     /* free real memory (in 4KB pages) */
  68   u_longlong_t real_pinned;   /* real memory which is pinned (in 4KB pages) */
  69   u_longlong_t real_inuse;    /* real memory which is in use (in 4KB pages) */
  70   u_longlong_t pgbad;         /* number of bad pages */
  71   u_longlong_t pgexct;        /* number of page faults */
  72   u_longlong_t pgins;         /* number of pages paged in */
  73   u_longlong_t pgouts;        /* number of pages paged out */
  74   u_longlong_t pgspins;       /* number of page ins from paging space */
  75   u_longlong_t pgspouts;      /* number of page outs from paging space */
  76   u_longlong_t scans;         /* number of page scans by clock */
  77   u_longlong_t cycles;        /* number of page replacement cycles */
  78   u_longlong_t pgsteals;      /* number of page steals */
  79   u_longlong_t numperm;       /* number of frames used for files (in 4KB pages) */
  80   u_longlong_t pgsp_total;    /* total paging space (in 4KB pages) */
  81   u_longlong_t pgsp_free;     /* free paging space (in 4KB pages) */
  82   u_longlong_t pgsp_rsvd;     /* reserved paging space (in 4KB pages) */
  83   u_longlong_t real_system;   /* real memory used by system segments (in 4KB pages). This is the sum of all the used pages in segment marked for system usage.
  84                                * Since segment classifications are not always guaranteed to be accurate, this number is only an approximation. */
  85   u_longlong_t real_user;     /* real memory used by non-system segments (in 4KB pages). This is the sum of all pages used in segments not marked for system usage.
  86                                * Since segment classifications are not always guaranteed to be accurate, this number is only an approximation. */
  87   u_longlong_t real_process;  /* real memory used by process segments (in 4KB pages). This is real_total-real_free-numperm-real_system. Since real_system is an
  88                                * approximation, this number is too. */
  89   u_longlong_t virt_active;   /* Active virtual pages. Virtual pages are considered active if they have been accessed */
  90 
  91 } perfstat_memory_total_t;
  92 
  93 typedef struct { /* global cpu information AIX 5.3 < TL10 */
  94   int ncpus;                            /* number of active logical processors */
  95   int ncpus_cfg;                        /* number of configured processors */
  96   char description[IDENTIFIER_LENGTH];  /* processor description (type/official name) */
  97   u_longlong_t processorHZ;             /* processor speed in Hz */
  98   u_longlong_t user;                    /* raw total number of clock ticks spent in user mode */
  99   u_longlong_t sys;                     /* raw total number of clock ticks spent in system mode */
 100   u_longlong_t idle;                    /* raw total number of clock ticks spent idle */
 101   u_longlong_t wait;                    /* raw total number of clock ticks spent waiting for I/O */
 102   u_longlong_t pswitch;                 /* number of process switches (change in currently running process) */
 103   u_longlong_t syscall;                 /* number of system calls executed */
 104   u_longlong_t sysread;                 /* number of read system calls executed */
 105   u_longlong_t syswrite;                /* number of write system calls executed */
 106   u_longlong_t sysfork;                 /* number of forks system calls executed */
 107   u_longlong_t sysexec;                 /* number of execs system calls executed */
 108   u_longlong_t readch;                  /* number of characters tranferred with read system call */
 109   u_longlong_t writech;                 /* number of characters tranferred with write system call */
 110   u_longlong_t devintrs;                /* number of device interrupts */
 111   u_longlong_t softintrs;               /* number of software interrupts */
 112   time_t lbolt;                         /* number of ticks since last reboot */
 113   u_longlong_t loadavg[3];              /* (1<<SBITS) times the average number of runnables processes during the last 1, 5 and 15 minutes.
 114                                                * To calculate the load average, divide the numbers by (1<<SBITS). SBITS is defined in <sys/proc.h>. */
 115   u_longlong_t runque;                  /* length of the run queue (processes ready) */
 116   u_longlong_t swpque;                  /* ength of the swap queue (processes waiting to be paged in) */
 117   u_longlong_t bread;                   /* number of blocks read */
 118   u_longlong_t bwrite;                  /* number of blocks written */
 119   u_longlong_t lread;                   /* number of logical read requests */
 120   u_longlong_t lwrite;                  /* number of logical write requests */
 121   u_longlong_t phread;                  /* number of physical reads (reads on raw devices) */
 122   u_longlong_t phwrite;                 /* number of physical writes (writes on raw devices) */
 123   u_longlong_t runocc;                  /* updated whenever runque is updated, i.e. the runqueue is occupied.
 124                                                * This can be used to compute the simple average of ready processes  */
 125   u_longlong_t swpocc;                  /* updated whenever swpque is updated. i.e. the swpqueue is occupied.
 126                                                * This can be used to compute the simple average processes waiting to be paged in */
 127   u_longlong_t iget;                    /* number of inode lookups */
 128   u_longlong_t namei;                   /* number of vnode lookup from a path name */
 129   u_longlong_t dirblk;                  /* number of 512-byte block reads by the directory search routine to locate an entry for a file */
 130   u_longlong_t msg;                     /* number of IPC message operations */
 131   u_longlong_t sema;                    /* number of IPC semaphore operations */
 132   u_longlong_t rcvint;                  /* number of tty receive interrupts */
 133   u_longlong_t xmtint;                  /* number of tyy transmit interrupts */
 134   u_longlong_t mdmint;                  /* number of modem interrupts */
 135   u_longlong_t tty_rawinch;             /* number of raw input characters  */
 136   u_longlong_t tty_caninch;             /* number of canonical input characters (always zero) */
 137   u_longlong_t tty_rawoutch;            /* number of raw output characters */
 138   u_longlong_t ksched;                  /* number of kernel processes created */
 139   u_longlong_t koverf;                  /* kernel process creation attempts where:
 140                                                * -the user has forked to their maximum limit
 141                                                * -the configuration limit of processes has been reached */
 142   u_longlong_t kexit;                   /* number of kernel processes that became zombies */
 143   u_longlong_t rbread;                  /* number of remote read requests */
 144   u_longlong_t rcread;                  /* number of cached remote reads */
 145   u_longlong_t rbwrt;                   /* number of remote writes */
 146   u_longlong_t rcwrt;                   /* number of cached remote writes */
 147   u_longlong_t traps;                   /* number of traps */
 148   int ncpus_high;                       /* index of highest processor online */
 149   u_longlong_t puser;                   /* raw number of physical processor tics in user mode */
 150   u_longlong_t psys;                    /* raw number of physical processor tics in system mode */
 151   u_longlong_t pidle;                   /* raw number of physical processor tics idle */
 152   u_longlong_t pwait;                   /* raw number of physical processor tics waiting for I/O */
 153   u_longlong_t decrintrs;               /* number of decrementer tics interrupts */
 154   u_longlong_t mpcrintrs;               /* number of mpc's received interrupts */
 155   u_longlong_t mpcsintrs;               /* number of mpc's sent interrupts */
 156   u_longlong_t phantintrs;              /* number of phantom interrupts */
 157   u_longlong_t idle_donated_purr;       /* number of idle cycles donated by a dedicated partition enabled for donation */
 158   u_longlong_t idle_donated_spurr;      /* number of idle spurr cycles donated by a dedicated partition enabled for donation */
 159   u_longlong_t busy_donated_purr;       /* number of busy cycles donated by a dedicated partition enabled for donation */
 160   u_longlong_t busy_donated_spurr;      /* number of busy spurr cycles donated by a dedicated partition enabled for donation */
 161   u_longlong_t idle_stolen_purr;        /* number of idle cycles stolen by the hypervisor from a dedicated partition */
 162   u_longlong_t idle_stolen_spurr;       /* number of idle spurr cycles stolen by the hypervisor from a dedicated partition */
 163   u_longlong_t busy_stolen_purr;        /* number of busy cycles stolen by the hypervisor from a dedicated partition */
 164   u_longlong_t busy_stolen_spurr;       /* number of busy spurr cycles stolen by the hypervisor from a dedicated partition */
 165   short iowait;                         /* number of processes that are asleep waiting for buffered I/O */
 166   short physio;                         /* number of processes waiting for raw I/O */
 167   longlong_t twait;                     /* number of threads that are waiting for filesystem direct(cio) */
 168   u_longlong_t hpi;                     /* number of hypervisor page-ins */
 169   u_longlong_t hpit;                    /* Time spent in hypervisor page-ins (in nanoseconds) */
 170 } perfstat_cpu_total_t_53;
 171 
 172 typedef struct { /* global cpu information AIX 6.1|5.3 > TL09 */
 173   int ncpus;                            /* number of active logical processors */
 174   int ncpus_cfg;                        /* number of configured processors */
 175   char description[IDENTIFIER_LENGTH];  /* processor description (type/official name) */
 176   u_longlong_t processorHZ;             /* processor speed in Hz */
 177   u_longlong_t user;                    /* raw total number of clock ticks spent in user mode */
 178   u_longlong_t sys;                     /* raw total number of clock ticks spent in system mode */
 179   u_longlong_t idle;                    /* raw total number of clock ticks spent idle */
 180   u_longlong_t wait;                    /* raw total number of clock ticks spent waiting for I/O */
 181   u_longlong_t pswitch;                 /* number of process switches (change in currently running process) */
 182   u_longlong_t syscall;                 /* number of system calls executed */
 183   u_longlong_t sysread;                 /* number of read system calls executed */
 184   u_longlong_t syswrite;                /* number of write system calls executed */
 185   u_longlong_t sysfork;                 /* number of forks system calls executed */
 186   u_longlong_t sysexec;                 /* number of execs system calls executed */
 187   u_longlong_t readch;                  /* number of characters tranferred with read system call */
 188   u_longlong_t writech;                 /* number of characters tranferred with write system call */
 189   u_longlong_t devintrs;                /* number of device interrupts */
 190   u_longlong_t softintrs;               /* number of software interrupts */
 191   time_t lbolt;                         /* number of ticks since last reboot */
 192   u_longlong_t loadavg[3];              /* (1<<SBITS) times the average number of runnables processes during the last 1, 5 and 15 minutes.
 193                                                * To calculate the load average, divide the numbers by (1<<SBITS). SBITS is defined in <sys/proc.h>. */
 194   u_longlong_t runque;                  /* length of the run queue (processes ready) */
 195   u_longlong_t swpque;                  /* length of the swap queue (processes waiting to be paged in) */
 196   u_longlong_t bread;                   /* number of blocks read */
 197   u_longlong_t bwrite;                  /* number of blocks written */
 198   u_longlong_t lread;                   /* number of logical read requests */
 199   u_longlong_t lwrite;                  /* number of logical write requests */
 200   u_longlong_t phread;                  /* number of physical reads (reads on raw devices) */
 201   u_longlong_t phwrite;                 /* number of physical writes (writes on raw devices) */
 202   u_longlong_t runocc;                  /* updated whenever runque is updated, i.e. the runqueue is occupied.
 203                                                * This can be used to compute the simple average of ready processes  */
 204   u_longlong_t swpocc;                  /* updated whenever swpque is updated. i.e. the swpqueue is occupied.
 205                                                * This can be used to compute the simple average processes waiting to be paged in */
 206   u_longlong_t iget;                    /* number of inode lookups */
 207   u_longlong_t namei;                   /* number of vnode lookup from a path name */
 208   u_longlong_t dirblk;                  /* number of 512-byte block reads by the directory search routine to locate an entry for a file */
 209   u_longlong_t msg;                     /* number of IPC message operations */
 210   u_longlong_t sema;                    /* number of IPC semaphore operations */
 211   u_longlong_t rcvint;                  /* number of tty receive interrupts */
 212   u_longlong_t xmtint;                  /* number of tyy transmit interrupts */
 213   u_longlong_t mdmint;                  /* number of modem interrupts */
 214   u_longlong_t tty_rawinch;             /* number of raw input characters  */
 215   u_longlong_t tty_caninch;             /* number of canonical input characters (always zero) */
 216   u_longlong_t tty_rawoutch;            /* number of raw output characters */
 217   u_longlong_t ksched;                  /* number of kernel processes created */
 218   u_longlong_t koverf;                  /* kernel process creation attempts where:
 219                                                * -the user has forked to their maximum limit
 220                                                * -the configuration limit of processes has been reached */
 221   u_longlong_t kexit;                   /* number of kernel processes that became zombies */
 222   u_longlong_t rbread;                  /* number of remote read requests */
 223   u_longlong_t rcread;                  /* number of cached remote reads */
 224   u_longlong_t rbwrt;                   /* number of remote writes */
 225   u_longlong_t rcwrt;                   /* number of cached remote writes */
 226   u_longlong_t traps;                   /* number of traps */
 227   int ncpus_high;                       /* index of highest processor online */
 228   u_longlong_t puser;                   /* raw number of physical processor tics in user mode */
 229   u_longlong_t psys;                    /* raw number of physical processor tics in system mode */
 230   u_longlong_t pidle;                   /* raw number of physical processor tics idle */
 231   u_longlong_t pwait;                   /* raw number of physical processor tics waiting for I/O */
 232   u_longlong_t decrintrs;               /* number of decrementer tics interrupts */
 233   u_longlong_t mpcrintrs;               /* number of mpc's received interrupts */
 234   u_longlong_t mpcsintrs;               /* number of mpc's sent interrupts */
 235   u_longlong_t phantintrs;              /* number of phantom interrupts */
 236   u_longlong_t idle_donated_purr;       /* number of idle cycles donated by a dedicated partition enabled for donation */
 237   u_longlong_t idle_donated_spurr;      /* number of idle spurr cycles donated by a dedicated partition enabled for donation */
 238   u_longlong_t busy_donated_purr;       /* number of busy cycles donated by a dedicated partition enabled for donation */
 239   u_longlong_t busy_donated_spurr;      /* number of busy spurr cycles donated by a dedicated partition enabled for donation */
 240   u_longlong_t idle_stolen_purr;        /* number of idle cycles stolen by the hypervisor from a dedicated partition */
 241   u_longlong_t idle_stolen_spurr;       /* number of idle spurr cycles stolen by the hypervisor from a dedicated partition */
 242   u_longlong_t busy_stolen_purr;        /* number of busy cycles stolen by the hypervisor from a dedicated partition */
 243   u_longlong_t busy_stolen_spurr;       /* number of busy spurr cycles stolen by the hypervisor from a dedicated partition */
 244   short iowait;                         /* number of processes that are asleep waiting for buffered I/O */
 245   short physio;                         /* number of processes waiting for raw I/O */
 246   longlong_t twait;                     /* number of threads that are waiting for filesystem direct(cio) */
 247   u_longlong_t hpi;                     /* number of hypervisor page-ins */
 248   u_longlong_t hpit;                    /* Time spent in hypervisor page-ins (in nanoseconds) */
 249   u_longlong_t puser_spurr;             /* number of spurr cycles spent in user mode */
 250   u_longlong_t psys_spurr;              /* number of spurr cycles spent in kernel mode */
 251   u_longlong_t pidle_spurr;             /* number of spurr cycles spent in idle mode */
 252   u_longlong_t pwait_spurr;             /* number of spurr cycles spent in wait mode */
 253   int spurrflag;                        /* set if running in spurr mode */
 254 } perfstat_cpu_total_t_61;
 255 
 256 typedef struct { /* global cpu information AIX 7.1 */
 257   int ncpus;                            /* number of active logical processors */
 258   int ncpus_cfg;                        /* number of configured processors */
 259   char description[IDENTIFIER_LENGTH];  /* processor description (type/official name) */
 260   u_longlong_t processorHZ;             /* processor speed in Hz */
 261   u_longlong_t user;                    /* raw total number of clock ticks spent in user mode */
 262   u_longlong_t sys;                     /* raw total number of clock ticks spent in system mode */
 263   u_longlong_t idle;                    /* raw total number of clock ticks spent idle */
 264   u_longlong_t wait;                    /* raw total number of clock ticks spent waiting for I/O */
 265   u_longlong_t pswitch;                 /* number of process switches (change in currently running process) */
 266   u_longlong_t syscall;                 /* number of system calls executed */
 267   u_longlong_t sysread;                 /* number of read system calls executed */
 268   u_longlong_t syswrite;                /* number of write system calls executed */
 269   u_longlong_t sysfork;                 /* number of forks system calls executed */
 270   u_longlong_t sysexec;                 /* number of execs system calls executed */
 271   u_longlong_t readch;                  /* number of characters tranferred with read system call */
 272   u_longlong_t writech;                 /* number of characters tranferred with write system call */
 273   u_longlong_t devintrs;                /* number of device interrupts */
 274   u_longlong_t softintrs;               /* number of software interrupts */
 275   time_t lbolt;                         /* number of ticks since last reboot */
 276   u_longlong_t loadavg[3];              /* (1<<SBITS) times the average number of runnables processes during the last 1, 5 and 15 minutes.
 277                                                * To calculate the load average, divide the numbers by (1<<SBITS). SBITS is defined in <sys/proc.h>. */
 278   u_longlong_t runque;                  /* length of the run queue (processes ready) */
 279   u_longlong_t swpque;                  /* ength of the swap queue (processes waiting to be paged in) */
 280   u_longlong_t bread;                   /* number of blocks read */
 281   u_longlong_t bwrite;                  /* number of blocks written */
 282   u_longlong_t lread;                   /* number of logical read requests */
 283   u_longlong_t lwrite;                  /* number of logical write requests */
 284   u_longlong_t phread;                  /* number of physical reads (reads on raw devices) */
 285   u_longlong_t phwrite;                 /* number of physical writes (writes on raw devices) */
 286   u_longlong_t runocc;                  /* updated whenever runque is updated, i.e. the runqueue is occupied.
 287                                                * This can be used to compute the simple average of ready processes  */
 288   u_longlong_t swpocc;                  /* updated whenever swpque is updated. i.e. the swpqueue is occupied.
 289                                                * This can be used to compute the simple average processes waiting to be paged in */
 290   u_longlong_t iget;                    /* number of inode lookups */
 291   u_longlong_t namei;                   /* number of vnode lookup from a path name */
 292   u_longlong_t dirblk;                  /* number of 512-byte block reads by the directory search routine to locate an entry for a file */
 293   u_longlong_t msg;                     /* number of IPC message operations */
 294   u_longlong_t sema;                    /* number of IPC semaphore operations */
 295   u_longlong_t rcvint;                  /* number of tty receive interrupts */
 296   u_longlong_t xmtint;                  /* number of tyy transmit interrupts */
 297   u_longlong_t mdmint;                  /* number of modem interrupts */
 298   u_longlong_t tty_rawinch;             /* number of raw input characters  */
 299   u_longlong_t tty_caninch;             /* number of canonical input characters (always zero) */
 300   u_longlong_t tty_rawoutch;            /* number of raw output characters */
 301   u_longlong_t ksched;                  /* number of kernel processes created */
 302   u_longlong_t koverf;                  /* kernel process creation attempts where:
 303                                                * -the user has forked to their maximum limit
 304                                                * -the configuration limit of processes has been reached */
 305   u_longlong_t kexit;                   /* number of kernel processes that became zombies */
 306   u_longlong_t rbread;                  /* number of remote read requests */
 307   u_longlong_t rcread;                  /* number of cached remote reads */
 308   u_longlong_t rbwrt;                   /* number of remote writes */
 309   u_longlong_t rcwrt;                   /* number of cached remote writes */
 310   u_longlong_t traps;                   /* number of traps */
 311   int ncpus_high;                       /* index of highest processor online */
 312   u_longlong_t puser;                   /* raw number of physical processor tics in user mode */
 313   u_longlong_t psys;                    /* raw number of physical processor tics in system mode */
 314   u_longlong_t pidle;                   /* raw number of physical processor tics idle */
 315   u_longlong_t pwait;                   /* raw number of physical processor tics waiting for I/O */
 316   u_longlong_t decrintrs;               /* number of decrementer tics interrupts */
 317   u_longlong_t mpcrintrs;               /* number of mpc's received interrupts */
 318   u_longlong_t mpcsintrs;               /* number of mpc's sent interrupts */
 319   u_longlong_t phantintrs;              /* number of phantom interrupts */
 320   u_longlong_t idle_donated_purr;       /* number of idle cycles donated by a dedicated partition enabled for donation */
 321   u_longlong_t idle_donated_spurr;      /* number of idle spurr cycles donated by a dedicated partition enabled for donation */
 322   u_longlong_t busy_donated_purr;       /* number of busy cycles donated by a dedicated partition enabled for donation */
 323   u_longlong_t busy_donated_spurr;      /* number of busy spurr cycles donated by a dedicated partition enabled for donation */
 324   u_longlong_t idle_stolen_purr;        /* number of idle cycles stolen by the hypervisor from a dedicated partition */
 325   u_longlong_t idle_stolen_spurr;       /* number of idle spurr cycles stolen by the hypervisor from a dedicated partition */
 326   u_longlong_t busy_stolen_purr;        /* number of busy cycles stolen by the hypervisor from a dedicated partition */
 327   u_longlong_t busy_stolen_spurr;       /* number of busy spurr cycles stolen by the hypervisor from a dedicated partition */
 328   short iowait;                         /* number of processes that are asleep waiting for buffered I/O */
 329   short physio;                         /* number of processes waiting for raw I/O */
 330   longlong_t twait;                     /* number of threads that are waiting for filesystem direct(cio) */
 331   u_longlong_t hpi;                     /* number of hypervisor page-ins */
 332   u_longlong_t hpit;                    /* Time spent in hypervisor page-ins (in nanoseconds) */
 333   u_longlong_t puser_spurr;             /* number of spurr cycles spent in user mode */
 334   u_longlong_t psys_spurr;              /* number of spurr cycles spent in kernel mode */
 335   u_longlong_t pidle_spurr;             /* number of spurr cycles spent in idle mode */
 336   u_longlong_t pwait_spurr;             /* number of spurr cycles spent in wait mode */
 337   int spurrflag;                        /* set if running in spurr mode */
 338   u_longlong_t  version;                /* version number (1, 2, etc.,) */
 339 /*      >>>>> END OF STRUCTURE DEFINITION <<<<<         */
 340 /* #define CURR_VERSION_CPU_TOTAL 1              Incremented by one for every new release *
 341                                                * of perfstat_cpu_total_t data structure   */
 342 } perfstat_cpu_total_t_71;
 343 
 344 typedef struct { /* global cpu information AIX 7.2  / 6.1 TL6 (see oslevel -r) */
 345   int ncpus;                /* number of active logical processors */
 346   int ncpus_cfg;             /* number of configured processors */
 347   char description[IDENTIFIER_LENGTH]; /* processor description (type/official name) */
 348   u_longlong_t processorHZ; /* processor speed in Hz */
 349   u_longlong_t user;        /*  raw total number of clock ticks spent in user mode */
 350   u_longlong_t sys;         /* raw total number of clock ticks spent in system mode */
 351   u_longlong_t idle;        /* raw total number of clock ticks spent idle */
 352   u_longlong_t wait;        /* raw total number of clock ticks spent waiting for I/O */
 353   u_longlong_t pswitch;     /* number of process switches (change in currently running process) */
 354   u_longlong_t syscall;     /* number of system calls executed */
 355   u_longlong_t sysread;     /* number of read system calls executed */
 356   u_longlong_t syswrite;    /* number of write system calls executed */
 357   u_longlong_t sysfork;     /* number of forks system calls executed */
 358   u_longlong_t sysexec;     /* number of execs system calls executed */
 359   u_longlong_t readch;      /* number of characters tranferred with read system call */
 360   u_longlong_t writech;     /* number of characters tranferred with write system call */
 361   u_longlong_t devintrs;    /* number of device interrupts */
 362   u_longlong_t softintrs;   /* number of software interrupts */
 363   time_t lbolt;             /* number of ticks since last reboot */
 364   u_longlong_t loadavg[3];  /* (1<<SBITS) times the average number of runnables processes during the last 1, 5 and 15 minutes.    */
 365                             /* To calculate the load average, divide the numbers by (1<<SBITS). SBITS is defined in <sys/proc.h>. */
 366   u_longlong_t runque;      /* length of the run queue (processes ready) */
 367   u_longlong_t swpque;      /* ength of the swap queue (processes waiting to be paged in) */
 368   u_longlong_t bread;       /* number of blocks read */
 369   u_longlong_t bwrite;      /* number of blocks written */
 370   u_longlong_t lread;       /* number of logical read requests */
 371   u_longlong_t lwrite;      /* number of logical write requests */
 372   u_longlong_t phread;      /* number of physical reads (reads on raw devices) */
 373   u_longlong_t phwrite;     /* number of physical writes (writes on raw devices) */
 374   u_longlong_t runocc;      /* updated whenever runque is updated, i.e. the runqueue is occupied.
 375                              * This can be used to compute the simple average of ready processes  */
 376   u_longlong_t swpocc;      /* updated whenever swpque is updated. i.e. the swpqueue is occupied.
 377                              * This can be used to compute the simple average processes waiting to be paged in */
 378   u_longlong_t iget;        /* number of inode lookups */
 379   u_longlong_t namei;       /* number of vnode lookup from a path name */
 380   u_longlong_t dirblk;      /* number of 512-byte block reads by the directory search routine to locate an entry for a file */
 381   u_longlong_t msg;         /* number of IPC message operations */
 382   u_longlong_t sema;        /* number of IPC semaphore operations */
 383   u_longlong_t rcvint;      /* number of tty receive interrupts */
 384   u_longlong_t xmtint;      /* number of tyy transmit interrupts */
 385   u_longlong_t mdmint;      /* number of modem interrupts */
 386   u_longlong_t tty_rawinch; /* number of raw input characters  */
 387   u_longlong_t tty_caninch; /* number of canonical input characters (always zero) */
 388   u_longlong_t tty_rawoutch;/* number of raw output characters */
 389   u_longlong_t ksched;      /* number of kernel processes created */
 390   u_longlong_t koverf;      /* kernel process creation attempts where:
 391                              * -the user has forked to their maximum limit
 392                              * -the configuration limit of processes has been reached */
 393   u_longlong_t kexit;       /* number of kernel processes that became zombies */
 394   u_longlong_t rbread;      /* number of remote read requests */
 395   u_longlong_t rcread;      /* number of cached remote reads */
 396   u_longlong_t rbwrt;       /* number of remote writes */
 397   u_longlong_t rcwrt;       /* number of cached remote writes */
 398   u_longlong_t traps;       /* number of traps */
 399   int ncpus_high;           /* index of highest processor online */
 400   u_longlong_t puser;       /* raw number of physical processor tics in user mode */
 401   u_longlong_t psys;        /* raw number of physical processor tics in system mode */
 402   u_longlong_t pidle;       /* raw number of physical processor tics idle */
 403   u_longlong_t pwait;       /* raw number of physical processor tics waiting for I/O */
 404   u_longlong_t decrintrs;   /* number of decrementer tics interrupts */
 405   u_longlong_t mpcrintrs;   /* number of mpc's received interrupts */
 406   u_longlong_t mpcsintrs;   /* number of mpc's sent interrupts */
 407   u_longlong_t phantintrs;  /* number of phantom interrupts */
 408   u_longlong_t idle_donated_purr; /* number of idle cycles donated by a dedicated partition enabled for donation */
 409   u_longlong_t idle_donated_spurr;/* number of idle spurr cycles donated by a dedicated partition enabled for donation */
 410   u_longlong_t busy_donated_purr; /* number of busy cycles donated by a dedicated partition enabled for donation */
 411   u_longlong_t busy_donated_spurr;/* number of busy spurr cycles donated by a dedicated partition enabled for donation */
 412   u_longlong_t idle_stolen_purr;  /* number of idle cycles stolen by the hypervisor from a dedicated partition */
 413   u_longlong_t idle_stolen_spurr; /* number of idle spurr cycles stolen by the hypervisor from a dedicated partition */
 414   u_longlong_t busy_stolen_purr;  /* number of busy cycles stolen by the hypervisor from a dedicated partition */
 415   u_longlong_t busy_stolen_spurr; /* number of busy spurr cycles stolen by the hypervisor from a dedicated partition */
 416   short iowait;             /* number of processes that are asleep waiting for buffered I/O */
 417   short physio;             /* number of processes waiting for raw I/O */
 418   longlong_t twait;         /* number of threads that are waiting for filesystem direct(cio) */
 419   u_longlong_t hpi;         /* number of hypervisor page-ins */
 420   u_longlong_t hpit;        /* Time spent in hypervisor page-ins (in nanoseconds) */
 421   u_longlong_t puser_spurr; /* number of spurr cycles spent in user mode */
 422   u_longlong_t psys_spurr;  /* number of spurr cycles spent in kernel mode */
 423   u_longlong_t pidle_spurr; /* number of spurr cycles spent in idle mode */
 424   u_longlong_t pwait_spurr; /* number of spurr cycles spent in wait mode */
 425   int spurrflag;            /* set if running in spurr mode */
 426   u_longlong_t  version;    /* version number (1, 2, etc.,) */
 427   u_longlong_t tb_last;     /*time base counter */
 428   u_longlong_t purr_coalescing;   /* If the calling partition is
 429                                    * authorized to see pool wide statistics then
 430                                    * PURR cycles consumed to coalesce data
 431                                    * else set to zero.*/
 432   u_longlong_t spurr_coalescing;  /* If the calling partition is
 433                                    * authorized to see pool wide statistics then
 434                                    * SPURR cycles consumed to coalesce data
 435                                    * else set to zero.*/
 436 
 437 /*      >>>>> END OF STRUCTURE DEFINITION <<<<<         */
 438 #define CURR_VERSION_CPU_TOTAL 2 /* Incremented by one for every new release *
 439                                   * of perfstat_cpu_total_t data structure   */
 440 } perfstat_cpu_total_t_72;
 441 
 442 
 443 typedef union {
 444   uint    w;
 445   struct {
 446           unsigned smt_capable :1;          /* OS supports SMT mode */
 447           unsigned smt_enabled :1;          /* SMT mode is on */
 448           unsigned lpar_capable :1;         /* OS supports logical partitioning */
 449           unsigned lpar_enabled :1;         /* logical partitioning is on */
 450           unsigned shared_capable :1;       /* OS supports shared processor LPAR */
 451           unsigned shared_enabled :1;       /* partition runs in shared mode */
 452           unsigned dlpar_capable :1;        /* OS supports dynamic LPAR */
 453           unsigned capped :1;               /* partition is capped */
 454           unsigned kernel_is_64 :1;         /* kernel is 64 bit */
 455           unsigned pool_util_authority :1;  /* pool utilization available */
 456           unsigned donate_capable :1;       /* capable of donating cycles */
 457           unsigned donate_enabled :1;       /* enabled for donating cycles */
 458           unsigned ams_capable:1;           /* 1 = AMS(Active Memory Sharing) capable, 0 = Not AMS capable */
 459           unsigned ams_enabled:1;           /* 1 = AMS(Active Memory Sharing) enabled, 0 = Not AMS enabled */
 460           unsigned power_save:1;            /* 1 = Power saving mode is enabled */
 461           unsigned ame_enabled:1;           /* Active Memory Expansion is enabled */
 462           unsigned shared_extended :1;
 463           unsigned spare :15;               /* reserved for future usage */
 464   } b;
 465 } perfstat_partition_type_t;
 466 
 467 typedef struct { /* partition total information AIX 5.3 < TL6 */
 468   char name[IDENTIFIER_LENGTH];         /* name of the logical partition */
 469   perfstat_partition_type_t type;       /* set of bits describing the partition */
 470   int lpar_id;                          /* logical partition identifier */
 471   int group_id;                         /* identifier of the LPAR group this partition is a member of */
 472   int pool_id;                          /* identifier of the shared pool of physical processors this partition is a member of */
 473   int online_cpus;                      /* number of virtual CPUs currently online on the partition */
 474   int max_cpus;                         /* maximum number of virtual CPUs this parition can ever have */
 475   int min_cpus;                         /* minimum number of virtual CPUs this partition must have */
 476   u_longlong_t online_memory;           /* amount of memory currently online */
 477   u_longlong_t max_memory;              /* maximum amount of memory this partition can ever have */
 478   u_longlong_t min_memory;              /* minimum amount of memory this partition must have */
 479   int entitled_proc_capacity;           /* number of processor units this partition is entitled to receive */
 480   int max_proc_capacity;                /* maximum number of processor units this partition can ever have */
 481   int min_proc_capacity;                /* minimum number of processor units this partition must have */
 482   int proc_capacity_increment;          /* increment value to the entitled capacity */
 483   int unalloc_proc_capacity;            /* number of processor units currently unallocated in the shared processor pool this partition belongs to */
 484   int var_proc_capacity_weight;         /* partition priority weight to receive extra capacity */
 485   int unalloc_var_proc_capacity_weight; /* number of variable processor capacity weight units currently unallocated  in the shared processor pool this partition belongs to */
 486   int online_phys_cpus_sys;             /* number of physical CPUs currently active in the system containing this partition */
 487   int max_phys_cpus_sys;                /* maximum possible number of physical CPUs in the system containing this partition */
 488   int phys_cpus_pool;                   /* number of the physical CPUs currently in the shared processor pool this partition belong to */
 489   u_longlong_t puser;                   /* raw number of physical processor tics in user mode */
 490   u_longlong_t psys;                    /* raw number of physical processor tics in system mode */
 491   u_longlong_t pidle;                   /* raw number of physical processor tics idle */
 492   u_longlong_t pwait;                   /* raw number of physical processor tics waiting for I/O */
 493   u_longlong_t pool_idle_time;          /* number of clock tics a processor in the shared pool was idle */
 494   u_longlong_t phantintrs;              /* number of phantom interrupts received by the partition */
 495   u_longlong_t invol_virt_cswitch;      /* number involuntary virtual CPU context switches */
 496   u_longlong_t vol_virt_cswitch;        /* number voluntary virtual CPU context switches */
 497   u_longlong_t timebase_last;           /* most recently cpu time base */
 498   u_longlong_t reserved_pages;          /* Currenlty number of 16GB pages. Cannot participate in DR operations */
 499   u_longlong_t reserved_pagesize;       /* Currently 16GB pagesize Cannot participate in DR operations */
 500 } perfstat_partition_total_t_53_5;
 501 
 502 typedef struct { /* partition total information AIX 5.3 < TL10 */
 503   char name[IDENTIFIER_LENGTH];         /* name of the logical partition */
 504   perfstat_partition_type_t type;       /* set of bits describing the partition */
 505   int lpar_id;                          /* logical partition identifier */
 506   int group_id;                         /* identifier of the LPAR group this partition is a member of */
 507   int pool_id;                          /* identifier of the shared pool of physical processors this partition is a member of */
 508   int online_cpus;                      /* number of virtual CPUs currently online on the partition */
 509   int max_cpus;                         /* maximum number of virtual CPUs this parition can ever have */
 510   int min_cpus;                         /* minimum number of virtual CPUs this partition must have */
 511   u_longlong_t online_memory;           /* amount of memory currently online */
 512   u_longlong_t max_memory;              /* maximum amount of memory this partition can ever have */
 513   u_longlong_t min_memory;              /* minimum amount of memory this partition must have */
 514   int entitled_proc_capacity;           /* number of processor units this partition is entitled to receive */
 515   int max_proc_capacity;                /* maximum number of processor units this partition can ever have */
 516   int min_proc_capacity;                /* minimum number of processor units this partition must have */
 517   int proc_capacity_increment;          /* increment value to the entitled capacity */
 518   int unalloc_proc_capacity;            /* number of processor units currently unallocated in the shared processor pool this partition belongs to */
 519   int var_proc_capacity_weight;         /* partition priority weight to receive extra capacity */
 520   int unalloc_var_proc_capacity_weight; /* number of variable processor capacity weight units currently unallocated  in the shared processor pool this partition belongs to */
 521   int online_phys_cpus_sys;             /* number of physical CPUs currently active in the system containing this partition */
 522   int max_phys_cpus_sys;                /* maximum possible number of physical CPUs in the system containing this partition */
 523   int phys_cpus_pool;                   /* number of the physical CPUs currently in the shared processor pool this partition belong to */
 524   u_longlong_t puser;                   /* raw number of physical processor tics in user mode */
 525   u_longlong_t psys;                    /* raw number of physical processor tics in system mode */
 526   u_longlong_t pidle;                   /* raw number of physical processor tics idle */
 527   u_longlong_t pwait;                   /* raw number of physical processor tics waiting for I/O */
 528   u_longlong_t pool_idle_time;          /* number of clock tics a processor in the shared pool was idle */
 529   u_longlong_t phantintrs;              /* number of phantom interrupts received by the partition */
 530   u_longlong_t invol_virt_cswitch;      /* number involuntary virtual CPU context switches */
 531   u_longlong_t vol_virt_cswitch;        /* number voluntary virtual CPU context switches */
 532   u_longlong_t timebase_last;           /* most recently cpu time base */
 533   u_longlong_t reserved_pages;          /* Currenlty number of 16GB pages. Cannot participate in DR operations */
 534   u_longlong_t reserved_pagesize;       /* Currently 16GB pagesize Cannot participate in DR operations */
 535   u_longlong_t idle_donated_purr;       /* number of idle cycles donated by a dedicated partition enabled for donation */
 536   u_longlong_t idle_donated_spurr;      /* number of idle spurr cycles donated by a dedicated partition enabled for donation */
 537   u_longlong_t busy_donated_purr;       /* number of busy cycles donated by a dedicated partition enabled for donation */
 538   u_longlong_t busy_donated_spurr;      /* number of busy spurr cycles donated by a dedicated partition enabled for donation */
 539   u_longlong_t idle_stolen_purr;        /* number of idle cycles stolen by the hypervisor from a dedicated partition */
 540   u_longlong_t idle_stolen_spurr;       /* number of idle spurr cycles stolen by the hypervisor from a dedicated partition */
 541   u_longlong_t busy_stolen_purr;        /* number of busy cycles stolen by the hypervisor from a dedicated partition */
 542   u_longlong_t busy_stolen_spurr;       /* number of busy spurr cycles stolen by the hypervisor from a dedicated partition */
 543   u_longlong_t shcpus_in_sys;           /* Number of physical processors allocated for shared processor use */
 544   u_longlong_t max_pool_capacity;       /* Maximum processor capacity of partitions pool */
 545   u_longlong_t entitled_pool_capacity;  /* Entitled processor capacity of partitions pool */
 546   u_longlong_t pool_max_time;           /* Summation of maximum time that could be consumed by the pool (nano seconds) */
 547   u_longlong_t pool_busy_time;          /* Summation of busy (non-idle) time accumulated across all partitions in the pool (nano seconds) */
 548   u_longlong_t pool_scaled_busy_time;   /* Scaled summation of busy (non-idle) time accumulated across all partitions in the pool (nano seconds) */
 549   u_longlong_t shcpu_tot_time;          /* Summation of total time across all physical processors allocated for shared processor use (nano seconds) */
 550   u_longlong_t shcpu_busy_time;         /* Summation of busy (non-idle) time accumulated across all shared processor partitions (nano seconds) */
 551   u_longlong_t shcpu_scaled_busy_time;  /* Scaled summation of busy time accumulated across all shared processor partitions (nano seconds) */
 552   int ams_pool_id;                      /* AMS pool id of the pool the LPAR belongs to */
 553   int var_mem_weight;                   /* variable memory capacity weight */
 554   u_longlong_t iome;                    /* I/O memory entitlement of the partition in bytes*/
 555   u_longlong_t pmem;                    /* Physical memory currently backing the partition's logical memory in bytes*/
 556   u_longlong_t hpi;                     /* number of hypervisor page-ins */
 557   u_longlong_t hpit;                    /* Time spent in hypervisor page-ins (in nanoseconds)*/
 558   u_longlong_t hypv_pagesize;           /* Hypervisor page size in KB*/
 559 } perfstat_partition_total_t_53;
 560 
 561 typedef struct { /* partition total information AIX 6.1|5.3 > TL09 */
 562   char name[IDENTIFIER_LENGTH];         /* name of the logical partition */
 563   perfstat_partition_type_t type;       /* set of bits describing the partition */
 564   int lpar_id;                          /* logical partition identifier */
 565   int group_id;                         /* identifier of the LPAR group this partition is a member of */
 566   int pool_id;                          /* identifier of the shared pool of physical processors this partition is a member of */
 567   int online_cpus;                      /* number of virtual CPUs currently online on the partition */
 568   int max_cpus;                         /* maximum number of virtual CPUs this parition can ever have */
 569   int min_cpus;                         /* minimum number of virtual CPUs this partition must have */
 570   u_longlong_t online_memory;           /* amount of memory currently online */
 571   u_longlong_t max_memory;              /* maximum amount of memory this partition can ever have */
 572   u_longlong_t min_memory;              /* minimum amount of memory this partition must have */
 573   int entitled_proc_capacity;           /* number of processor units this partition is entitled to receive */
 574   int max_proc_capacity;                /* maximum number of processor units this partition can ever have */
 575   int min_proc_capacity;                /* minimum number of processor units this partition must have */
 576   int proc_capacity_increment;          /* increment value to the entitled capacity */
 577   int unalloc_proc_capacity;            /* number of processor units currently unallocated in the shared processor pool this partition belongs to */
 578   int var_proc_capacity_weight;         /* partition priority weight to receive extra capacity */
 579   int unalloc_var_proc_capacity_weight; /* number of variable processor capacity weight units currently unallocated  in the shared processor pool this partition belongs to */
 580   int online_phys_cpus_sys;             /* number of physical CPUs currently active in the system containing this partition */
 581   int max_phys_cpus_sys;                /* maximum possible number of physical CPUs in the system containing this partition */
 582   int phys_cpus_pool;                   /* number of the physical CPUs currently in the shared processor pool this partition belong to */
 583   u_longlong_t puser;                   /* raw number of physical processor tics in user mode */
 584   u_longlong_t psys;                    /* raw number of physical processor tics in system mode */
 585   u_longlong_t pidle;                   /* raw number of physical processor tics idle */
 586   u_longlong_t pwait;                   /* raw number of physical processor tics waiting for I/O */
 587   u_longlong_t pool_idle_time;          /* number of clock tics a processor in the shared pool was idle */
 588   u_longlong_t phantintrs;              /* number of phantom interrupts received by the partition */
 589   u_longlong_t invol_virt_cswitch;      /* number involuntary virtual CPU context switches */
 590   u_longlong_t vol_virt_cswitch;        /* number voluntary virtual CPU context switches */
 591   u_longlong_t timebase_last;           /* most recently cpu time base */
 592   u_longlong_t reserved_pages;          /* Currenlty number of 16GB pages. Cannot participate in DR operations */
 593   u_longlong_t reserved_pagesize;       /* Currently 16GB pagesize Cannot participate in DR operations */
 594   u_longlong_t idle_donated_purr;       /* number of idle cycles donated by a dedicated partition enabled for donation */
 595   u_longlong_t idle_donated_spurr;      /* number of idle spurr cycles donated by a dedicated partition enabled for donation */
 596   u_longlong_t busy_donated_purr;       /* number of busy cycles donated by a dedicated partition enabled for donation */
 597   u_longlong_t busy_donated_spurr;      /* number of busy spurr cycles donated by a dedicated partition enabled for donation */
 598   u_longlong_t idle_stolen_purr;        /* number of idle cycles stolen by the hypervisor from a dedicated partition */
 599   u_longlong_t idle_stolen_spurr;       /* number of idle spurr cycles stolen by the hypervisor from a dedicated partition */
 600   u_longlong_t busy_stolen_purr;        /* number of busy cycles stolen by the hypervisor from a dedicated partition */
 601   u_longlong_t busy_stolen_spurr;       /* number of busy spurr cycles stolen by the hypervisor from a dedicated partition */
 602   u_longlong_t shcpus_in_sys;           /* Number of physical processors allocated for shared processor use */
 603   u_longlong_t max_pool_capacity;       /* Maximum processor capacity of partitions pool */
 604   u_longlong_t entitled_pool_capacity;  /* Entitled processor capacity of partitions pool */
 605   u_longlong_t pool_max_time;           /* Summation of maximum time that could be consumed by the pool (nano seconds) */
 606   u_longlong_t pool_busy_time;          /* Summation of busy (non-idle) time accumulated across all partitions in the pool (nano seconds) */
 607   u_longlong_t pool_scaled_busy_time;   /* Scaled summation of busy (non-idle) time accumulated across all partitions in the pool (nano seconds) */
 608   u_longlong_t shcpu_tot_time;          /* Summation of total time across all physical processors allocated for shared processor use (nano seconds) */
 609   u_longlong_t shcpu_busy_time;         /* Summation of busy (non-idle) time accumulated across all shared processor partitions (nano seconds) */
 610   u_longlong_t shcpu_scaled_busy_time;  /* Scaled summation of busy time accumulated across all shared processor partitions (nano seconds) */
 611   int ams_pool_id;                      /* AMS pool id of the pool the LPAR belongs to */
 612   int var_mem_weight;                   /* variable memory capacity weight */
 613   u_longlong_t iome;                    /* I/O memory entitlement of the partition in bytes*/
 614   u_longlong_t pmem;                    /* Physical memory currently backing the partition's logical memory in bytes*/
 615   u_longlong_t hpi;                     /* number of hypervisor page-ins */
 616   u_longlong_t hpit;                    /* Time spent in hypervisor page-ins (in nanoseconds)*/
 617   u_longlong_t hypv_pagesize;           /* Hypervisor page size in KB*/
 618   uint online_lcpus;                    /* number of online logical cpus */
 619   uint smt_thrds;                       /* number of hardware threads that are running */
 620   u_longlong_t puser_spurr;             /* number of spurr cycles spent in user mode */
 621   u_longlong_t psys_spurr;              /* number of spurr cycles spent in kernel mode */
 622   u_longlong_t pidle_spurr;             /* number of spurr cycles spent in idle mode */
 623   u_longlong_t pwait_spurr;             /* number of spurr cycles spent in wait mode */
 624   int spurrflag;                        /* set if running in spurr mode */
 625 } perfstat_partition_total_t_61;
 626 
 627 typedef struct { /* partition total information AIX 7.1 */
 628   char name[IDENTIFIER_LENGTH];         /* name of the logical partition */
 629   perfstat_partition_type_t type;       /* set of bits describing the partition */
 630   int lpar_id;                          /* logical partition identifier */
 631   int group_id;                         /* identifier of the LPAR group this partition is a member of */
 632   int pool_id;                          /* identifier of the shared pool of physical processors this partition is a member of */
 633   int online_cpus;                      /* number of virtual CPUs currently online on the partition */
 634   int max_cpus;                         /* maximum number of virtual CPUs this parition can ever have */
 635   int min_cpus;                         /* minimum number of virtual CPUs this partition must have */
 636   u_longlong_t online_memory;           /* amount of memory currently online */
 637   u_longlong_t max_memory;              /* maximum amount of memory this partition can ever have */
 638   u_longlong_t min_memory;              /* minimum amount of memory this partition must have */
 639   int entitled_proc_capacity;           /* number of processor units this partition is entitled to receive */
 640   int max_proc_capacity;                /* maximum number of processor units this partition can ever have */
 641   int min_proc_capacity;                /* minimum number of processor units this partition must have */
 642   int proc_capacity_increment;          /* increment value to the entitled capacity */
 643   int unalloc_proc_capacity;            /* number of processor units currently unallocated in the shared processor pool this partition belongs to */
 644   int var_proc_capacity_weight;         /* partition priority weight to receive extra capacity */
 645   int unalloc_var_proc_capacity_weight; /* number of variable processor capacity weight units currently unallocated  in the shared processor pool this partition belongs to */
 646   int online_phys_cpus_sys;             /* number of physical CPUs currently active in the system containing this partition */
 647   int max_phys_cpus_sys;                /* maximum possible number of physical CPUs in the system containing this partition */
 648   int phys_cpus_pool;                   /* number of the physical CPUs currently in the shared processor pool this partition belong to */
 649   u_longlong_t puser;                   /* raw number of physical processor tics in user mode */
 650   u_longlong_t psys;                    /* raw number of physical processor tics in system mode */
 651   u_longlong_t pidle;                   /* raw number of physical processor tics idle */
 652   u_longlong_t pwait;                   /* raw number of physical processor tics waiting for I/O */
 653   u_longlong_t pool_idle_time;          /* number of clock tics a processor in the shared pool was idle */
 654   u_longlong_t phantintrs;              /* number of phantom interrupts received by the partition */
 655   u_longlong_t invol_virt_cswitch;      /* number involuntary virtual CPU context switches */
 656   u_longlong_t vol_virt_cswitch;        /* number voluntary virtual CPU context switches */
 657   u_longlong_t timebase_last;           /* most recently cpu time base */
 658   u_longlong_t reserved_pages;          /* Currenlty number of 16GB pages. Cannot participate in DR operations */
 659   u_longlong_t reserved_pagesize;       /* Currently 16GB pagesize Cannot participate in DR operations */
 660   u_longlong_t idle_donated_purr;       /* number of idle cycles donated by a dedicated partition enabled for donation */
 661   u_longlong_t idle_donated_spurr;      /* number of idle spurr cycles donated by a dedicated partition enabled for donation */
 662   u_longlong_t busy_donated_purr;       /* number of busy cycles donated by a dedicated partition enabled for donation */
 663   u_longlong_t busy_donated_spurr;      /* number of busy spurr cycles donated by a dedicated partition enabled for donation */
 664   u_longlong_t idle_stolen_purr;        /* number of idle cycles stolen by the hypervisor from a dedicated partition */
 665   u_longlong_t idle_stolen_spurr;       /* number of idle spurr cycles stolen by the hypervisor from a dedicated partition */
 666   u_longlong_t busy_stolen_purr;        /* number of busy cycles stolen by the hypervisor from a dedicated partition */
 667   u_longlong_t busy_stolen_spurr;       /* number of busy spurr cycles stolen by the hypervisor from a dedicated partition */
 668   u_longlong_t shcpus_in_sys;           /* Number of physical processors allocated for shared processor use */
 669   u_longlong_t max_pool_capacity;       /* Maximum processor capacity of partitions pool */
 670   u_longlong_t entitled_pool_capacity;  /* Entitled processor capacity of partitions pool */
 671   u_longlong_t pool_max_time;           /* Summation of maximum time that could be consumed by the pool (nano seconds) */
 672   u_longlong_t pool_busy_time;          /* Summation of busy (non-idle) time accumulated across all partitions in the pool (nano seconds) */
 673   u_longlong_t pool_scaled_busy_time;   /* Scaled summation of busy (non-idle) time accumulated across all partitions in the pool (nano seconds) */
 674   u_longlong_t shcpu_tot_time;          /* Summation of total time across all physical processors allocated for shared processor use (nano seconds) */
 675   u_longlong_t shcpu_busy_time;         /* Summation of busy (non-idle) time accumulated across all shared processor partitions (nano seconds) */
 676   u_longlong_t shcpu_scaled_busy_time;  /* Scaled summation of busy time accumulated across all shared processor partitions (nano seconds) */
 677   int ams_pool_id;                      /* AMS pool id of the pool the LPAR belongs to */
 678   int var_mem_weight;                   /* variable memory capacity weight */
 679   u_longlong_t iome;                    /* I/O memory entitlement of the partition in bytes*/
 680   u_longlong_t pmem;                    /* Physical memory currently backing the partition's logical memory in bytes*/
 681   u_longlong_t hpi;                     /* number of hypervisor page-ins */
 682   u_longlong_t hpit;                    /* Time spent in hypervisor page-ins (in nanoseconds)*/
 683   u_longlong_t hypv_pagesize;           /* Hypervisor page size in KB*/
 684   uint online_lcpus;                    /* number of online logical cpus */
 685   uint smt_thrds;                       /* number of hardware threads that are running */
 686   u_longlong_t puser_spurr;             /* number of spurr cycles spent in user mode */
 687   u_longlong_t psys_spurr;              /* number of spurr cycles spent in kernel mode */
 688   u_longlong_t pidle_spurr;             /* number of spurr cycles spent in idle mode */
 689   u_longlong_t pwait_spurr;             /* number of spurr cycles spent in wait mode */
 690   int spurrflag;                        /* set if running in spurr mode */
 691   char hardwareid[CEC_ID_LEN];          /* CEC Identifier */
 692         uint power_save_mode;                 /* Power save mode for the LPAR. Introduced through LI 53K PRF : Feature 728 292*/
 693         ushort ame_version;                   /* AME Version */
 694         u_longlong_t true_memory;             /* True Memory Size in 4KB pages */
 695         u_longlong_t expanded_memory;         /* Expanded Memory Size in 4KB pages */
 696         u_longlong_t target_memexp_factr;     /* Target Memory Expansion Factor scaled by 100 */
 697         u_longlong_t current_memexp_factr;    /* Current Memory Expansion Factor scaled by 100 */
 698         u_longlong_t target_cpool_size;       /* Target Compressed Pool Size in bytes */
 699         u_longlong_t max_cpool_size;          /* Max Size of Compressed Pool in bytes */
 700         u_longlong_t min_ucpool_size;         /* Min Size of Uncompressed Pool in bytes */
 701         u_longlong_t ame_deficit_size;        /*Deficit memory size in bytes */
 702         u_longlong_t version;                 /* version number (1, 2, etc.,) */
 703         u_longlong_t cmcs_total_time;         /* Total CPU time spent due to active memory expansion */
 704 } perfstat_partition_total_t_71;
 705 
 706 typedef struct { /* partition total information AIX 7.1 >= TL1*/
 707         char name[IDENTIFIER_LENGTH];         /* name of the logical partition */
 708         perfstat_partition_type_t type;       /* set of bits describing the partition */
 709         int lpar_id;                          /* logical partition identifier */
 710         int group_id;                         /* identifier of the LPAR group this partition is a member of */
 711         int pool_id;                          /* identifier of the shared pool of physical processors this partition is a member of */
 712         int online_cpus;                      /* number of virtual CPUs currently online on the partition */
 713         int max_cpus;                         /* maximum number of virtual CPUs this parition can ever have */
 714         int min_cpus;                         /* minimum number of virtual CPUs this partition must have */
 715         u_longlong_t online_memory;           /* amount of memory currently online */
 716         u_longlong_t max_memory;              /* maximum amount of memory this partition can ever have */
 717         u_longlong_t min_memory;              /* minimum amount of memory this partition must have */
 718         int entitled_proc_capacity;           /* number of processor units this partition is entitled to receive */
 719         int max_proc_capacity;                /* maximum number of processor units this partition can ever have */
 720         int min_proc_capacity;                /* minimum number of processor units this partition must have */
 721         int proc_capacity_increment;          /* increment value to the entitled capacity */
 722         int unalloc_proc_capacity;            /* number of processor units currently unallocated in the shared processor pool this partition belongs to */
 723         int var_proc_capacity_weight;         /* partition priority weight to receive extra capacity */
 724         int unalloc_var_proc_capacity_weight; /* number of variable processor capacity weight units currently unallocated  in the shared processor pool this partition belongs to */
 725         int online_phys_cpus_sys;             /* number of physical CPUs currently active in the system containing this partition */
 726         int max_phys_cpus_sys;                /* maximum possible number of physical CPUs in the system containing this partition */
 727         int phys_cpus_pool;                   /* number of the physical CPUs currently in the shared processor pool this partition belong to */
 728         u_longlong_t puser;                   /* raw number of physical processor tics in user mode */
 729         u_longlong_t psys;                    /* raw number of physical processor tics in system mode */
 730         u_longlong_t pidle;                   /* raw number of physical processor tics idle */
 731         u_longlong_t pwait;                   /* raw number of physical processor tics waiting for I/O */
 732         u_longlong_t pool_idle_time;          /* number of clock tics a processor in the shared pool was idle */
 733         u_longlong_t phantintrs;              /* number of phantom interrupts received by the partition */
 734         u_longlong_t invol_virt_cswitch;      /* number involuntary virtual CPU context switches */
 735         u_longlong_t vol_virt_cswitch;        /* number voluntary virtual CPU context switches */
 736         u_longlong_t timebase_last;           /* most recently cpu time base */
 737         u_longlong_t reserved_pages;          /* Currenlty number of 16GB pages. Cannot participate in DR operations */
 738         u_longlong_t reserved_pagesize;       /* Currently 16GB pagesize Cannot participate in DR operations */
 739         u_longlong_t idle_donated_purr;       /* number of idle cycles donated by a dedicated partition enabled for donation */
 740         u_longlong_t idle_donated_spurr;      /* number of idle spurr cycles donated by a dedicated partition enabled for donation */
 741         u_longlong_t busy_donated_purr;       /* number of busy cycles donated by a dedicated partition enabled for donation */
 742         u_longlong_t busy_donated_spurr;      /* number of busy spurr cycles donated by a dedicated partition enabled for donation */
 743         u_longlong_t idle_stolen_purr;        /* number of idle cycles stolen by the hypervisor from a dedicated partition */
 744         u_longlong_t idle_stolen_spurr;       /* number of idle spurr cycles stolen by the hypervisor from a dedicated partition */
 745         u_longlong_t busy_stolen_purr;        /* number of busy cycles stolen by the hypervisor from a dedicated partition */
 746         u_longlong_t busy_stolen_spurr;       /* number of busy spurr cycles stolen by the hypervisor from a dedicated partition */
 747         u_longlong_t shcpus_in_sys;           /* Number of physical processors allocated for shared processor use */
 748         u_longlong_t max_pool_capacity;       /* Maximum processor capacity of partitions pool */
 749         u_longlong_t entitled_pool_capacity;  /* Entitled processor capacity of partitions pool */
 750         u_longlong_t pool_max_time;           /* Summation of maximum time that could be consumed by the pool (nano seconds) */
 751         u_longlong_t pool_busy_time;          /* Summation of busy (non-idle) time accumulated across all partitions in the pool (nano seconds) */
 752         u_longlong_t pool_scaled_busy_time;   /* Scaled summation of busy (non-idle) time accumulated across all partitions in the pool (nano seconds) */
 753         u_longlong_t shcpu_tot_time;          /* Summation of total time across all physical processors allocated for shared processor use (nano seconds) */
 754         u_longlong_t shcpu_busy_time;         /* Summation of busy (non-idle) time accumulated across all shared processor partitions (nano seconds) */
 755         u_longlong_t shcpu_scaled_busy_time;  /* Scaled summation of busy time accumulated across all shared processor partitions (nano seconds) */
 756         int ams_pool_id;                      /* AMS pool id of the pool the LPAR belongs to */
 757         int var_mem_weight;                   /* variable memory capacity weight */
 758         u_longlong_t iome;                    /* I/O memory entitlement of the partition in bytes*/
 759         u_longlong_t pmem;                    /* Physical memory currently backing the partition's logical memory in bytes*/
 760         u_longlong_t hpi;                     /* number of hypervisor page-ins */
 761         u_longlong_t hpit;                    /* Time spent in hypervisor page-ins (in nanoseconds)*/
 762         u_longlong_t hypv_pagesize;           /* Hypervisor page size in KB*/
 763         uint online_lcpus;                    /* number of online logical cpus */
 764         uint smt_thrds;                       /* number of hardware threads that are running */
 765         u_longlong_t puser_spurr;             /* number of spurr cycles spent in user mode */
 766         u_longlong_t psys_spurr;              /* number of spurr cycles spent in kernel mode */
 767         u_longlong_t pidle_spurr;             /* number of spurr cycles spent in idle mode */
 768         u_longlong_t pwait_spurr;             /* number of spurr cycles spent in wait mode */
 769         int spurrflag;                        /* set if running in spurr mode */
 770         char hardwareid[CEC_ID_LEN];          /* CEC Identifier */
 771         uint power_save_mode;                 /* Power save mode for the LPAR. Introduced through LI 53K PRF : Feature 728 292*/
 772         ushort ame_version;                   /* AME Version */
 773         u_longlong_t true_memory;             /* True Memory Size in 4KB pages */
 774         u_longlong_t expanded_memory;         /* Expanded Memory Size in 4KB pages */
 775         u_longlong_t target_memexp_factr;     /* Target Memory Expansion Factor scaled by 100 */
 776         u_longlong_t current_memexp_factr;    /* Current Memory Expansion Factor scaled by 100 */
 777         u_longlong_t target_cpool_size;       /* Target Compressed Pool Size in bytes */
 778         u_longlong_t max_cpool_size;          /* Max Size of Compressed Pool in bytes */
 779         u_longlong_t min_ucpool_size;         /* Min Size of Uncompressed Pool in bytes */
 780         u_longlong_t ame_deficit_size;        /*Deficit memory size in bytes */
 781         u_longlong_t version;                 /* version number (1, 2, etc.,) */
 782         u_longlong_t cmcs_total_time;         /* Total CPU time spent due to active memory expansion */
 783         u_longlong_t purr_coalescing;         /* If the calling partition is authorized to see pool wide statistics then PURR cycles consumed to coalesce data else set to zero.*/
 784         u_longlong_t spurr_coalescing;        /* If the calling partition is authorized to see pool wide statistics then SPURR cycles consumed to coalesce data else set to zero.*/
 785         u_longlong_t MemPoolSize;             /* Indicates the memory pool size of the pool that the partition belongs to (in bytes)., mpsz */
 786         u_longlong_t IOMemEntInUse;           /* I/O memory entitlement of the LPAR in use in bytes. iomu */
 787         u_longlong_t IOMemEntFree;            /* free I/O memory entitlement in bytes.  iomf */
 788         u_longlong_t IOHighWaterMark;         /* high water mark of I/O memory entitlement usage in bytes. iohwn */
 789         u_longlong_t purr_counter;            /* number of purr cycles spent in user + kernel mode */
 790         u_longlong_t spurr_counter;           /* number of spurr cycles spent in user + kernel mode */
 791 
 792         /* Marketing Requirement(MR): MR1124083744  */
 793         u_longlong_t real_free;               /* free real memory (in 4KB pages) */
 794         u_longlong_t real_avail;              /* number of pages available for user application (memfree + numperm - minperm - minfree) */
 795         /*      >>>>> END OF STRUCTURE DEFINITION <<<<<         */
 796 #define CURR_VERSION_PARTITION_TOTAL 5        /* Incremented by one for every new release     *
 797                                                * of perfstat_partition_total_t data structure */
 798 } perfstat_partition_total_t_71_1;
 799 
 800 typedef union { /* WPAR Type & Flags */
 801         uint    w;
 802         struct {
 803                 unsigned app_wpar :1;        /* Application WPAR */
 804                 unsigned cpu_rset :1;        /* WPAR restricted to CPU resource set */
 805                 unsigned cpu_xrset:1;        /* WPAR restricted to CPU Exclusive resource set */
 806                 unsigned cpu_limits :1;      /* CPU resource limits enforced */
 807                 unsigned mem_limits :1;      /* Memory resource limits enforced */
 808                 unsigned spare :27;          /* reserved for future usage */
 809         } b;
 810 } perfstat_wpar_type_t;
 811 
 812 typedef struct { /* Workload partition Information AIX 5.3 & 6.1*/
 813        char name[MAXCORRALNAMELEN+1]; /* name of the Workload Partition */
 814        perfstat_wpar_type_t type;     /* set of bits describing the wpar */
 815        cid_t wpar_id;                 /* workload partition identifier */
 816        uint  online_cpus;             /* Number of Virtual CPUs in partition rset or  number of virtual CPUs currently online on the Global partition*/
 817        int   cpu_limit;               /* CPU limit in 100ths of % - 1..10000 */
 818        int   mem_limit;               /* Memory limit in 100ths of % - 1..10000 */
 819        u_longlong_t online_memory;    /* amount of memory currently online in Global Partition */
 820        int entitled_proc_capacity;    /* number of processor units this partition is entitled to receive */
 821 } perfstat_wpar_total_t_61;
 822 
 823 typedef struct { /* Workload partition Information AIX 7.1*/
 824        char name[MAXCORRALNAMELEN+1]; /* name of the Workload Partition */
 825        perfstat_wpar_type_t type;     /* set of bits describing the wpar */
 826        cid_t wpar_id;                 /* workload partition identifier */
 827        uint  online_cpus;             /* Number of Virtual CPUs in partition rset or  number of virtual CPUs currently online on the Global partition*/
 828        int   cpu_limit;               /* CPU limit in 100ths of % - 1..10000 */
 829        int   mem_limit;               /* Memory limit in 100ths of % - 1..10000 */
 830        u_longlong_t online_memory;    /* amount of memory currently online in Global Partition */
 831        int entitled_proc_capacity;    /* number of processor units this partition is entitled to receive */
 832        u_longlong_t version;          /* version number (1, 2, etc.,)                  */
 833 /*      >>>>> END OF STRUCTURE DEFINITION <<<<<         */
 834 #define CURR_VERSION_WPAR_TOTAL 1     /* Incremented by one for every new release      *
 835                                        * of perfstat_wpar_total_t data structure       */
 836 } perfstat_wpar_total_t_71;
 837 
 838 typedef void * rsethandle_t;  /* Type to identify a resource set handle: rsethandle_t */
 839 
 840 typedef enum { WPARNAME, WPARID, RSETHANDLE } wparid_specifier; /* Type of wparid_specifier */
 841 
 842 typedef struct { /* WPAR identifier */
 843         wparid_specifier spec;  /* Specifier to choose wpar id or name */
 844         union  {
 845                 cid_t wpar_id;                      /* WPAR ID */
 846                 rsethandle_t rset;                  /* Rset Handle */
 847                 char wparname[MAXCORRALNAMELEN+1];  /* WPAR NAME */
 848         } u;
 849         char name[IDENTIFIER_LENGTH]; /* name of the structure element identifier */
 850 } perfstat_id_wpar_t;
 851 
 852 
 853 
 854 // end: libperfstat.h (AIX 5.2, 5.3, 6.1, 7.1)
 855 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
 856 
 857 #define PERFSTAT_PARTITON_TOTAL_T_LATEST perfstat_partition_total_t_71_1/* latest perfstat_partition_total_t structure */
 858 #define PERFSTAT_CPU_TOTAL_T_LATEST perfstat_cpu_total_t_72             /* latest perfstat_cpu_total_t structure */
 859 #define PERFSTAT_WPAR_TOTAL_T_LATEST perfstat_wpar_total_t_71           /* latest perfstat_wpar_total_t structure */
 860 
 861 class libperfstat {
 862 
 863 public:
 864 
 865   // Load the libperfstat library (must be in LIBPATH).
 866   // Returns true if succeeded, false if error.
 867   static bool init();
 868   static void cleanup();
 869 
 870   // Direct wrappers for the libperfstat functionality. All they do is
 871   // to call the functions with the same name via function pointers.
 872   // Get all available data also on newer AIX versions (PERFSTAT_CPU_TOTAL_T_LATEST).
 873   static int perfstat_cpu_total(perfstat_id_t *name, PERFSTAT_CPU_TOTAL_T_LATEST* userbuff,
 874                                 int sizeof_userbuff, int desired_number);
 875 
 876   static int perfstat_memory_total(perfstat_id_t *name, perfstat_memory_total_t* userbuff,
 877                                    int sizeof_userbuff, int desired_number);
 878 
 879   static int perfstat_partition_total(perfstat_id_t *name, PERFSTAT_PARTITON_TOTAL_T_LATEST* userbuff,
 880                                       int sizeof_userbuff, int desired_number);
 881 
 882   static void perfstat_reset();
 883 
 884   static int perfstat_wpar_total(perfstat_id_wpar_t *name, PERFSTAT_WPAR_TOTAL_T_LATEST* userbuff,
 885                                  int sizeof_userbuff, int desired_number);
 886 
 887   static cid_t wpar_getcid();
 888 
 889 
 890   ////////////////////////////////////////////////////////////////
 891   // The convenience functions get_partitioninfo(), get_cpuinfo(), get_wparinfo() return
 892   // information about partition, cpu and wpars, respectivly. They can be used without
 893   // regard for which OS release we are on. On older AIX release, some output structure
 894   // members will be 0.
 895 
 896   // Result struct for get_partitioninfo().
 897   struct partitioninfo_t {
 898     // partition type info
 899     unsigned smt_capable :1;          /* OS supports SMT mode */
 900     unsigned smt_enabled :1;          /* SMT mode is on */
 901     unsigned lpar_capable :1;         /* OS supports logical partitioning */
 902     unsigned lpar_enabled :1;         /* logical partitioning is on */
 903     unsigned shared_capable :1;       /* OS supports shared processor LPAR */
 904     unsigned shared_enabled :1;       /* partition runs in shared mode */
 905     unsigned dlpar_capable :1;        /* OS supports dynamic LPAR */
 906     unsigned capped :1;               /* partition is capped */
 907     unsigned kernel_is_64 :1;         /* kernel is 64 bit */
 908     unsigned pool_util_authority :1;  /* pool utilization available */
 909     unsigned donate_capable :1;       /* capable of donating cycles */
 910     unsigned donate_enabled :1;       /* enabled for donating cycles */
 911     unsigned ams_capable:1;           /* 1 = AMS(Active Memory Sharing) capable, 0 = Not AMS capable */
 912     unsigned ams_enabled:1;           /* 1 = AMS(Active Memory Sharing) enabled, 0 = Not AMS enabled */
 913     unsigned power_save:1;            /* 1 = Power saving mode is enabled */
 914     unsigned ame_enabled:1;           /* Active Memory Expansion is enabled */
 915     // partition total info
 916     int online_cpus;                  /* number of virtual CPUs currently online on the partition */
 917     int entitled_proc_capacity;       /* number of processor units this partition is entitled to receive */
 918     int var_proc_capacity_weight;     /* partition priority weight to receive extra capacity */
 919     int phys_cpus_pool;               /* number of the physical CPUs currently in the shared processor pool this partition belong to */
 920     int pool_id;                      /* identifier of the shared pool of physical processors this partition is a member of */
 921     u_longlong_t entitled_pool_capacity;  /* Entitled processor capacity of partitions pool */
 922     char name[IDENTIFIER_LENGTH];     /* name of the logical partition */
 923 
 924     u_longlong_t timebase_last;       /* most recently cpu time base (an incremented long int on PowerPC) */
 925     u_longlong_t pool_idle_time;      /* pool idle time = number of clock tics a processor in the shared pool was idle */
 926     u_longlong_t pcpu_tics_user;      /* raw number of physical processor tics in user mode */
 927     u_longlong_t pcpu_tics_sys;       /* raw number of physical processor tics in system mode */
 928     u_longlong_t pcpu_tics_idle;      /* raw number of physical processor tics idle */
 929     u_longlong_t pcpu_tics_wait;      /* raw number of physical processor tics waiting for I/O */
 930 
 931     u_longlong_t true_memory;          /* True Memory Size in 4KB pages */
 932     u_longlong_t expanded_memory;      /* Expanded Memory Size in 4KB pages */
 933     u_longlong_t target_memexp_factr;  /* Target Memory Expansion Factor scaled by 100 */
 934     u_longlong_t current_memexp_factr; /* Current Memory Expansion Factor scaled by 100 */
 935     u_longlong_t cmcs_total_time;      /* Total CPU time spent due to active memory expansion */
 936   };
 937 
 938   // Result struct for get_cpuinfo().
 939   struct cpuinfo_t {
 940     char description[IDENTIFIER_LENGTH];  // processor description (type/official name)
 941     u_longlong_t processorHZ;             // processor speed in Hz
 942     int ncpus;                            // number of active logical processors
 943     double loadavg[3];                    // (1<<SBITS) times the average number of runnables processes during the last 1, 5 and 15 minutes.
 944                                           // To calculate the load average, divide the numbers by (1<<SBITS). SBITS is defined in <sys/proc.h>.
 945     char version[20];                     // processor version from _system_configuration (sys/systemcfg.h)
 946     unsigned long long user_clock_ticks;  // raw total number of clock ticks spent in user mode
 947     unsigned long long sys_clock_ticks;   // raw total number of clock ticks spent in system mode
 948     unsigned long long idle_clock_ticks;  // raw total number of clock ticks spent idle
 949     unsigned long long wait_clock_ticks;  // raw total number of clock ticks spent waiting for I/O
 950   };
 951 
 952   // Result struct for get_wparinfo().
 953   struct wparinfo_t {
 954     char name[MAXCORRALNAMELEN+1];  /* name of the Workload Partition */
 955     unsigned short wpar_id;         /* workload partition identifier */
 956     unsigned app_wpar :1;           /* Application WPAR */
 957     unsigned cpu_rset :1;           /* WPAR restricted to CPU resource set */
 958     unsigned cpu_xrset:1;           /* WPAR restricted to CPU Exclusive resource set */
 959     unsigned cpu_limits :1;         /* CPU resource limits enforced */
 960     unsigned mem_limits :1;         /* Memory resource limits enforced */
 961     int cpu_limit;                  /* CPU limit in 100ths of % - 1..10000 */
 962     int mem_limit;                  /* Memory limit in 100ths of % - 1..10000 */
 963   };
 964 
 965   static bool get_partitioninfo(partitioninfo_t* ppi);
 966   static bool get_cpuinfo(cpuinfo_t* pci);
 967   static bool get_wparinfo(wparinfo_t* pwi);
 968 
 969 };
 970 
 971 #endif // OS_AIX_VM_LIBPERFSTAT_AIX_HPP