Annotation of researchv10no/sys/vm/vmsys.c, revision 1.1

1.1     ! root        1: #include "sys/param.h"
        !             2: #include "sys/user.h"
        !             3: #include "sys/proc.h"
        !             4: #include "sys/vm.h"
        !             5: #include "sys/pte.h"
        !             6: #include "sys/cmap.h"
        !             7: #include "sys/mtpr.h"
        !             8: #include "sys/vlimit.h"
        !             9: #include "sys/vadvise.h"
        !            10: 
        !            11: int    both;
        !            12: 
        !            13: vadvise()
        !            14: {
        !            15:        register struct a {
        !            16:                int     anom;
        !            17:        } *uap;
        !            18:        register struct proc *rp = u.u_procp;
        !            19:        int oanom = rp->p_flag & SUANOM;
        !            20:        register struct pte *pte;
        !            21:        register struct cmap *c;
        !            22:        register int i;
        !            23: 
        !            24:        uap = (struct a *)u.u_ap;
        !            25:        rp->p_flag &= ~(SSEQL|SUANOM);
        !            26:        switch (uap->anom) {
        !            27: 
        !            28:        case VA_ANOM:
        !            29:                rp->p_flag |= SUANOM;
        !            30:                break;
        !            31: 
        !            32:        case VA_SEQL:
        !            33:                rp->p_flag |= SSEQL;
        !            34:                break;
        !            35:        }
        !            36:        if (both || (oanom && (rp->p_flag & SUANOM) == 0)) {
        !            37:                for (i = 0; i < rp->p_dsize; i += CLSIZE) {
        !            38:                        pte = dptopte(rp, i);
        !            39:                        if (pte->pg_v) {
        !            40:                                c = &cmap[pgtocm(pte->pg_pfnum)];
        !            41:                                if (c->c_lock)
        !            42:                                        continue;
        !            43:                                pte->pg_v = 0;
        !            44:                                if (anycl(pte, pg_m))
        !            45:                                        pte->pg_m = 1;
        !            46:                                distcl(pte);
        !            47:                        }
        !            48:                }
        !            49:                mtpr(TBIA, 0);
        !            50:        }
        !            51: }
        !            52: 
        !            53: vtimes()
        !            54: {
        !            55:        register struct a {
        !            56:                struct  vtimes *par_vm;
        !            57:                struct  vtimes *ch_vm;
        !            58:        } *uap = (struct a *)u.u_ap;
        !            59:        if (uap->par_vm) {
        !            60:                if (copyout((caddr_t)&u.u_vm, (caddr_t)uap->par_vm,
        !            61:                    sizeof(struct vtimes)) < 0)
        !            62:                        u.u_error = EFAULT;
        !            63:        }
        !            64:        if (uap->ch_vm == 0)
        !            65:                return;
        !            66:        if (copyout((caddr_t)&u.u_cvm, (caddr_t)uap->ch_vm,
        !            67:            sizeof(struct vtimes)) < 0)
        !            68:                u.u_error = EFAULT;
        !            69: }
        !            70: 
        !            71: vmsadd(vp, wp)
        !            72:        register struct vtimes *vp, *wp;
        !            73: {
        !            74: 
        !            75:        vp->vm_utime += wp->vm_utime;
        !            76:        vp->vm_stime += wp->vm_stime;
        !            77:        vp->vm_nswap += wp->vm_nswap;
        !            78:        vp->vm_idsrss += wp->vm_idsrss;
        !            79:        vp->vm_ixrss += wp->vm_ixrss;
        !            80:        if (vp->vm_maxrss < wp->vm_maxrss)
        !            81:                vp->vm_maxrss = wp->vm_maxrss;
        !            82:        vp->vm_majflt += wp->vm_majflt;
        !            83:        vp->vm_minflt += wp->vm_minflt;
        !            84:        vp->vm_inblk += wp->vm_inblk;
        !            85:        vp->vm_oublk += wp->vm_oublk;
        !            86: }
        !            87: 
        !            88: /*
        !            89:  * Affect per-process limits.
        !            90:  * To just return old limit, specify negative new limit.
        !            91:  */
        !            92: vlimit()
        !            93: {
        !            94:        register struct a {
        !            95:                unsigned which;
        !            96:                int     limit;
        !            97:        } *uap;
        !            98: 
        !            99:        uap = (struct a *)u.u_ap;
        !           100:        if (uap->which > NLIMITS) {
        !           101:                u.u_error = EINVAL;
        !           102:                return;
        !           103:        }
        !           104:        u.u_r.r_val1 = u.u_limit[uap->which];
        !           105:        if (uap->limit < 0)
        !           106:                return;
        !           107:        switch (uap->which) {
        !           108: 
        !           109:        case LIM_DATA:
        !           110:                if (uap->limit > ctob(maxdsize))
        !           111:                        uap->limit = ctob(maxdsize);
        !           112:                break;
        !           113: 
        !           114:        case LIM_TEXT:
        !           115:                if (uap->limit > ctob(maxtsize))
        !           116:                        uap->limit = ctob(maxtsize);
        !           117:                break;
        !           118: 
        !           119:        case LIM_STACK:
        !           120:                if (uap->limit > ctob(maxssize))
        !           121:                        uap->limit = ctob(maxssize);
        !           122:                break;
        !           123:        }
        !           124:        if (u.u_limit[LIM_NORAISE] && uap->limit > u.u_limit[uap->which] &&
        !           125:            !suser()) {
        !           126:                u.u_error = EACCES;
        !           127:                return;
        !           128:        }
        !           129:        u.u_limit[uap->which] = uap->limit;
        !           130:        if (uap->which == LIM_MAXRSS)
        !           131:                u.u_procp->p_maxrss = uap->limit/NBPG;
        !           132: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.