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:
parent
bce2696b17
commit
64ed3658d2
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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*);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue