14887Schin /***********************************************************************
24887Schin * *
34887Schin * This software is part of the ast package *
4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1985-2010 AT&T Intellectual Property *
54887Schin * and is licensed under the *
64887Schin * Common Public License, Version 1.0 *
78462SApril.Chin@Sun.COM * by AT&T Intellectual Property *
84887Schin * *
94887Schin * A copy of the License is available at *
104887Schin * http://www.opensource.org/licenses/cpl1.0.txt *
114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
124887Schin * *
134887Schin * Information and Software Systems Research *
144887Schin * AT&T Research *
154887Schin * Florham Park NJ *
164887Schin * *
174887Schin * Glenn Fowler <gsf@research.att.com> *
184887Schin * David Korn <dgk@research.att.com> *
194887Schin * Phong Vo <kpv@research.att.com> *
204887Schin * *
214887Schin ***********************************************************************/
224887Schin #if defined(_UWIN) && defined(_BLD_ast)
234887Schin
_STUB_vmstat()244887Schin void _STUB_vmstat(){}
254887Schin
264887Schin #else
274887Schin
284887Schin #include "vmhdr.h"
294887Schin
304887Schin /* Get statistics from a region.
314887Schin **
324887Schin ** Written by Kiem-Phong Vo, kpv@research.att.com, 01/16/94.
334887Schin */
344887Schin
354887Schin #if __STD_C
vmstat(Vmalloc_t * vm,Vmstat_t * st)364887Schin int vmstat(Vmalloc_t* vm, Vmstat_t* st)
374887Schin #else
384887Schin int vmstat(vm, st)
394887Schin Vmalloc_t* vm;
404887Schin Vmstat_t* st;
414887Schin #endif
424887Schin {
434887Schin reg Seg_t* seg;
444887Schin reg Block_t *b, *endb;
454887Schin reg size_t s = 0;
468462SApril.Chin@Sun.COM reg Vmdata_t* vd = vm ? vm->data : Vmregion->data;
478462SApril.Chin@Sun.COM reg int inuse;
484887Schin
498462SApril.Chin@Sun.COM SETINUSE(vd, inuse);
504887Schin if(!st)
518462SApril.Chin@Sun.COM { CLRINUSE(vd, inuse);
528462SApril.Chin@Sun.COM return inuse ? 1 : 0;
538462SApril.Chin@Sun.COM }
544887Schin if(!(vd->mode&VM_TRUST))
554887Schin { if(ISLOCK(vd,0))
568462SApril.Chin@Sun.COM { CLRINUSE(vd, inuse);
574887Schin return -1;
588462SApril.Chin@Sun.COM }
594887Schin SETLOCK(vd,0);
604887Schin }
614887Schin
624887Schin st->n_busy = st->n_free = 0;
634887Schin st->s_busy = st->s_free = st->m_busy = st->m_free = 0;
644887Schin st->n_seg = 0;
654887Schin st->extent = 0;
664887Schin
674887Schin if(vd->mode&VM_MTLAST)
684887Schin st->n_busy = 0;
694887Schin else if((vd->mode&VM_MTPOOL) && (s = vd->pool) > 0)
704887Schin { s = ROUND(s,ALIGN);
714887Schin for(b = vd->free; b; b = SEGLINK(b))
724887Schin st->n_free += 1;
734887Schin }
744887Schin
754887Schin for(seg = vd->seg; seg; seg = seg->next)
764887Schin { st->n_seg += 1;
774887Schin st->extent += seg->extent;
784887Schin
794887Schin b = SEGBLOCK(seg);
804887Schin endb = BLOCK(seg->baddr);
814887Schin
824887Schin if(vd->mode&(VM_MTDEBUG|VM_MTBEST|VM_MTPROFILE))
834887Schin { while(b < endb)
844887Schin { s = SIZE(b)&~BITS;
854887Schin if(ISJUNK(SIZE(b)) || !ISBUSY(SIZE(b)))
864887Schin { if(s > st->m_free)
874887Schin st->m_free = s;
884887Schin st->s_free += s;
894887Schin st->n_free += 1;
904887Schin }
914887Schin else /* get the real size */
924887Schin { if(vd->mode&VM_MTDEBUG)
934887Schin s = DBSIZE(DB2DEBUG(DATA(b)));
944887Schin else if(vd->mode&VM_MTPROFILE)
954887Schin s = PFSIZE(DATA(b));
964887Schin if(s > st->m_busy)
974887Schin st->m_busy = s;
984887Schin st->s_busy += s;
994887Schin st->n_busy += 1;
1004887Schin }
1014887Schin
1024887Schin b = (Block_t*)((Vmuchar_t*)DATA(b) + (SIZE(b)&~BITS) );
1034887Schin }
1044887Schin }
1054887Schin else if(vd->mode&VM_MTLAST)
1064887Schin { if((s = seg->free ? (SIZE(seg->free) + sizeof(Head_t)) : 0) > 0)
1074887Schin { st->s_free += s;
1084887Schin st->n_free += 1;
1094887Schin }
1104887Schin if((s = ((char*)endb - (char*)b) - s) > 0)
1114887Schin { st->s_busy += s;
1124887Schin st->n_busy += 1;
1134887Schin }
1144887Schin }
1154887Schin else if((vd->mode&VM_MTPOOL) && s > 0)
1164887Schin { if(seg->free)
1174887Schin st->n_free += (SIZE(seg->free)+sizeof(Head_t))/s;
1184887Schin st->n_busy += ((seg->baddr - (Vmuchar_t*)b) - sizeof(Head_t))/s;
1194887Schin }
1204887Schin }
1214887Schin
1224887Schin if((vd->mode&VM_MTPOOL) && s > 0)
1234887Schin { st->n_busy -= st->n_free;
1244887Schin if(st->n_busy > 0)
1254887Schin st->s_busy = (st->m_busy = vd->pool)*st->n_busy;
1264887Schin if(st->n_free > 0)
1274887Schin st->s_free = (st->m_free = vd->pool)*st->n_free;
1284887Schin }
1294887Schin
1304887Schin CLRLOCK(vd,0);
1318462SApril.Chin@Sun.COM CLRINUSE(vd, inuse);
1328462SApril.Chin@Sun.COM return inuse ? 1 : 0;
1334887Schin }
1344887Schin
1354887Schin #endif
136