Annotation of coherent/d/PS2_KERNEL/i286/krunch.c, revision 1.1.1.1

1.1       root        1: /* $Header: /kernel/kersrc/i286/RCS/krunch.c,v 1.1 92/07/17 15:21:29 bin Exp Locker: bin $ */
                      2: /*
                      3:  *     The  information  contained herein  is a trade secret  of INETCO
                      4:  *     Systems, and is confidential information.   It is provided under
                      5:  *     a license agreement,  and may be copied or disclosed  only under
                      6:  *     the terms of that agreement.   Any reproduction or disclosure of
                      7:  *     this  material  without  the express  written  authorization  of
                      8:  *     INETCO Systems or persuant to the license agreement is unlawful.
                      9:  *
                     10:  *     Copyright (c) 1987.
                     11:  *     An unpublished work by INETCO Systems, Ltd.
                     12:  *     All rights reserved.
                     13:  */
                     14: 
                     15: /*
                     16:  * Coherent.
                     17:  * Segment crunch.
                     18:  *
                     19:  * $Log:       krunch.c,v $
                     20:  * Revision 1.1  92/07/17  15:21:29  bin
                     21:  * Initial revision
                     22:  * 
                     23:  * Revision 1.1        88/03/24  17:39:33      src
                     24:  * Initial revision
                     25:  * 
                     26:  * 87/12/02    Allan Cornish   /usr/src/sys/i8086/src/krunch.c
                     27:  * krunch() now locks/unlocks segment gate.
                     28:  *
                     29:  * 87/11/26    Allan Cornish   /usr/src/sys/i8086/src/krunch.c
                     30:  * krunch() now called to merge unused memory by moving segments.
                     31:  */
                     32: #include <sys/coherent.h>
                     33: #include <sys/i8086.h>
                     34: #include <sys/proc.h>
                     35: #include <sys/seg.h>
                     36: 
                     37: /*
                     38:  * Time interval in clock ticks between krunch attempts: default 2 seconds.
                     39:  */
                     40: int KRUNCH = 200;
                     41: 
                     42: /**
                     43:  *
                     44:  * krunch( n )
                     45:  * int n;
                     46:  *
                     47:  *     Input:  n = maximum number of segments to be moved.
                     48:  *
                     49:  *     Action: Scan the segmentation list, looking for unused memory
                     50:  *             immediately below unlocked application segments,
                     51:  *             moving the segment down into the unused memory.
                     52:  */
                     53: krunch( n )
                     54: int n;
                     55: {
                     56:        register SEG *sp;
                     57:        paddr_t paddr;
                     58:        saddr_t osel;
                     59:        static TIM tim;
                     60:        int s;
                     61: 
                     62:        if ( depth != 0 ) {
                     63:                printf("krunch(%d,depth=%d) ", n, depth );      /** DEBUG **/
                     64:                return;
                     65:        }
                     66: 
                     67:        /*
                     68:         * Do not crunch segment list if swapper is active.
                     69:         */
                     70:        if ( (KRUNCH == 0) || (sexflag != 0) )
                     71:                return;
                     72: 
                     73:        /*
                     74:         * Segment count of 0 indicates a request to schedule delayed krunch(1).
                     75:         */
                     76:        if ( n <= 0 ) {
                     77:                if ( tim.t_last != NULL )
                     78:                        timeout( &tim, KRUNCH, krunch, 1 );
                     79:                return;
                     80:        }
                     81: 
                     82:        /*
                     83:         * Segmentation is locked - retry later.
                     84:         */
                     85:        s = sphi();
                     86:        if ( locked(seglink) ) {
                     87:                timeout( &tim, KRUNCH, krunch, n );
                     88:                spl(s);
                     89:                return;
                     90:        }
                     91:        lock(seglink);
                     92:        spl(s);
                     93: 
                     94: #if EBUG > 1
                     95:        printf("krunch(%d) ", n );
                     96: #endif
                     97: 
                     98:        for ( paddr = corebot, sp = &segmq;
                     99:              (sp = sp->s_forw) != &segmq ;
                    100:              paddr = sp->s_paddr + sp->s_size ) {
                    101: 
                    102:                /*
                    103:                 * No hole exists.
                    104:                 */
                    105:                if ( paddr == sp->s_paddr )
                    106:                        continue;
                    107: 
                    108: #if EBUG > 1
                    109:                printf("hole(p=%X,n=%X) seg(p=%X,n=%X,f=%x,u=%x,l=%x) ",
                    110:                        paddr,
                    111:                        sp->s_paddr - paddr,
                    112:                        sp->s_paddr,
                    113:                        sp->s_size,
                    114:                        sp->s_flags & (SFSYST|SFHIGH),
                    115:                        sp->s_urefc,
                    116:                        sp->s_lrefc );
                    117: #endif
                    118: 
                    119:                /*
                    120:                 * Don't try to shuffle high segments into low memory.
                    121:                 */
                    122:                if ( sp->s_flags & SFHIGH )
                    123:                        break;
                    124: 
                    125:                /*
                    126:                 * System segment.
                    127:                 */
                    128:                if ( sp->s_flags & SFSYST )
                    129:                        continue;
                    130: 
                    131:                /*
                    132:                 * Segment may be in process of being swapped in/out.
                    133:                 */
                    134:                if ( (sp->s_flags & SFCORE) == 0 )
                    135:                        continue;
                    136: 
                    137:                /*
                    138:                 * Segment is locked for I/O.
                    139:                 */
                    140:                if ( sp->s_lrefc != sp->s_urefc )
                    141:                        continue;
                    142: 
                    143: #if EBUG > 0
                    144:                printf("move(dst=%X,src=%X,len=%X) ",
                    145:                        paddr, sp->s_paddr,sp->s_size );
                    146: #endif
                    147:                /*
                    148:                 * Remember previous virtual address.
                    149:                 */
                    150:                osel = FP_SEL(sp->s_faddr);
                    151: 
                    152:                /*
                    153:                 * Shift segment into the hole.
                    154:                 */
                    155:                plrcopy( sp->s_paddr, paddr, sp->s_size );
                    156:                sp->s_paddr = paddr;
                    157:                vremap( sp );
                    158: 
                    159: #if EBUG > 0
                    160:                if ( FP_SEL(sp->s_faddr) != osel ) {
                    161:                        printf("krunch: osel=%x nsel=%x\n",
                    162:                                osel, FP_SEL(sp->s_faddr) );
                    163:                }
                    164: #endif
                    165: 
                    166:                /*
                    167:                 * Ensure user segmentation is updated.
                    168:                 * We may have moved the current process.
                    169:                 */
                    170:                if ( (SELF->p_pid != 0) && ((ucs == osel) || (uds == osel)) )
                    171:                        segload();
                    172:                if ( uasa == osel )
                    173:                        uasa = FP_SEL(sp->s_faddr);
                    174: 
                    175:                /*
                    176:                 * Crunch count reached.
                    177:                 */
                    178:                if ( --n <= 0 )
                    179:                        break;
                    180:        }
                    181: 
                    182:        /*
                    183:         * Cancel timer if all low memory holes eliminated.
                    184:         */
                    185:        if ( (KRUNCH == 0) || (sp == &segmq) || (sp->s_flags & SFHIGH) )
                    186:                timeout( &tim, 0, NULL, 0 );
                    187: 
                    188:        /*
                    189:         * Attempt to crunch another segment in KRUNCH clock ticks.
                    190:         */
                    191:        else
                    192:                timeout( &tim, KRUNCH, krunch, 1 );
                    193: 
                    194:        unlock(seglink);
                    195: 
                    196: #if EBUG > 0
                    197:        printf("\n");
                    198: #endif
                    199: }

unix.superglobalmegacorp.com

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