1 /*
2  * Copyright (c) 2012, 2018 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     unsigned long long user_clock_ticks;  // raw total number of clock ticks spent in user mode
946     unsigned long long sys_clock_ticks;   // raw total number of clock ticks spent in system mode
947     unsigned long long idle_clock_ticks;  // raw total number of clock ticks spent idle
948     unsigned long long wait_clock_ticks;  // raw total number of clock ticks spent waiting for I/O
949   };
950 
951   // Result struct for get_wparinfo().
952   struct wparinfo_t {
953     char name[MAXCORRALNAMELEN+1];  /* name of the Workload Partition */
954     unsigned short wpar_id;         /* workload partition identifier */
955     unsigned app_wpar :1;           /* Application WPAR */
956     unsigned cpu_rset :1;           /* WPAR restricted to CPU resource set */
957     unsigned cpu_xrset:1;           /* WPAR restricted to CPU Exclusive resource set */
958     unsigned cpu_limits :1;         /* CPU resource limits enforced */
959     unsigned mem_limits :1;         /* Memory resource limits enforced */
960     int cpu_limit;                  /* CPU limit in 100ths of % - 1..10000 */
961     int mem_limit;                  /* Memory limit in 100ths of % - 1..10000 */
962   };
963 
964   static bool get_partitioninfo(partitioninfo_t* ppi);
965   static bool get_cpuinfo(cpuinfo_t* pci);
966   static bool get_wparinfo(wparinfo_t* pwi);
967 };
968 
969 #endif // OS_AIX_VM_LIBPERFSTAT_AIX_HPP
970