summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-06-15 17:40:47 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2015-06-15 17:40:47 +0200
commit64ed3658d2abe3829f0619e8243c60edcc1d3815 (patch)
treeb90884b17338d65dca57d86924fb01462734f461 /sys
parentbce2696b17f4891e819958ed9e8f1adf8bdd97dc (diff)
kernel: add pagechaindone() to wakeup processes waiting for memory
we keep the details about palloc in page.c, providing pagechaindone() for mmu code to be called after a series of pagechainhead() calls.
Diffstat (limited to 'sys')
-rw-r--r--sys/src/9/alphapc/mmu.c4
-rw-r--r--sys/src/9/bcm/mmu.c6
-rw-r--r--sys/src/9/bitsy/mmu.c6
-rw-r--r--sys/src/9/kw/mmu.c4
-rw-r--r--sys/src/9/pc/mmu.c4
-rw-r--r--sys/src/9/port/page.c15
-rw-r--r--sys/src/9/port/portfns.h1
-rw-r--r--sys/src/9/teg2/mmu.c4
-rw-r--r--sys/src/9/xen/mmu.c4
-rw-r--r--sys/src/9/zynq/mmu.c4
10 files changed, 29 insertions, 23 deletions
diff --git a/sys/src/9/alphapc/mmu.c b/sys/src/9/alphapc/mmu.c
index 0e1e0bb64..21e1b74d7 100644
--- a/sys/src/9/alphapc/mmu.c
+++ b/sys/src/9/alphapc/mmu.c
@@ -110,8 +110,8 @@ mmurelease(Proc *proc)
panic("mmurelease: page->ref %d\n", page->ref);
pagechainhead(page);
}
- if(proc->mmufree && palloc.r.p)
- wakeup(&palloc.r);
+ if(proc->mmufree)
+ pagechaindone();
proc->mmufree = 0;
}
diff --git a/sys/src/9/bcm/mmu.c b/sys/src/9/bcm/mmu.c
index f068b387c..3ccf38ffc 100644
--- a/sys/src/9/bcm/mmu.c
+++ b/sys/src/9/bcm/mmu.c
@@ -183,11 +183,11 @@ mmurelease(Proc* proc)
for(page = proc->mmul2cache; page != nil; page = next){
next = page->next;
if(--page->ref)
- panic("mmurelease: page->ref %d", page->ref);
+ panic("mmurelease: page->ref %lud", page->ref);
pagechainhead(page);
}
- if(proc->mmul2cache && palloc.r.p)
- wakeup(&palloc.r);
+ if(proc->mmul2cache != nil)
+ pagechaindone();
proc->mmul2cache = nil;
mmul1empty();
diff --git a/sys/src/9/bitsy/mmu.c b/sys/src/9/bitsy/mmu.c
index ca7df136a..8b7624eaa 100644
--- a/sys/src/9/bitsy/mmu.c
+++ b/sys/src/9/bitsy/mmu.c
@@ -447,14 +447,14 @@ mmurelease(Proc* p)
mmuptefree(p);
- for(pg = p->mmufree; pg; pg = next){
+ for(pg = p->mmufree; pg != nil; pg = next){
next = pg->next;
if(--pg->ref)
panic("mmurelease: pg->ref %d\n", pg->ref);
pagechainhead(pg);
}
- if(p->mmufree && palloc.r.p)
- wakeup(&palloc.r);
+ if(p->mmufree != nil)
+ pagechaindone();
p->mmufree = nil;
memset(l1table, 0, sizeof(p->l1table));
diff --git a/sys/src/9/kw/mmu.c b/sys/src/9/kw/mmu.c
index 377b1a596..cd633d992 100644
--- a/sys/src/9/kw/mmu.c
+++ b/sys/src/9/kw/mmu.c
@@ -264,8 +264,8 @@ mmurelease(Proc* proc)
panic("mmurelease: page->ref %lud", page->ref);
pagechainhead(page);
}
- if(proc->mmul2cache && palloc.r.p)
- wakeup(&palloc.r);
+ if(proc->mmul2cache != nil)
+ pagechaindone();
proc->mmul2cache = nil;
mmul1empty();
diff --git a/sys/src/9/pc/mmu.c b/sys/src/9/pc/mmu.c
index 0994d7be2..cfcdf8793 100644
--- a/sys/src/9/pc/mmu.c
+++ b/sys/src/9/pc/mmu.c
@@ -365,8 +365,8 @@ mmurelease(Proc* proc)
panic("mmurelease: page->ref %ld", page->ref);
pagechainhead(page);
}
- if(proc->mmufree != nil && palloc.r.p != nil)
- wakeup(&palloc.r);
+ if(proc->mmufree != nil)
+ pagechaindone();
proc->mmufree = nil;
if(proc->ldt != nil){
free(proc->ldt);
diff --git a/sys/src/9/port/page.c b/sys/src/9/port/page.c
index 9da07b071..c16044512 100644
--- a/sys/src/9/port/page.c
+++ b/sys/src/9/port/page.c
@@ -71,6 +71,15 @@ pagechainhead(Page *p)
palloc.freecount++;
}
+void
+pagechaindone(void)
+{
+ if(palloc.pwait[0].p != nil && wakeup(&palloc.pwait[0]) != nil)
+ return;
+ if(palloc.pwait[1].p != nil)
+ wakeup(&palloc.pwait[1]);
+}
+
static void
freepages(Page *head, Page *tail, int n)
{
@@ -79,11 +88,7 @@ freepages(Page *head, Page *tail, int n)
palloc.head = head;
palloc.freecount += n;
unlock(&palloc);
-
- if(palloc.pwait[0].p != nil && wakeup(&palloc.pwait[0]) != nil)
- return;
- if(palloc.pwait[1].p != nil)
- wakeup(&palloc.pwait[1]);
+ pagechaindone();
}
int
diff --git a/sys/src/9/port/portfns.h b/sys/src/9/port/portfns.h
index e3b379e00..5fbcf1305 100644
--- a/sys/src/9/port/portfns.h
+++ b/sys/src/9/port/portfns.h
@@ -201,6 +201,7 @@ int okaddr(uintptr, ulong, int);
int openmode(ulong);
Block* packblock(Block*);
Block* padblock(Block*, int);
+void pagechaindone(void);
void pagechainhead(Page*);
void pageinit(void);
ulong pagenumber(Page*);
diff --git a/sys/src/9/teg2/mmu.c b/sys/src/9/teg2/mmu.c
index de6c819b8..fc7760eab 100644
--- a/sys/src/9/teg2/mmu.c
+++ b/sys/src/9/teg2/mmu.c
@@ -487,8 +487,8 @@ mmurelease(Proc* proc)
panic("mmurelease: page->ref %d", page->ref);
pagechainhead(page);
}
- if(proc->mmul2cache && palloc.r.p)
- wakeup(&palloc.r);
+ if(proc->mmul2cache != nil)
+ pagechaindone();
proc->mmul2cache = nil;
mmul1empty();
diff --git a/sys/src/9/xen/mmu.c b/sys/src/9/xen/mmu.c
index 9adc9cfea..c293fdaeb 100644
--- a/sys/src/9/xen/mmu.c
+++ b/sys/src/9/xen/mmu.c
@@ -288,8 +288,8 @@ mmurelease(Proc* proc)
panic("mmurelease: page->ref %ld\n", page->ref);
pagechainhead(page);
}
- if(proc->mmufree && palloc.r.p)
- wakeup(&palloc.r);
+ if(proc->mmufree)
+ pagechaindone();
proc->mmufree = 0;
}
diff --git a/sys/src/9/zynq/mmu.c b/sys/src/9/zynq/mmu.c
index d9d9e7cc1..4c561ae70 100644
--- a/sys/src/9/zynq/mmu.c
+++ b/sys/src/9/zynq/mmu.c
@@ -237,8 +237,8 @@ mmurelease(Proc *proc)
panic("mmurelease: p->ref %ld", p->ref);
pagechainhead(p);
}
- if(proc->mmufree != nil && palloc.r.p != nil)
- wakeup(&palloc.r);
+ if(proc->mmufree != nil)
+ pagechaindone();
proc->mmufree = nil;
}