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