M port/portfns.h => port/portfns.h +1 -0
@@ 107,6 107,7 @@ void kbdrepeat(int);
long keyread(char*, int, long);
long keywrite(char*, int);
void kickpager(void);
+void killbig(void);
int kprint(char*, ...);
void kproc(char*, void(*)(void*), void*);
void kprocchild(Proc*, void (*)(void*), void*);
M port/proc.c => port/proc.c +30 -0
@@ 798,3 798,33 @@ exhausted(char *resource)
sprint(buf, "no free %s", resource);
error(buf);
}
+
+void
+killbig(void)
+{
+ int i;
+ Segment *s;
+ ulong l, max;
+ Proc *p, *ep, *kp;
+
+ max = 0;
+ kp = 0;
+ ep = procalloc.arena+conf.nproc;
+ for(p = procalloc.arena; p < ep; p++) {
+ if(p->state == Dead || p->kp)
+ continue;
+ l = 0;
+ for(i=1; i<NSEG; i++){
+ s = p->seg[i];
+ if(s)
+ l += s->top - s->base;
+ }
+ if(l > max) {
+ kp = p;
+ max = l;
+ }
+ }
+ print("%d: %s killed because no swap configured", kp->pid, kp->text);
+ kp->procctl = Proc_exitme;
+ postnote(kp, 1, "killed: proc too big", NExit);
+}
M port/swap.c => port/swap.c +2 -0
@@ 154,6 154,8 @@ loop:
else {
if(!cpuserver)
freebroken(); /* can use the memory */
+ else
+ killbig();
/* Emulate the old system if no swap channel */
print("no physical memory\n");