Annotation of 3BSD/sys/h/vm.h, revision 1.1.1.1

1.1       root        1: /*     vm.h    2.1     1/5/80  */
                      2: 
                      3: /*
                      4:  * Machine dependent constants
                      5:  */
                      6: #define        NBBY            8               /* number of bits in a byte */
                      7: #define        NBPG            512             /* number of bytes per page */
                      8: #define        PGSHIFT         9               /* LOG2(NBPG) */
                      9: #define        NPTEPG          (NBPG/(sizeof (struct pte)))
                     10:                                        /* number of ptes per page */
                     11: #define        PGOFSET         (NBPG-1)        /* byte offset into page */
                     12: #define        CLOFSET         (CLSIZE*NBPG-1) /* for clusters, like PGOFSET */
                     13: #define        USRSTACK        0x80000000      /* Start of user stack */
                     14: #define        P1TOP           0x200000        /* boundary between P0 and P1 regions */
                     15: #define        AST             0x04000000      /* ast level */
                     16: 
                     17: /*
                     18:  * Virtual memory related constants
                     19:  *
                     20:  * note: USRPTSIZE is well known in locore.s
                     21:  */
                     22: #define        MAXTSIZ         (4*2048)        /* max virtual text size in clicks */
                     23: #define        MAXDSIZ         (4*2048)        /* max virtual data size in clicks */
                     24: #define        MAXSSIZ         (1024)          /* max virtual stack size in clicks */
                     25: #define        USRPTSIZE       (8*NPTEPG)      /* max number of pages of page tables
                     26:                                           for resident processes, this is
                     27:                                           known in locore.s */
                     28: 
                     29: /*
                     30:  * Page clustering macros.
                     31:  * 
                     32:  * dirtycl(pte)                        is the page cluster dirty?
                     33:  * anycl(pte,fld)              does any pte in the cluster has fld set?
                     34:  * zapcl(pte,fld) = val                set all fields fld in the cluster to val
                     35:  * distcl(pte)                 distribute high bits to cluster; note that
                     36:  *                             distcl copies everything but pg_pfnum,
                     37:  *                             INCLUDING pg_m!!!
                     38:  *
                     39:  * In all cases, pte must be the low pte in the cluster, even if
                     40:  * the segment grows backwards (e.g. the stack).
                     41:  */
                     42: #define        H(pte)  ((struct hpte *)(pte))
                     43: 
                     44: #if CLSIZE==1
                     45: #define        dirtycl(pte)    dirty(pte)
                     46: #define        anycl(pte,fld)  ((pte)->fld)
                     47: #define        zapcl(pte,fld)  (pte)->fld
                     48: #define        distcl(pte)
                     49: #endif
                     50: 
                     51: #if CLSIZE==2
                     52: #define        dirtycl(pte)    (dirty(pte) || dirty((pte)+1))
                     53: #define        anycl(pte,fld)  ((pte)->fld || (((pte)+1)->fld))
                     54: #define        zapcl(pte,fld)  (pte)[1].fld = (pte)[0].fld
                     55: #endif
                     56: 
                     57: #if CLSIZE==4
                     58: #define        dirtycl(pte) \
                     59:     (dirty(pte) || dirty((pte)+1) || dirty((pte)+2) || dirty((pte)+3))
                     60: #define        anycl(pte,fld) \
                     61:     ((pte)->fld || (((pte)+1)->fld) || (((pte)+2)->fld) || (((pte)+3)->fld))
                     62: #define        zapcl(pte,fld) \
                     63:     (pte)[3].fld = (pte)[2].fld = (pte)[1].fld = (pte)[0].fld
                     64: #endif
                     65: 
                     66: #ifndef distcl
                     67: #define        distcl(pte)     zapcl(H(pte),pg_high)
                     68: #endif
                     69: 
                     70: /*
                     71:  * Tunable performance parameters
                     72:  *
                     73:  * These may vary per-cpu due to configuration as well as the flavor of
                     74:  * the local job mix.  MAXPGIO in particular is dependent on the number
                     75:  * of disk drives and controllers available locally.
                     76:  */
                     77: #define        LOOPSIZ         ((maxfree - firstfree) / CLSIZE)
                     78:                                        /* loop circumference */
                     79: #define        LOTSFREE        ((maxfree - firstfree) / 8)
                     80:                                        /* very high mark to freeze scans */
                     81: #define        DESFREE         64              /* minimum desirable free memory */
                     82: #define        MINFREE         32              /* water mark to run swap daemon */
                     83: #define        MAXSLP          20              /* max blocked time (in seconds) allowed
                     84:                                           before being very swappable */
                     85: /* SLOWSCAN AND FASTSCAN SHOULD BE MADE DEPENDENT ON LOOPSIZ */
                     86: #define        SLOWSCAN        30              /* seconds per loop when memory easy */
                     87: #define        FASTSCAN        20              /* seconds per loop when memory tight */
                     88: #define        SAFERSS         32              /* nominal ``small'' resident set size
                     89:                                           protected against replacement */
                     90: #define        MAXPGIO         40              /* max desired paging i/o per second,
                     91:                                           if exceeded, and freemem < desfree
                     92:                                           then we try to swap someone out */
                     93: 
                     94: /*
                     95:  * Virtual memory related conversion macros
                     96:  */
                     97: 
                     98: /* Core clicks to number of pages of page tables needed to map that much */
                     99: #define        ctopt(x)        (((x)+NPTEPG-1)/NPTEPG)
                    100: 
                    101: /* Virtual page numbers to text|data|stack segment page numbers and back */
                    102: #define        vtotp(p, v)     ((int)(v))
                    103: #define        vtodp(p, v)     ((int)((v) - (p)->p_tsize))
                    104: #define        vtosp(p, v)     ((int)(btop(USRSTACK) - 1 - (v)))
                    105: #define        tptov(p, i)     ((unsigned)(i))
                    106: #define        dptov(p, i)     ((unsigned)((p)->p_tsize + (i)))
                    107: #define        sptov(p, i)     ((unsigned)(btop(USRSTACK) - 1 - (i)))
                    108: 
                    109: /* Tell whether virtual page numbers are in text|data|stack segment */
                    110: #define        isassv(p, v)    ((v) & P1TOP)
                    111: #define        isatsv(p, v)    ((v) < (p)->p_tsize)
                    112: #define        isadsv(p, v)    ((v) >= (p)->p_tsize && !isassv(p, v))
                    113: 
                    114: /* Tell whether pte's are text|data|stack */
                    115: #define        isaspte(p, pte)         ((pte) > sptopte(p, (p)->p_ssize))
                    116: #define        isatpte(p, pte)         ((pte) < dptopte(p, 0))
                    117: #define        isadpte(p, pte)         (!isaspte(p, pte) && !isatpte(p, pte))
                    118: 
                    119: /* Text|data|stack pte's to segment page numbers and back */
                    120: #define        ptetotp(p, pte)         ((pte) - (p)->p_p0br)
                    121: #define        ptetodp(p, pte)         ((pte) - ((p)->p_p0br + (p)->p_tsize))
                    122: #define        ptetosp(p, pte)         (((p)->p_p0br + (p)->p_szpt*NPTEPG - 1) - (pte))
                    123: #define        tptopte(p, i)           ((p)->p_p0br + (i))
                    124: #define        dptopte(p, i)           ((p)->p_p0br + (p)->p_tsize + (i))
                    125: #define        sptopte(p, i)           (((p)->p_p0br + (p)->p_szpt*NPTEPG - 1) - (i))
                    126: 
                    127: /* Bytes to pages without rounding, and back */
                    128: #define        btop(x)         (((unsigned)(x)) >> PGSHIFT)
                    129: #define        ptob(x)         ((caddr_t)((x) << PGSHIFT))
                    130: 
                    131: /* Turn virtual addresses into kernel map indices */
                    132: #define        kmxtob(a)       (usrpt + (a) * NPTEPG)
                    133: #define        btokmx(b)       (((b) - usrpt) / NPTEPG)
                    134: 
                    135: /* Average new into old with aging factor time */
                    136: #define        ave(smooth, cnt, time) \
                    137:        smooth = ((time - 1) * (smooth) + (cnt)) / (time)
                    138: 
                    139: /*
                    140:  * Virtual memory related instrumentation
                    141:  */
                    142: struct vmmeter
                    143: {
                    144:        unsigned v_swpin;       /* swapins */
                    145:        unsigned v_swpout;      /* swapouts */
                    146:        unsigned v_pswpin;      /* pages swapped in */
                    147:        unsigned v_pswpout;     /* pages swapped out */
                    148:        unsigned v_pgin;        /* pageins */
                    149:        unsigned v_pgout;       /* pageouts */
                    150:        unsigned v_intrans;     /* intransit blocking page faults */
                    151:        unsigned v_pgrec;       /* total page reclaims */
                    152:        unsigned v_exfod;       /* pages filled on demand from executables */
                    153:        unsigned v_zfod;        /* pages zero filled on demand */
                    154:        unsigned v_vrfod;       /* fills of pages mapped by vread() */
                    155:        unsigned v_nexfod;      /* number of exfod's created */
                    156:        unsigned v_nzfod;       /* number of zfod's created */
                    157:        unsigned v_nvrfod;      /* number of vrfod's created */
                    158:        unsigned v_pgfrec;      /* page reclaims from free list */
                    159:        unsigned v_faults;      /* total faults taken */
                    160:        unsigned v_scan;        /* scans in page out daemon */
                    161:        unsigned v_rev;         /* revolutions of the hand */
                    162:        unsigned v_dfree;       /* pages freed by daemon */
                    163:        unsigned v_swtch;       /* context switches */
                    164: };
                    165: #ifdef KERNEL
                    166: struct vmmeter cnt, rate, sum;
                    167: #endif
                    168: 
                    169: /* systemwide totals computed every five seconds */
                    170: struct vmtotal
                    171: {
                    172:        short   t_rq;           /* length of the run queue */
                    173:        short   t_dw;           /* jobs in ``disk wait'' (neg priority) */
                    174:        short   t_pw;           /* jobs in page wait */
                    175:        short   t_sl;           /* jobs sleeping in core */
                    176:        short   t_sw;           /* swapped out runnable/short block jobs */
                    177:        short   t_vm;           /* total virtual memory */
                    178:        short   t_avm;          /* active virtual memory */
                    179:        short   t_rm;           /* total real memory in use */
                    180:        short   t_arm;          /* active real memory */
                    181:        short   t_vmtxt;        /* virtual memory used by text */
                    182:        short   t_avmtxt;       /* active virtual memory used by text */
                    183:        short   t_rmtxt;        /* real memory used by text */
                    184:        short   t_armtxt;       /* active real memory used by text */
                    185:        short   t_free;         /* free memory pages */
                    186: };
                    187: #ifdef KERNEL
                    188: struct vmtotal total;
                    189: #endif
                    190: 
                    191: struct forkstat
                    192: {
                    193:        int     cntfork;
                    194:        int     cntvfork;
                    195:        int     sizfork;
                    196:        int     sizvfork;
                    197: };
                    198: #ifdef KERNEL
                    199: struct forkstat forkstat;
                    200: #endif
                    201: 
                    202: struct swptstat
                    203: {
                    204:        int     pteasy;         /* easy pt swaps */
                    205:        int     ptexpand;       /* pt expansion swaps */
                    206:        int     ptshrink;       /* pt shrinking swaps */
                    207:        int     ptpack;         /* pt swaps involving spte copying */
                    208: };
                    209: #ifdef KERNEL
                    210: struct swptstat swptstat;
                    211: #endif
                    212: 
                    213: #ifdef KERNEL
                    214: int    freemem;                /* remaining blocks of free memory */
                    215: int    avefree;                /* moving average of remaining free blocks */
                    216: int    deficit;                /* estimate of needs of new swapped in procs */
                    217: int    nscan;                  /* number of scans in last second */
                    218: int    multprog;               /* current multiprogramming degree */
                    219: int    desscan;                /* desired pages scanned per second */
                    220: 
                    221: unsigned rectime;              /* accumulator for reclaim times */
                    222: unsigned pgintime;             /* accumulator for page in times */
                    223: 
                    224: /* writable copies of tunables */
                    225: int    maxpgio;                /* max paging i/o per sec before start swaps */
                    226: int    maxslp;                 /* max sleep time before very swappable */
                    227: int    lotsfree;               /* max free before clock freezes */
                    228: int    minfree;                /* minimum free pages before swapping begins */
                    229: int    desfree;                /* no of pages to try to keep free via daemon */
                    230: int    saferss;                /* no pages not to steal; decays with slptime */
                    231: #endif

unix.superglobalmegacorp.com

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