Performance Co-Pilot and IRIX
=============================

This document describes all the interfaces used by:

  - irix/lib/libirixpmda
  - eoe/cmd/pmdas/proc

to extract metrics from IRIX. Note that the same source tree can be used to 
export metrics in 6.2, 6.3, 6.4 and 6.5. The macros IRIX6_X are used to
isolate code specific to one or more versions of IRIX.

----------------------------------------------------------------------------
The main functions used are:

sysmp()
syssgi()
sysget()
sysinfo()
attrget()
ioctl()
kmemread()

The less common functions used are:

getinvent()
scaninvent()
swapctl()
nftw()
setutent()
getutent()
mmap()
----------------------------------------------------------------------------

Use of the functions:

sysmp():
  MP_SAGET: MPSA_BUFINFO, MPSA_EFS, MPSA_TCPIPSTATS, MPSA_LPGSTATS, MPSA_MINFO,
            MPSA_NCSTATS, MPSA_CLSTAT3, MPSA_SVSTAT3, MPSA_CLSTAT, MPSA_SVSTAT,
            MPSA_NODEINFO, MPSA_RCSTAT, MPSA_RSSTAT, MPSA_SOCKSTATS, MPSA_SERR,
            MPSA_SINFO, MPSA_RMINFO, MPSA_VOPINFO, MPS_XFSSTATS
  MP_SAGET1: MPSA_SINFO
  MP_NPROCS
  MP_NUMNODES
  MP_KERNADDR: MPKA_MSGINFO, MPKA_MSG, MPKA_SEMINFO, MPKA_SEM, MPKA_SHMINFO,
               MPKA_SHM, MPKA_AVENRUN, MPKA_VAR 
  MP_SASZ: MPSA_NODE_INFO
  MP_SHMSTAT
  MP_PGSIZE

syssgi():
  SGI_DBA_GETSTATS
  SGI_KAIO_STATS
  SGI_EVENTCTR:  HWPERF_GET_SYSCNTRS, HWPERF_GET_SYSEVCTRL
  SGI_NUMA_STATS_GET
  SGI_XLV_ATTR_CURSOR
  SGI_XLV_ATTR_GET
  SGI_XLV_ATTR_SET

  (in hinv-* files)
  SGI_GET_EVCONF
  SGI_IO_SHOW_AUX_INFO

sysget():
  SGT_SINFO
  SGT_MSGQUEUE
  SGT_KSYM: KSYM_VAR, KSYM_AVENRUN, KSYM_MSGINFO,
            KSYM_VN_VNUMBER, KSYM_VN_EPOCH, KSYM_VN_NFREE
  (uses SGT_COOKIE_SET_KSYM to get KSYM variants)

sysinfo():
  _MIPS_SI_PROCESSORS

attrget():
  INFO_LBL_DKIOTIME
  INFO_LBL_DETAIL_INVENT

  (in hinv-* files)
  INFO_LBL_NIC
  INFO_LBL_DETAIL_INVENT

ioctl():
  SNODRV_GET_HUBINFO
  GETSTRUCTSIZE
  ROUTERINFO_GETINFO
  XB_GET_VERSION
  XB_ENABLE_MPX_MODE
  XB_START_TIMER
  XB_STOP_TIMER

  (in proc files)
  PIOCACINFO
  PIOCNMAP
  PIOCMAP_SGI
  PIOCCRED
  PIOCPSINFO
  PIOCSTATUS
  PIOCUSAGE

----------------------------------------------------------------------------

irix/lib/libirixpmda/aio.c
--------------------------

irix.kaio.*
	syssgi(SGI_DBA_GETSTATS, &kaio_statbuf, sizeof(kaio_statbuf), -1);
	-- -1 => summed accross all of the per CPU structure instances
	- IRIX 6.5

	syssgi(SGI_KAIO_STATS, &kaio_statbuf, sizeof(kaio_statbuf));
	- other IRIXs

        Note: kaio_statbuf is defined in aio.c as irix/kern/sys/kaio.h
	      is not exported in ROOT

        Gets values for async I/O metrics directly out of dba_stat_t 
	record (<sys/dbacc.h> in IRIX 6.5).

irix/lib/libirixpmda/alldk.c
----------------------------

irix.disk.all.*
	See spindle.c


irix/lib/libirixpmda/cntrl.c
----------------------------

irix.disk.cnt.*
	See spindle.c


irix/lib/libirixpmda/disk.c
---------------------------

irix.disk.dev.*
irix.xpc.disk.dev.*
hinv.map.disk
hinv.disk_sn
	See spindle.c

