- (void) spl6();
- runin++;
- sleep((caddr_t)&runin, PSWP);
- (void) spl0();
- goto loop;
-}
-
-vmmeter()
-{
- register unsigned *cp, *rp, *sp;
-
- deficit -= imin(deficit,
- imax(deficit / 10, ((klin * CLSIZE) / 2) * maxpgio / 2));
- ave(avefree, freemem, 5);
- ave(avefree30, freemem, 30);
- /* v_pgin is maintained by clock.c */
- cp = &cnt.v_first; rp = &rate.v_first; sp = &sum.v_first;
- while (cp <= &cnt.v_last) {
- ave(*rp, *cp, 5);
- *sp += *cp;
- *cp = 0;
- rp++, cp++, sp++;
- }
- if (time.tv_sec % 5 == 0) {
- vmtotal();
- rate.v_swpin = cnt.v_swpin;
- sum.v_swpin += cnt.v_swpin;
- cnt.v_swpin = 0;
- rate.v_swpout = cnt.v_swpout;
- sum.v_swpout += cnt.v_swpout;
- cnt.v_swpout = 0;
- }
- if (avefree < minfree && runout || proc[0].p_slptime > maxslp/2) {
- runout = 0;
- runin = 0;
- wakeup((caddr_t)&runin);
- wakeup((caddr_t)&runout);
- }
-}
-
-#define RATETOSCHEDPAGING 4 /* hz that is */
-
-/*
- * Schedule rate for paging.
- * Rate is linear interpolation between
- * slowscan with lotsfree and fastscan when out of memory.
- */
-schedpaging()
-{
- register int vavail, scanrate;
-
- nscan = desscan = 0;
- vavail = freemem - deficit;
- if (vavail < 0)
- vavail = 0;
- if (freemem < lotsfree) {
- scanrate =
- (slowscan * vavail + fastscan * (lotsfree - vavail)) /
- nz(lotsfree);
- desscan = ((LOOPPAGES / CLSIZE) / nz(scanrate)) /
- RATETOSCHEDPAGING;
- wakeup((caddr_t)&proc[2]);
- }
- timeout(schedpaging, (caddr_t)0, hz / RATETOSCHEDPAGING);
-}
-
-vmtotal()
-{
- register struct proc *p;
- register struct text *xp;
- int nrun = 0;
-
- total.t_vmtxt = 0;
- total.t_avmtxt = 0;
- total.t_rmtxt = 0;
- total.t_armtxt = 0;
- for (xp = text; xp < textNTEXT; xp++)
- if (xp->x_iptr) {
- total.t_vmtxt += xp->x_size;
- total.t_rmtxt += xp->x_rssize;
- for (p = xp->x_caddr; p; p = p->p_xlink)
- switch (p->p_stat) {
-
- case SSTOP:
- case SSLEEP:
- if (p->p_slptime >= maxslp)
- continue;
- /* fall into... */
-
- case SRUN:
- case SIDL:
- total.t_avmtxt += xp->x_size;
- total.t_armtxt += xp->x_rssize;
- goto next;
- }
-next:
- ;
+ simple_lock(&vm_object_list_lock);
+ for (object = vm_object_list.tqh_first;
+ object != NULL;
+ object = object->object_list.tqe_next) {
+ totalp->t_vm += num_pages(object->size);
+ totalp->t_rm += object->resident_page_count;
+ if (object->flags & OBJ_ACTIVE) {
+ totalp->t_avm += num_pages(object->size);
+ totalp->t_arm += object->resident_page_count;