From 24b908be8a3edb75a63683eb5008aba3c9a1bb52 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Mon, 27 May 2013 01:04:53 +0200 Subject: kernel: image reclaim pauses get a bit more verbose about process image exhaustion and make imagreclaim() try to get at least one image on the freelist. use rsrcwait() to notify the state, and call freebroken() in case imagereclaim() couldnt free any images. --- sys/src/9/port/segment.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sys/src/9/port/segment.c b/sys/src/9/port/segment.c index 98e9cbfa0..d3ad7cfbb 100644 --- a/sys/src/9/port/segment.c +++ b/sys/src/9/port/segment.c @@ -264,7 +264,10 @@ attachimage(int type, Chan *c, ulong base, ulong len) while(!(i = imagealloc.free)) { unlock(&imagealloc); imagereclaim(); - sched(); + if(!imagealloc.free){ + freebroken(); /* can use the memory */ + resrcwait("no image after reclaim"); + } lock(&imagealloc); } @@ -328,7 +331,7 @@ imagereclaim(void) * end of the list (see putpage) so start there and work * backward. */ - for(p = palloc.tail; p && p->image && n<1000; p = p->prev) { + for(p = palloc.tail; p && p->image && (n<1000 || !imagealloc.free); p = p->prev) { if(p->ref == 0 && canlock(p)) { if(p->ref == 0) { n++; -- cgit v1.2.3