[BACK]Return to uvm_meter.c CVS log [TXT][DIR] Up to [local] / sys / uvm

Annotation of sys/uvm/uvm_meter.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: uvm_meter.c,v 1.22 2007/02/14 00:53:48 jsg Exp $      */
                      2: /*     $NetBSD: uvm_meter.c,v 1.21 2001/07/14 06:36:03 matt Exp $      */
                      3:
                      4: /*
                      5:  * Copyright (c) 1997 Charles D. Cranor and Washington University.
                      6:  * Copyright (c) 1982, 1986, 1989, 1993
                      7:  *      The Regents of the University of California.
                      8:  *
                      9:  * All rights reserved.
                     10:  *
                     11:  * Redistribution and use in source and binary forms, with or without
                     12:  * modification, are permitted provided that the following conditions
                     13:  * are met:
                     14:  * 1. Redistributions of source code must retain the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer.
                     16:  * 2. Redistributions in binary form must reproduce the above copyright
                     17:  *    notice, this list of conditions and the following disclaimer in the
                     18:  *    documentation and/or other materials provided with the distribution.
                     19:  * 3. All advertising materials mentioning features or use of this software
                     20:  *    must display the following acknowledgement:
                     21:  *      This product includes software developed by Charles D. Cranor,
                     22:  *      Washington University, and the University of California, Berkeley
                     23:  *      and its contributors.
                     24:  * 4. Neither the name of the University nor the names of its contributors
                     25:  *    may be used to endorse or promote products derived from this software
                     26:  *    without specific prior written permission.
                     27:  *
                     28:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     29:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     30:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     31:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     32:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     33:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     34:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     35:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     36:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     37:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     38:  * SUCH DAMAGE.
                     39:  *
                     40:  *      @(#)vm_meter.c  8.4 (Berkeley) 1/4/94
                     41:  * from: Id: uvm_meter.c,v 1.1.2.1 1997/08/14 19:10:35 chuck Exp
                     42:  */
                     43:
                     44: #include <sys/param.h>
                     45: #include <sys/proc.h>
                     46: #include <sys/systm.h>
                     47: #include <sys/kernel.h>
                     48: #include <uvm/uvm_extern.h>
                     49: #include <sys/sysctl.h>
                     50: #include <sys/exec.h>
                     51:
                     52: #ifdef UVM_SWAP_ENCRYPT
                     53: #include <uvm/uvm_swap.h>
                     54: #include <uvm/uvm_swap_encrypt.h>
                     55: #endif
                     56:
                     57: /*
                     58:  * maxslp: ???? XXXCDC
                     59:  */
                     60:
                     61: int maxslp = MAXSLP;   /* patchable ... */
                     62: struct loadavg averunnable;
                     63:
                     64: /*
                     65:  * constants for averages over 1, 5, and 15 minutes when sampling at
                     66:  * 5 second intervals.
                     67:  */
                     68:
                     69: static fixpt_t cexp[3] = {
                     70:        0.9200444146293232 * FSCALE,    /* exp(-1/12) */
                     71:        0.9834714538216174 * FSCALE,    /* exp(-1/60) */
                     72:        0.9944598480048967 * FSCALE,    /* exp(-1/180) */
                     73: };
                     74:
                     75: /*
                     76:  * prototypes
                     77:  */
                     78:
                     79: static void uvm_loadav(struct loadavg *);
                     80:
                     81: /*
                     82:  * uvm_meter: calculate load average and wake up the swapper (if needed)
                     83:  */
                     84: void
                     85: uvm_meter()
                     86: {
                     87:        if ((time_second % 5) == 0)
                     88:                uvm_loadav(&averunnable);
                     89:        if (proc0.p_slptime > (maxslp / 2))
                     90:                wakeup(&proc0);
                     91: }
                     92:
                     93: /*
                     94:  * uvm_loadav: compute a tenex style load average of a quantity on
                     95:  * 1, 5, and 15 minute intervals.
                     96:  */
                     97: static void
                     98: uvm_loadav(avg)
                     99:        struct loadavg *avg;
                    100: {
                    101:        int i, nrun;
                    102:        struct proc *p;
                    103:
                    104:        nrun = 0;
                    105:        LIST_FOREACH(p, &allproc, p_list) {
                    106:                switch (p->p_stat) {
                    107:                case SSLEEP:
                    108:                        if (p->p_priority > PZERO || p->p_slptime > 1)
                    109:                                continue;
                    110:                /* FALLTHROUGH */
                    111:                case SRUN:
                    112:                case SIDL:
                    113:                case SONPROC:
                    114:                        nrun++;
                    115:                }
                    116:        }
                    117:        for (i = 0; i < 3; i++)
                    118:                avg->ldavg[i] = (cexp[i] * avg->ldavg[i] +
                    119:                    nrun * FSCALE * (FSCALE - cexp[i])) >> FSHIFT;
                    120: }
                    121:
                    122: /*
                    123:  * uvm_sysctl: sysctl hook into UVM system.
                    124:  */
                    125: int
                    126: uvm_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p)
                    127:        int *name;
                    128:        u_int namelen;
                    129:        void *oldp;
                    130:        size_t *oldlenp;
                    131:        void *newp;
                    132:        size_t newlen;
                    133:        struct proc *p;
                    134: {
                    135:        struct vmtotal vmtotals;
                    136:        int rv, t;
                    137:        struct _ps_strings _ps = { PS_STRINGS };
                    138:
                    139:        switch (name[0]) {
                    140:        case VM_SWAPENCRYPT:
                    141: #ifdef UVM_SWAP_ENCRYPT
                    142:                return (swap_encrypt_ctl(name + 1, namelen - 1, oldp, oldlenp,
                    143:                                         newp, newlen, p));
                    144: #else
                    145:                return (EOPNOTSUPP);
                    146: #endif
                    147:        default:
                    148:                /* all sysctl names at this level are terminal */
                    149:                if (namelen != 1)
                    150:                        return (ENOTDIR);               /* overloaded */
                    151:                break;
                    152:        }
                    153:
                    154:        switch (name[0]) {
                    155:        case VM_LOADAVG:
                    156:                return (sysctl_rdstruct(oldp, oldlenp, newp, &averunnable,
                    157:                    sizeof(averunnable)));
                    158:
                    159:        case VM_METER:
                    160:                uvm_total(&vmtotals);
                    161:                return (sysctl_rdstruct(oldp, oldlenp, newp, &vmtotals,
                    162:                    sizeof(vmtotals)));
                    163:
                    164:        case VM_UVMEXP:
                    165:                return (sysctl_rdstruct(oldp, oldlenp, newp, &uvmexp,
                    166:                    sizeof(uvmexp)));
                    167:
                    168:        case VM_NKMEMPAGES:
                    169:                return (sysctl_rdint(oldp, oldlenp, newp, nkmempages));
                    170:
                    171:        case VM_PSSTRINGS:
                    172:                return (sysctl_rdstruct(oldp, oldlenp, newp, &_ps,
                    173:                    sizeof(_ps)));
                    174:        case VM_ANONMIN:
                    175:                t = uvmexp.anonminpct;
                    176:                rv = sysctl_int(oldp, oldlenp, newp, newlen, &t);
                    177:                if (rv) {
                    178:                        return rv;
                    179:                }
                    180:                if (t + uvmexp.vtextminpct + uvmexp.vnodeminpct > 95 || t < 0) {
                    181:                        return EINVAL;
                    182:                }
                    183:                uvmexp.anonminpct = t;
                    184:                uvmexp.anonmin = t * 256 / 100;
                    185:                return rv;
                    186:
                    187:        case VM_VTEXTMIN:
                    188:                t = uvmexp.vtextminpct;
                    189:                rv = sysctl_int(oldp, oldlenp, newp, newlen, &t);
                    190:                if (rv) {
                    191:                        return rv;
                    192:                }
                    193:                if (uvmexp.anonminpct + t + uvmexp.vnodeminpct > 95 || t < 0) {
                    194:                        return EINVAL;
                    195:                }
                    196:                uvmexp.vtextminpct = t;
                    197:                uvmexp.vtextmin = t * 256 / 100;
                    198:                return rv;
                    199:
                    200:        case VM_VNODEMIN:
                    201:                t = uvmexp.vnodeminpct;
                    202:                rv = sysctl_int(oldp, oldlenp, newp, newlen, &t);
                    203:                if (rv) {
                    204:                        return rv;
                    205:                }
                    206:                if (uvmexp.anonminpct + uvmexp.vtextminpct + t > 95 || t < 0) {
                    207:                        return EINVAL;
                    208:                }
                    209:                uvmexp.vnodeminpct = t;
                    210:                uvmexp.vnodemin = t * 256 / 100;
                    211:                return rv;
                    212:
                    213:        case VM_MAXSLP:
                    214:                return (sysctl_rdint(oldp, oldlenp, newp, maxslp));
                    215:
                    216:        case VM_USPACE:
                    217:                return (sysctl_rdint(oldp, oldlenp, newp, USPACE));
                    218:
                    219:        default:
                    220:                return (EOPNOTSUPP);
                    221:        }
                    222:        /* NOTREACHED */
                    223: }
                    224:
                    225: /*
                    226:  * uvm_total: calculate the current state of the system.
                    227:  */
                    228: void
                    229: uvm_total(totalp)
                    230:        struct vmtotal *totalp;
                    231: {
                    232:        struct proc *p;
                    233: #if 0
                    234:        struct vm_map_entry *   entry;
                    235:        struct vm_map *map;
                    236:        int paging;
                    237: #endif
                    238:
                    239:        memset(totalp, 0, sizeof *totalp);
                    240:
                    241:        /*
                    242:         * calculate process statistics
                    243:         */
                    244:
                    245:        LIST_FOREACH(p, &allproc, p_list) {
                    246:                if (p->p_flag & P_SYSTEM)
                    247:                        continue;
                    248:                switch (p->p_stat) {
                    249:                case 0:
                    250:                        continue;
                    251:
                    252:                case SSLEEP:
                    253:                case SSTOP:
                    254:                        if (p->p_priority <= PZERO)
                    255:                                totalp->t_dw++;
                    256:                        else if (p->p_slptime < maxslp)
                    257:                                totalp->t_sl++;
                    258:                        if (p->p_slptime >= maxslp)
                    259:                                continue;
                    260:                        break;
                    261:
                    262:                case SRUN:
                    263:                case SIDL:
                    264:                case SONPROC:
                    265:                        totalp->t_rq++;
                    266:                        if (p->p_stat == SIDL)
                    267:                                continue;
                    268:                        break;
                    269:                }
                    270:                /*
                    271:                 * note active objects
                    272:                 */
                    273: #if 0
                    274:                /*
                    275:                 * XXXCDC: BOGUS!  rethink this.   in the mean time
                    276:                 * don't do it.
                    277:                 */
                    278:                paging = 0;
                    279:                vm_map_lock(map);
                    280:                for (map = &p->p_vmspace->vm_map, entry = map->header.next;
                    281:                    entry != &map->header; entry = entry->next) {
                    282:                        if (entry->is_a_map || entry->is_sub_map ||
                    283:                            entry->object.uvm_obj == NULL)
                    284:                                continue;
                    285:                        /* XXX how to do this with uvm */
                    286:                }
                    287:                vm_map_unlock(map);
                    288:                if (paging)
                    289:                        totalp->t_pw++;
                    290: #endif
                    291:        }
                    292:        /*
                    293:         * Calculate object memory usage statistics.
                    294:         */
                    295:        totalp->t_free = uvmexp.free;
                    296:        totalp->t_vm = uvmexp.npages - uvmexp.free + uvmexp.swpginuse;
                    297:        totalp->t_avm = uvmexp.active + uvmexp.swpginuse;       /* XXX */
                    298:        totalp->t_rm = uvmexp.npages - uvmexp.free;
                    299:        totalp->t_arm = uvmexp.active;
                    300:        totalp->t_vmshr = 0;            /* XXX */
                    301:        totalp->t_avmshr = 0;           /* XXX */
                    302:        totalp->t_rmshr = 0;            /* XXX */
                    303:        totalp->t_armshr = 0;           /* XXX */
                    304: }

CVSweb