From 64ed3658d2abe3829f0619e8243c60edcc1d3815 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Mon, 15 Jun 2015 17:40:47 +0200 Subject: [PATCH] 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. --- sys/src/9/alphapc/mmu.c | 4 ++-- sys/src/9/bcm/mmu.c | 6 +++--- sys/src/9/bitsy/mmu.c | 6 +++--- sys/src/9/kw/mmu.c | 4 ++-- sys/src/9/pc/mmu.c | 4 ++-- sys/src/9/port/page.c | 15 ++++++++++----- sys/src/9/port/portfns.h | 1 + sys/src/9/teg2/mmu.c | 4 ++-- sys/src/9/xen/mmu.c | 4 ++-- sys/src/9/zynq/mmu.c | 4 ++-- 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; }