A fix is available
APAR status
Closed as program error.
Error description
In the topas PAGING area, if the statistics is displayed with a K, the K is never cleared, and therefore gives the appearance of a very large number when it's really trying to display a small number.
Local fix
Problem summary
. In the topas PAGING area, if the statistics is displayed with a K, the K is never cleared, and therefore gives the appearance of a very large number when it's really trying to display a small number. Also we are sending a 'long long' or 'double' type vaule to a function which can receives only 'long' type value, this can cause showing up an undefined statistics value.
Problem conclusion
. topas.h defines: . struct sysinfoData { longlong_t s_pagexct; /* Mem/Virt/pagexct save */ longlong_t pagexct; /* Mem/Virt/pagexct */ longlong_t s_vMemSteal; /* Mem/Virt/steal save */ longlong_t vMemSteal; /* Mem/Virt/steal */ longlong_t s_vMemPgspgin; /* Mem/Virt/pgspgin save */ longlong_t vMemPgspgin; /* Mem/Virt/pgspgin */ longlong_t s_vMemPgspgout; /* Mem/Virt/pgspgout save */ longlong_t vMemPgspgout; /* Mem/Virt/pgspgout */ longlong_t s_vMemPagein; /* Mem/Virt/pagein save */ longlong_t vMemPagein; /* Mem/Virt/pagein */ longlong_t s_vMemPageout; /* Mem/Virt/pageout save */ longlong_t vMemPageout; /* Mem/Virt/pageout */ longlong_t s_vMemSio; /* Mem/Virt/sio save */ longlong_t vMemSio; /* Mem/Virt/sio */ longlong_t PagSpPerTotalused; /* PagSp/%totalused */ longlong_t PagSpPerTotalfree; /* PagSp/%totalfree */ longlong_t PagSpTotalsize; /* PagSp/totalsize */ longlong_t memRealSize; /* Mem/Real/size */ longlong_t memRealPerComp; /* Mem/Real/%comp */ longlong_t memRealPerNoncomp; /* Mem/Real/%noncomp */ longlong_t memRealPerClnt; /* Mem/Real/%clnt */ longlong_t memRealNumClnt; /* Mem/Real/Num/%clnt */ longlong_t s_procPswitch; /* Proc/pswitch save XXX */ longlong_t procPswitch; /* Proc/pswitch XXX */ longlong_t s_sysSyscall; /* Syscall/total XXX save */ longlong_t sysSyscall; /* Syscall/total XXX */ longlong_t s_sysRead; /* Syscall/read XXX save */ longlong_t sysRead; /* Syscall/read XXX */ longlong_t s_sysWrite; /* Syscall/write XXX save */ longlong_t sysWrite; /* Syscall/write XXX */ longlong_t s_sysFork; /* Syscall/fork XXX save */ longlong_t sysFork; /* Syscall/fork XXX */ longlong_t s_sysExec; /* Syscall/exec XXX save */ longlong_t sysExec; /* Syscall/exec XXX */ longlong_t s_procRQ; /* Proc/runque XXX save */ longlong_t procRQ; /* Proc/runque XXX */ longlong_t s_procSQ; /* Proc/swpque XXX save */ longlong_t procSQ; /* Proc/swpque XXX */ longlong_t s_sysIOReadch; /* SysIO/readch XXX save */ longlong_t sysIOReadch; /* SysIO/readch XXX */ longlong_t s_sysIOWritech; /* SysIO/writech XXX save */ longlong_t sysIOWritech; /* SysIO/writech XXX */ longlong_t s_sysIOTtyraw; /* SysIO/ttyraw XXX save */ longlong_t sysIOTtyraw; /* SysIO/ttyraw XXX */ longlong_t s_sysIOTtyout; /* SysIO/ttyout XXX save */ longlong_t sysIOTtyout; /* SysIO/ttyout XXX */ longlong_t s_fsIgets; /* FS/iget save */ longlong_t fsIgets; /* FS/iget */ longlong_t s_fsNamei; /* FS/namei save */ longlong_t fsNamei; /* FS/namei */ longlong_t s_fsDirblk; /* FS/dirblk save */ longlong_t fsDirblk; /* FS/dirblk */ ulong_t s_nfsSv2Calls; /* NFS/Server/v2calls save */ ulong_t nfsSv2Calls; /* NFS/Server/v2calls */ ulong_t s_nfsCv2Calls; /* NFS/Client/v2calls save */ ulong_t nfsCv2Calls; /* NFS/Client/v2calls */ ulong_t s_nfsSv3Calls;/* NFS/Server/v3calls save */ ulong_t nfsSv3Calls; /* NFS/Server/v3calls */ ulong_t s_nfsCv3Calls; /* NFS/Client/v3calls save */ ulong_t nfsCv3Calls; /* NFS/Client/v3calls */ longlong_t memNumPerm; /*Num/Perm */ longlong_t memNumFrb; /* Num/Frb */ longlong_t pageSizePerTotal; /* Total/Page/Size */ longlong_t pageFreeTotal; /* Page/Free */ longlong_t pagePerUsed; /*Page/% Used */ longlong_t pagePerFree; /*Page/% Free */ }; . Note here that all the statistics are of type either 'long long int' (8 bytes) or 'unsigned long', that means they can't be accomodated into a long type variable. But see this: . topas.h defines: typedef struct { int line; int col; void (*fun) (long, int, int); <--- note : - pointer to a funtion that receives a LONG and 2 int variable, float mul; } where; . global.c defines: where prt1 = { {11, 56, p7, 1.0}, {12, 56, p7, 1.0}, {13, 56, p7, 1.0}, {14, 56, p7, 1.0}, {15, 56, p7, 1.0}, {16, 56, p7, 1.0}, {17, 56, p7, 1.0}, {17, 74, p41, 10.0}, {18, 74, p41, 10.0}, {16, 74, p6d4k, 1.0}, {10, 74, p6d4k, 1.0}, {11, 74, p41, 10.0}, {12, 74, p41, 10.0}, {13, 74, p41, 10.0}, {5, 72, p8l, 1.0}, {6, 72, p8l, 1.0}, {7, 72, p8l, 1.0}, {20, 55, p8l, 1.0}, {21, 55, p8l, 1.0}, {22, 55, p8l, 1.0}, {23, 55, p8l, 1.0} }; . global.h declares: ----------------- void p7(long val, int line, int row); void p41(long val, int line, int row); void p6d4k(long val, int line, int row); void p8l(long val, int line, int row); . Here are we used the ptr1 arrays: topas.c: prt1 14 .fun(sysData.fsIgets/etime,prt1 14 .line, prt1 14 .col); topas.c: prt1 15 .fun(sysData.fsNamei/etime,prt1 15 .line, prt1 15 .col); topas.c: prt1 16 .fun(sysData.fsDirblk/etime,prt1 16 .line, prt1 16 .col); topas.c: prt1 7 .fun(sysData.pagePerUsed,prt1 7 .line, prt1 7 .col); topas.c: prt1 8 .fun(sysData.pagePerFree,prt1 8 .line, prt1 8 .col); topas.c: prt1 9 .fun(sysData.pageSizePerTotal,prt1 9 .line, prt1 9 .col); topas.c: prt1 10 .fun(sysData.memRealSize,prt1 10 .line, prt1 10 .col); topas.c: prt1 11 .fun(sysData.memRealPerComp,prt1 11 .line, prt1 11 .col); topas.c: prt1 12 .fun(sysData.memRealPerNoncomp,prt1 12 .line, prt1 12 .col); topas.c: prt1 13 .fun(sysData.memRealPerClnt,prt1 13 .line, prt1 13 .col); topas.c: prt1 0 .fun(sysData.pagexct/etime,prt1 0 .line, prt1 0 .col); topas.c: prt1 1 .fun(sysData.vMemSteal/etime,prt1 1 .line, prt1 1 .col); topas.c: prt1 2 .fun(sysData.vMemPgspgin/etime,prt1 2 .line, prt1 2 .col); topas.c: prt1 3 .fun(sysData.vMemPgspgout/etime,prt1 3 .line, prt1 3 .col); topas.c: prt1 4 .fun(sysData.vMemPagein/etime,prt1 4 .line, prt1 4 .col); topas.c: prt1 5 .fun(sysData.vMemPageout/etime,prt1 5 .line, prt1 5 .col); topas.c: prt1 6 .fun(sysData.vMemSio/etime,prt1 6 .line, prt1 6 .col); topas.c: prt1 10 .fun(sysData.memRealSize * memhardlim,prt1 10 .line, prt1 10 .col); topas.c: prt1 17 .fun(sysData.nfsSv2Calls/etime,prt1 17 .line, prt1 17 .col); topas.c: prt1 18 .fun(sysData.nfsCv2Calls/etime,prt1 18 .line, prt1 18 .col); topas.c: prt1 19 .fun(sysData.nfsSv3Calls/etime,prt1 19 .line, prt1 19 .col); topas.c: prt1 20 .fun(sysData.nfsCv3Calls/etime,prt1 20 .line, prt1 20 .col); . topas.c defines the funtions p7 and p7100: . void p7(long val, int line, int row) { if(val > 99999){ p7100((longlong_t)val,line, row); return; } move(line, row); printw("%7ld", val); } . void p7100(longlong_t val, int line, int row) { double v = val / 1024.0; . if(v > 9999.0){ p71000(v,line, row); return; } move(line, row); printw("%7.1fK", v); } . So basically we are sending a 'long long' or 'double' type value to the p7 function, but it can hold only a long value. The fix is changing the first argument type of the funtions p7, p41, p6d4k and p8l as to 'long long int'. These funcitons are called through the function pointer defined in the sytructure name 'where' hence we need to change this structure as well. Also to fix 'the K coming after the PAGING area and never cleared issue' we should reduce the column by one character to accomodate K/M/G/T. This should be done on the funtion p7100.
Temporary fix
Comments
APAR Information
APAR number
IZ98559
Reported component name
AIX V7.1
Reported component ID
5765H4000
Reported release
710
Status
CLOSED PER
PE
NoPE
HIPER
NoHIPER
Submitted date
2011-04-07
Closed date
2011-04-07
Last modified date
2013-04-16
APAR is sysrouted FROM one or more of the following:
APAR is sysrouted TO one or more of the following:
Fix information
Fixed component name
AIX V7.1
Fixed component ID
5765H4000
Applicable component levels
R710 PSY U838083
UP11/10/05 I 1000
PTF to Fileset Mapping
U838083 bos.perf.tools 7.1.1.0
[{"Business Unit":{"code":"BU054","label":"Systems w\/TPS"},"Product":{"code":"SSMV87","label":"AIX 6.1 Enterprise Edition"},"Component":"","ARM Category":[],"Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"710","Edition":"","Line of Business":{"code":"LOB08","label":"Cognitive Systems"}},{"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSMVAX","label":"AIX Express Edition"},"Component":"","ARM Category":[],"Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"710","Edition":"","Line of Business":{"code":"LOB08","label":"Cognitive Systems"}},{"Business Unit":{"code":"BU054","label":"Systems w\/TPS"},"Product":{"code":"SG11R","label":"AIX 7.1 HIPERS, APARs and Fixes"},"Component":"","ARM Category":[],"Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"710","Edition":"","Line of Business":{"code":"","label":""}}]
Document Information
Modified date:
16 April 2013