irix/lib/libirixpmda/engr.c
---------------------------

irix.engr.*
	No longer supported, was kmem read of kernsymb[KS_ENGR]

irix/lib/libirixpmda/evctr.c
----------------------------

hw.r10kevctr.*
	sysinfo(_MIPS_SI_PROCESSORS, buf, sizeof(buf));
	- Determine the type of CPUs
	- Is it r10K or not
	syssgi(SGI_EVENTCTR, HWPERF_GET_SYSCNTRS, (void *)&Count));
	- Retrieve counts
	syssgi(SGI_EVENTCTR, HWPERF_GET_SYSEVCTRL, &evctr_args_get));
	- Get global counter state <sys/hwperfmacros.h>

irix/lib/libirixpmda/filesys.c
------------------------------

irix.filesys.*
	statfs();

irix/lib/libirixpmda/getblkstats.c
----------------------------------

irix.resource.buffer_cache.*
	sysmp(MP_SAGET, MPSA_BUFINFO, &getblkstats, sizeof(struct getblkstats));

irix/lib/libirixpmda/hinv.c
---------------------------

hinv.* (majority)
	getinvent();

irix/lib/libirixpmda/hubstat.c
------------------------------

irix.hub.*
	ioctl(np->hubfd, SN0DRV_GET_HUBINFO, &(np->hub));
	-- np->hub is of type hubstat_t <sys/SN0/hubstat.h>[6.4]
					<sys/SN/SN0/hubstat.h>[6.5]


irix/lib/libirixpmda/hwrouter.c
-------------------------------

hinv.nrouter
hinv.map.router.*
hinv.nrport
hinv.map.rport
hinv.interconnect
hw.router.*
	ioctl(fd, GETSTRUCTSIZE);
	ioctl(fd, ROUTERINFO_GETINFO, r->stats);
	r->stats of type router_info_t <sys/SN0/router.h>[6.4]
	                               <sys/SN/router.h>[6.5]

irix/lib/libirixpmda/if.c
-------------------------

irix.network.interface.*
	kmemread(offset, &ifp, sizeof(struct ifnet *));
	- kernsymb[KS_IFNET]

irix/lib/libirixpmda/igetstats.c
--------------------------------

irix.resource.efs.*
	sysmp(MP_SAGET, MPSA_EFS, &igetstats, sizeof(struct igetstats));

irix/lib/libirixpmda/irix.c
---------------------------
	sysget(SGT_SINFO, (char *)&info, sizeof(info), SGT_INFO, &ck)
	-- get the number of cells (_pm_numcells = info.si_num)

irix/lib/libirixpmda/kna.c
--------------------------

irix.network.tcp.*
irix.network.icmp.*
irix.network.igmp.*
irix.network.ip.*
irix.network.udp.*
irix.network.mbuf.*
irix.network.mcr.*
	sysmp(MP_SAGET, MPSA_TCPIPSTATS, &kna, sizeof(struct kna));

irix/lib/libirixpmda/lpage.c
----------------------------

irix.mem.lpage.*
	sysmp(MP_SAGET, MPSA_LPGSTATS, &lpage, sizeof(lpage));

irix/lib/libirixpmda/minfo.c
----------------------------

irix.mem.* (other than those exported by lpage.c and sysmp.c)
	sysmp(MP_SAGET, MPSA_MINFO, &minfo, sizeof(minfo));

irix/lib/libirixpmda/msg.c
--------------------------

irix.ipc.msg.*
	sysmp(MP_KERNADDR, MPKA_MSGINFO));
	kmemread(msginfo_addr, &msginfo, (int)sizeof(msginfo));
	sysmp(MP_KERNADDR, MPKA_MSG);
	kmemread(msgds_addr, msgds, msginfo.msgmni * (int)sizeof(struct msqid_ds *));
	- IRIX 6.2, 6.3, 6.4
	SGT_COOKIE_INIT(&ck);
	SGT_COOKIE_SET_KSYM(&ck, KSYM_MSGINFO);
	sysget(SGT_KSYM, (char *)&msginfo, (int)sizeof(msginfo), SGT_READ, &ck);
	-- msginfo of type msginfo <sys/msg.h>
	sysget(SGT_MSGQUEUE, (char *)msgds_instance, msginfo.msgmni * (int)sizeof(struct msqid_ds *), SGT_READ, &ck);
	- IRIX 6.5

irix/lib/libirixpmda/ncstats.c
------------------------------

irix.resource.name_cache.*
	sysmp(MP_SAGET, MPSA_NCSTATS, &ncstats, sizeof(struct ncstats));

irix/lib/libirixpmda/nfs3_client.c
----------------------------------

irix.nfs3.client.*
	sysmp(MP_SAGET, MPSA_CLSTAT3, &clstat, sizeof(clstat));

irix/lib/libirixpmda/nfs3_server.c
----------------------------------

irix.nfs3.server.*
	sysmp(MP_SAGET, MPSA_SVSTAT3, &svstat, sizeof(svstat));

irix/lib/libirixpmda/nfs_client.c
---------------------------------

irix.nfs.client.*
	sysmp(MP_SAGET, MPSA_CLSTAT, &clstat, sizeof(clstat));


irix/lib/libirixpmda/nfs_server.c
---------------------------------

irix.nfs.server.*
	sysmp(MP_SAGET, MPSA_SVSTAT, &svstat, sizeof(svstat));

irix/lib/libirixpmda/nodeinfo.c
-------------------------------

irix.node.*
	sysmp(MP_NUMNODES);
	-- get number of nodes
	sysmp(MP_SASZ, MPSA_NODE_INFO);
	-- get node-info record size
	-- allocate n_nodes*node_infosz
	sysmp(MP_SAGET, MPSA_NODE_INFO, (char *)node_info, num_info * node_infosz);
	-- get node-info records

irix/lib/libirixpmda/numa_node.c
--------------------------------

irix.numa.*
	syssgi(SGI_NUMA_STATS_GET, node->hwgname, &node->numa);
	-- gets num_stats_t record <sys/numa_stats.h>

irix/lib/libirixpmda/rpc_client.c
---------------------------------

irix.rpc.client.*
	sysmp(MP_SAGET, MPSA_RCSTAT, &rcstat, sizeof(rcstat));

irix/lib/libirixpmda/rpc_server.c
---------------------------------

irix.rpc.server.*
	sysmp(MP_SAGET, MPSA_RSSTAT, &rsstat, sizeof(rsstat));

irix/lib/libirixpmda/sem.c
--------------------------

irix.ipc.sem.*
	sysmp(MP_KERNADDR, MPKA_SEMINFO);
	kmemread(seminfo_addr, &seminfo, (int)sizeof(seminfo));
	sysmp(MP_KERNADDR, MPKA_SEM);
	kmemread(semds_addr, semds, seminfo.semmni * (int)sizeof(struct semid_ds *))
	- IRIX 6.2, 6.3, 6.4
	SGT_COOKIE_INIT(&ck);
	SGT_COOKIE_SET_KSYM(&ck, KSYM_SEMINFO);
	sysget(SGT_KSYM, (char *)&seminfo, (int)sizeof(seminfo), SGT_READ, & ck);
	sysget(SGT_SEM, (char *)semds_instance, seminfo.semmni * (int)sizeof(struct semid_ds *), SGT_READ, &ck);
	- IRIX 6.5

irix/lib/libirixpmda/shm.c
--------------------------

irix.ipc.shm.*
	see shm_kmem.c

irix/lib/libirixpmda/shm_kmem.c
-------------------------------

	sysmp(MP_KERNADDR, MPKA_SHMINFO);
	-- get shminfo_addr
	kmemread(shminfo_addr, &shminfo, (int)sizeof(shminfo));

	sysmp(MP_KERNADDR, MPKA_SHM)
	-- get shmds_addr (shm seg table)
	kmemread(shmds_addr, shmds, max_shm_inst * (int)sizeof(struct shmid_ds *));

	kmemread((off_t)shmds[i], &probe, (int)sizeof(struct shmid_ds));
	- IRIX 6.2 and 6.3
	sysmp(MP_SHMSTAT, &shmstat, sizeof(struct shmstat));
	- IRIX 6.4 and 6.5


irix/lib/libirixpmda/socket.c
-----------------------------

irix.network.socket.*
	sysmp(MP_SAGET, MPSA_SOCKSTATS, &sockinfo, sizeof(sockinfo));

irix/lib/libirixpmda/spindle.c
------------------------------

	dsopen(sname, O_RDONLY);
	fillg0cmd(dsp, (uchar_t *)CMDBUF(dsp), G0_INQU, 0, 0, 0, B1(sizeof(inqbuf)), B1(0));
	filldsreq(dsp, (uchar_t *)inqbuf, sizeof(inqbuf), DSRQ_READ|DSRQ_SENSE);
	doscsireq(getfd(dsp), dsp);
	dsclose(dsp);
	- ALL versions of IRIX

	kmemread(s[i].s_iotime_addr, &iotim, sizeof(iotim));
	kmemread(kernsymb[KS_DKSCINFO].n_value, &dkscinfo, sizeof(dkscinfo));
	kmemread(kernsymb[KS_DKIOTIME].n_value, dksciotime, dksciotimesz);
	kmemread((__psunsigned_t)dksciotime[c], &thisiot, sizeof(thisiot));
	kmemread(kernsymb[KS_USRAID_SOFTC].n_value, usraid_softc, sizeof(usraid_softc));
	kmemread(kernsymb[KS_USRAID_INFO].n_value, &usraid_info, sizeof(usraid_info));
	- IRIX 6.2 and 6.3

	attr_get((char *)s[i].s_hwgname, INFO_LBL_DKIOTIME, (char *)&iotim, &dkiotimesz, 0);
	-- gets the the disk metrics out of the iotime struct <sys/elog.h>.
	scaninvent((int (*)()) spindle_volume_filter, (void *)NULL);
	- IRIX 6.4 and 6.5



irix/lib/libirixpmda/swap.c
---------------------------

irix.swapdev.*
irix.swap.{free,length,maxswap,vlength,alloc,reserve,used,unused}
	swapctl(SC_LIST, swaptable);
	swapctl(SC_GETNSWP, (int *)NULL);

irix/lib/libirixpmda/syserr.c
-----------------------------

irix.resource.fileovf
irix.resource.procovf
	sysmp(MP_SAGET, MPSA_SERR, &syserr, sizeof(struct syserr));

irix/lib/libirixpmda/sysinfo.c
------------------------------

irix.swap.* (other than those exported in swap.c)
irix.kernel.all.* (except load and users)
irix.xpc.kernel.all.*
	sysmp(MP_SAGET, MPSA_SINFO, &sysinfo, sizeof(sysinfo));

irix/lib/libirixpmda/sysinfo_mp.c
---------------------------------

irix.kernel.percpu.*
irix.xpc.kernel.percpu.*
	sysmp(MP_NPROCS);

	getinvent()
	- IRIX 6.2 and 6.3
	attr_get((char *)p, INFO_LBL_DETAIL_INVENT, info, &len, 0);
	-- info typecast to (invent_generic_t *)info) to get ig_invclass
	   and (invent_cpuinfo_t *) to get cpu_invent fields
	nftw(_PATH_HWGFS, percpu_filter, MAX_WALK_DEPTH, FTW_PHYS);
	- IRIX 6.4 and 6.5
	sysmp(MP_SAGET1, MPSA_SINFO, &sysinfo, sizeof(sysinfo), physcpu);
	- All IRIX versions

	sysmp(MP_SAGET1, MPSA_SINFO, &cpus[c].sysinfo, sizeof(sysinfo), cpus[c].map)
	-- fetch the cpus info

irix/lib/libirixpmda/sysmp.c
----------------------------

irix.kernel.all.load
	sysmp(MP_KERNADDR, MPKA_AVENRUN);
	kmemread(addr, &load, sizeof(load));
	- IRIX 6.2, 6.3, 6.4
	SGT_COOKIE_INIT(&ck);
	SGT_COOKIE_SET_KSYM(&ck, KSYM_AVENRUN);
	sysget(SGT_KSYM, (char *)load, sizeof(load), SGT_READ | SGT_SUM, &ck);
	- IRIX 6.5

irix.kernel.all.users
	setutent();
	getutent();

irix.mem.{freemem,availsmem,availrmem,bufmem,physmem,dchunkpages,pmapmem,
          strmem,chunkpages,dpages,emptymem,emptymem}
	sysmp(MP_SAGET, MPSA_RMINFO, &rminfo, sizeof(rminfo));

hinv.ncpu
	sysmp(MP_NPROCS);

irix/lib/libirixpmda/var.c
--------------------------

irix.resource.{nproc,nbuf,hbuf,syssegsz,maxpmem,maxdmasz,dquot,nstream_queue,
               nstream_head}
	sysmp(MP_KERNADDR, MPKA_VAR);
	kmemread(kaddr, &var, sizeof(struct var);
	- IRIX 6.2, 6.3, 6.4
	SGT_COOKIE_INIT(&ck);
	SGT_COOKIE_SET_KSYM(&ck, KSYM_VAR);
	sysget(SGT_KSYM, (char *)&var, sizeof(struct var), SGT_READ, &ck);
	- IRIX 6.5

	sysmp(MP_PGSIZE)
	- all versions

irix/lib/libirixpmda/vnodestats.c
---------------------------------

irix.resource.vnodes.*
	sysmp(MP_SAGET, MPSA_VOPINFO, &vnodestats, sizeof(struct vnodestats));
	- get data from vnodestats <sys/ksa.h>
	- All IRIX versions
	kmemread(offset, &vn_vnumber, sizeof(vn_vnumber));
	kmemread(offset, &vn_epoch, sizeof(vn_epoch));
	kmemread(offset, &vn_nfree, sizeof(vn_nfree));
	- IRIX 6.2, 6.3, 6.4
	SGT_COOKIE_INIT(&ck);
	SGT_COOKIE_SET_KSYM(&ck, KSYM_VN_VNUMBER);
	sysget(SGT_KSYM, (char *)&vn_vnumber, sizeof(vn_vnumber), SGT_READ, &ck);
	SGT_COOKIE_SET_KSYM(&ck, KSYM_VN_EPOCH);
	sysget(SGT_KSYM, (char *)&vn_epoch, sizeof(vn_epoch), SGT_READ, &ck);
	SGT_COOKIE_SET_KSYM(&ck, KSYM_VN_NFREE);
	sysget(SGT_KSYM, (char *)&vn_nfree, sizeof(vn_nfree), SGT_READ, &ck);
	- IRIX 6.5

irix/lib/libirixpmda/xbow.c
---------------------------

hinv.nxbow
hinv.map.xbow
irix.xbow.*
	ioctl(xb_ptr->devfd, XB_GET_VERSION, &xbVersion);
	-- test have correct xb version
	ioctl(xb_ptr->devfd, XB_ENABLE_MPX_MODE, 0);
	ioctl(xb_ptr->devfd, XB_START_TIMER, 0);
	mmap(0,sizeof(xb_vcntr_block_t),PROT_READ,MAP_PRIVATE,xb_ptr->devfd,0);
	munmap((caddr_t) xb_ptr->block, sizeof(xb_vcntr_block_t));
	-- data retrieved through memory-map (onto type _pm_xbow in "xbow.h")
	
irix/lib/libirixpmda/xfs.c
--------------------------

irix.xfs.*
	sysmp(MP_SAGET, MPSA_XFSSTATS, &xfsstats, sizeof(xfsstats));
	- get data from xfsstats <sys/ksa.h>

irix/lib/libirixpmda/xlv.c
--------------------------

irix.xlv.*
	syssgi(SGI_XLV_ATTR_CURSOR, &_cursor);
	-- get cursor for subsequent syssgi commands
	-- <sys/xlv_attr.h>

	syssgi(SGI_XLV_ATTR_GET, &_cursor, &req);
	-- req.attr = XLV_ATTR_LOCKS
	-- get req.ar_num_locks, req.ar_max_locks

	syssgi(SGI_XLV_ATTR_SET, &_cursor, &req);
	-- req.attr = XLV_ATTR_FLAGS
	-- set XLV_FLAG_STAT ??

	syssgi(SGI_XLV_ATTR_GET, &_cursor, &req);
	-- req.attr = XLV_ATTR_SUBVOL
	-- xlv_load_subvols ??

	syssgi(SGI_XLV_ATTR_GET, &_cursor, &req);
	-- req.attr = XLV_ATTR_VOL
	-- xlv_load_vols ??

	syssgi(SGI_XLV_ATTR_GET, &_cursor, &req);
	-- req.attr = XLV_ATTR_STATS
	-- get the xlv stats for the fetch



eoe/cmd/pcp/pmdas/proc/pracinfo.c
---------------------------------

proc.accounting.*
	ioctl(fd, PIOCACINFO, buf);

eoe/cmd/pcp/pmdas/proc/procmem.c
--------------------------------

proc.memory.*
	ioctl(fd, PIOCNMAP, &nmaps);
	ioctl(fd, PIOCMAP_SGI, &maparg);

eoe/cmd/pcp/pmdas/proc/pscred.c
-------------------------------

proc.pscred.*
	ioctl(fd, PIOCCRED, buf);

eoe/cmd/pcp/pmdas/proc/psinfo.c
-------------------------------

proc.psinfo.*
	ioctl(fd, PIOCPSINFO, buf);

eoe/cmd/pcp/pmdas/proc/psstatus.c
---------------------------------

proc.pstatus.*
	ioctl(fd, PIOCPSTATUS, buf);

eoe/cmd/pcp/pmdas/proc/psusage.c
--------------------------------

proc.psusage.*
	ioctl(fd, PIOCUSAGE, buf);
