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);
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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*);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue