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.
This commit is contained in:
cinap_lenrek 2015-06-15 17:40:47 +02:00
parent bce2696b17
commit 64ed3658d2
10 changed files with 29 additions and 23 deletions

View file

@ -110,8 +110,8 @@ mmurelease(Proc *proc)
panic("mmurelease: page->ref %d\n", page->ref); panic("mmurelease: page->ref %d\n", page->ref);
pagechainhead(page); pagechainhead(page);
} }
if(proc->mmufree && palloc.r.p) if(proc->mmufree)
wakeup(&palloc.r); pagechaindone();
proc->mmufree = 0; proc->mmufree = 0;
} }

View file

@ -183,11 +183,11 @@ mmurelease(Proc* proc)
for(page = proc->mmul2cache; page != nil; page = next){ for(page = proc->mmul2cache; page != nil; page = next){
next = page->next; next = page->next;
if(--page->ref) if(--page->ref)
panic("mmurelease: page->ref %d", page->ref); panic("mmurelease: page->ref %lud", page->ref);
pagechainhead(page); pagechainhead(page);
} }
if(proc->mmul2cache && palloc.r.p) if(proc->mmul2cache != nil)
wakeup(&palloc.r); pagechaindone();
proc->mmul2cache = nil; proc->mmul2cache = nil;
mmul1empty(); mmul1empty();

View file

@ -447,14 +447,14 @@ mmurelease(Proc* p)
mmuptefree(p); mmuptefree(p);
for(pg = p->mmufree; pg; pg = next){ for(pg = p->mmufree; pg != nil; pg = next){
next = pg->next; next = pg->next;
if(--pg->ref) if(--pg->ref)
panic("mmurelease: pg->ref %d\n", pg->ref); panic("mmurelease: pg->ref %d\n", pg->ref);
pagechainhead(pg); pagechainhead(pg);
} }
if(p->mmufree && palloc.r.p) if(p->mmufree != nil)
wakeup(&palloc.r); pagechaindone();
p->mmufree = nil; p->mmufree = nil;
memset(l1table, 0, sizeof(p->l1table)); memset(l1table, 0, sizeof(p->l1table));

View file

@ -264,8 +264,8 @@ mmurelease(Proc* proc)
panic("mmurelease: page->ref %lud", page->ref); panic("mmurelease: page->ref %lud", page->ref);
pagechainhead(page); pagechainhead(page);
} }
if(proc->mmul2cache && palloc.r.p) if(proc->mmul2cache != nil)
wakeup(&palloc.r); pagechaindone();
proc->mmul2cache = nil; proc->mmul2cache = nil;
mmul1empty(); mmul1empty();

View file

@ -365,8 +365,8 @@ mmurelease(Proc* proc)
panic("mmurelease: page->ref %ld", page->ref); panic("mmurelease: page->ref %ld", page->ref);
pagechainhead(page); pagechainhead(page);
} }
if(proc->mmufree != nil && palloc.r.p != nil) if(proc->mmufree != nil)
wakeup(&palloc.r); pagechaindone();
proc->mmufree = nil; proc->mmufree = nil;
if(proc->ldt != nil){ if(proc->ldt != nil){
free(proc->ldt); free(proc->ldt);

View file

@ -71,6 +71,15 @@ pagechainhead(Page *p)
palloc.freecount++; 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 static void
freepages(Page *head, Page *tail, int n) freepages(Page *head, Page *tail, int n)
{ {
@ -79,11 +88,7 @@ freepages(Page *head, Page *tail, int n)
palloc.head = head; palloc.head = head;
palloc.freecount += n; palloc.freecount += n;
unlock(&palloc); unlock(&palloc);
pagechaindone();
if(palloc.pwait[0].p != nil && wakeup(&palloc.pwait[0]) != nil)
return;
if(palloc.pwait[1].p != nil)
wakeup(&palloc.pwait[1]);
} }
int int

View file

@ -201,6 +201,7 @@ int okaddr(uintptr, ulong, int);
int openmode(ulong); int openmode(ulong);
Block* packblock(Block*); Block* packblock(Block*);
Block* padblock(Block*, int); Block* padblock(Block*, int);
void pagechaindone(void);
void pagechainhead(Page*); void pagechainhead(Page*);
void pageinit(void); void pageinit(void);
ulong pagenumber(Page*); ulong pagenumber(Page*);

View file

@ -487,8 +487,8 @@ mmurelease(Proc* proc)
panic("mmurelease: page->ref %d", page->ref); panic("mmurelease: page->ref %d", page->ref);
pagechainhead(page); pagechainhead(page);
} }
if(proc->mmul2cache && palloc.r.p) if(proc->mmul2cache != nil)
wakeup(&palloc.r); pagechaindone();
proc->mmul2cache = nil; proc->mmul2cache = nil;
mmul1empty(); mmul1empty();

View file

@ -288,8 +288,8 @@ mmurelease(Proc* proc)
panic("mmurelease: page->ref %ld\n", page->ref); panic("mmurelease: page->ref %ld\n", page->ref);
pagechainhead(page); pagechainhead(page);
} }
if(proc->mmufree && palloc.r.p) if(proc->mmufree)
wakeup(&palloc.r); pagechaindone();
proc->mmufree = 0; proc->mmufree = 0;
} }

View file

@ -237,8 +237,8 @@ mmurelease(Proc *proc)
panic("mmurelease: p->ref %ld", p->ref); panic("mmurelease: p->ref %ld", p->ref);
pagechainhead(p); pagechainhead(p);
} }
if(proc->mmufree != nil && palloc.r.p != nil) if(proc->mmufree != nil)
wakeup(&palloc.r); pagechaindone();
proc->mmufree = nil; proc->mmufree = nil;
} }