M port/devcons.c => port/devcons.c +4 -0
@@ 216,6 216,10 @@ echo(Rune r, char *buf, int n)
case 'p':
procdump();
return;
+ case 'k':
+ if(!cpuserver)
+ killbig();
+ break;
case 'r':
exit(0);
break;
M port/devproc.c => port/devproc.c +26 -1
@@ 703,10 703,32 @@ procstopwait(Proc *p, int ctl)
}
void
+procctlfgrp(Fgrp *f)
+{
+ int i;
+ Chan *c;
+
+ lock(f);
+ f->ref++;
+ for(i = 0; i < f->maxfd; i++) {
+ c = f->fd[i];
+ if(c != 0) {
+ f->fd[i] = 0;
+ unlock(f);
+ close(c);
+ lock(f);
+ }
+ }
+ unlock(f);
+ closefgrp(f);
+}
+
+
+void
procctlreq(Proc *p, char *va, int n)
{
- char buf[NAMELEN];
int i;
+ char buf[NAMELEN];
if(n > NAMELEN)
n = NAMELEN;
@@ 754,6 776,9 @@ procctlreq(Proc *p, char *va, int n)
ready(p);
}
else
+ if(strncmp(buf, "closefgrp", 9) == 0)
+ procctlfgrp(p->fgrp);
+ else
if(strncmp(buf, "pri", 3) == 0){
if(n < 4)
error(Ebadctl);
M port/portdat.h => port/portdat.h +5 -4
@@ 297,11 297,12 @@ struct Swapalloc
{
Lock; /* Free map lock */
int free; /* currently free swap pages */
- uchar *swmap; /* Base of swap map in memory */
- uchar *alloc; /* Round robin allocator */
- uchar *last; /* Speed swap allocation */
- uchar *top; /* Top of swap map */
+ uchar* swmap; /* Base of swap map in memory */
+ uchar* alloc; /* Round robin allocator */
+ uchar* last; /* Speed swap allocation */
+ uchar* top; /* Top of swap map */
Rendez r; /* Pager kproc idle sleep */
+ Rendez pause;
ulong highwater; /* Pager start threshold */
ulong headroom; /* Space pager frees under highwater */
}swapalloc;
M port/swap.c => port/swap.c +1 -9
@@ 97,7 97,6 @@ void
pager(void *junk)
{
int i;
- Image *img;
Segment *s;
Proc *p, *ep;
@@ 120,13 119,6 @@ loop:
if(p->state == Dead || p->kp)
continue;
- /* don't swap out programs from devroot.c - they
- * supply important system services
- */
- img = p->seg[TSEG]->image;
- if(img && devchar[img->c->type] == '/')
- continue;
-
if(swapimage.c) {
for(i = 0; i < NSEG; i++) {
if(!needpages(junk))
@@ 161,7 153,7 @@ loop:
/* Emulate the old system if no swap channel */
print("no physical memory\n");
- tsleep(&swapalloc.r, return0, 0, 5000);
+ tsleep(&swapalloc.pause, return0, 0, 5000);
wakeup(&palloc.r);
}
}