kernel: fix checkpages() and segflush() on SG_PHYSICAL type segments
do not touch s->map on SG_PHYSICAL type segments as they do not have a pte map (s->mapsize == 0 && s->map == nil). also remove the SG_PHYSICAL switch in freepte(), this is never reached.
This commit is contained in:
parent
0099db7b5b
commit
dbfec06bf1
4 changed files with 33 additions and 43 deletions
|
@ -438,14 +438,16 @@ checkpages(void)
|
|||
if((s = *sp) == nil)
|
||||
continue;
|
||||
qlock(s);
|
||||
for(addr=s->base; addr<s->top; addr+=BY2PG){
|
||||
off = addr - s->base;
|
||||
if((p = s->map[off/PTEMAPMEM]) == nil)
|
||||
continue;
|
||||
pg = p->pages[(off&(PTEMAPMEM-1))/BY2PG];
|
||||
if(pagedout(pg))
|
||||
continue;
|
||||
checkmmu(addr, pg->pa);
|
||||
if(s->mapsize > 0){
|
||||
for(addr=s->base; addr<s->top; addr+=BY2PG){
|
||||
off = addr - s->base;
|
||||
if((p = s->map[off/PTEMAPMEM]) == nil)
|
||||
continue;
|
||||
pg = p->pages[(off&(PTEMAPMEM-1))/BY2PG];
|
||||
if(pagedout(pg))
|
||||
continue;
|
||||
checkmmu(addr, pg->pa);
|
||||
}
|
||||
}
|
||||
qunlock(s);
|
||||
}
|
||||
|
|
|
@ -377,21 +377,10 @@ freepte(Segment *s, Pte *p)
|
|||
|
||||
pg = p->first;
|
||||
pe = p->last;
|
||||
|
||||
switch(s->type&SG_TYPE) {
|
||||
case SG_PHYSICAL:
|
||||
while(pg <= pe){
|
||||
if(*pg != nil && decref(*pg) == 0)
|
||||
free(*pg);
|
||||
pg++;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
while(pg <= pe){
|
||||
if(*pg != nil)
|
||||
putpage(*pg);
|
||||
pg++;
|
||||
}
|
||||
while(pg <= pe){
|
||||
if(*pg != nil)
|
||||
putpage(*pg);
|
||||
pg++;
|
||||
}
|
||||
free(p);
|
||||
}
|
||||
|
|
|
@ -64,8 +64,11 @@ newseg(int type, uintptr base, ulong size)
|
|||
s->sema.prev = &s->sema;
|
||||
s->sema.next = &s->sema;
|
||||
|
||||
if((type & SG_TYPE) == SG_PHYSICAL)
|
||||
if((type & SG_TYPE) == SG_PHYSICAL){
|
||||
s->map = nil;
|
||||
s->mapsize = 0;
|
||||
return s;
|
||||
}
|
||||
|
||||
mapsize = ROUND(size, PTEPERTAB)/PTEPERTAB;
|
||||
if(mapsize > nelem(s->ssegmap)){
|
||||
|
@ -477,9 +480,6 @@ mcountseg(Segment *s)
|
|||
Page **pg, **pe;
|
||||
ulong pages;
|
||||
|
||||
if((s->type&SG_TYPE) == SG_PHYSICAL)
|
||||
return 0;
|
||||
|
||||
pages = 0;
|
||||
emap = &s->map[s->mapsize];
|
||||
for(pte = s->map; pte < emap; pte++){
|
||||
|
@ -706,26 +706,25 @@ segflush(void *va, uintptr len)
|
|||
s->flushme = 1;
|
||||
more:
|
||||
len = (s->top < to ? s->top : to) - from;
|
||||
off = from-s->base;
|
||||
pte = s->map[off/PTEMAPMEM];
|
||||
off &= PTEMAPMEM-1;
|
||||
if(off+len > PTEMAPMEM)
|
||||
len = PTEMAPMEM-off;
|
||||
|
||||
if(pte != nil) {
|
||||
pg = &pte->pages[off/BY2PG];
|
||||
pe = pg + len/BY2PG;
|
||||
while(pg < pe) {
|
||||
if(!pagedout(*pg))
|
||||
(*pg)->txtflush = ~0;
|
||||
pg++;
|
||||
if(s->mapsize > 0){
|
||||
off = from-s->base;
|
||||
pte = s->map[off/PTEMAPMEM];
|
||||
off &= PTEMAPMEM-1;
|
||||
if(off+len > PTEMAPMEM)
|
||||
len = PTEMAPMEM-off;
|
||||
if(pte != nil) {
|
||||
pg = &pte->pages[off/BY2PG];
|
||||
pe = pg + len/BY2PG;
|
||||
while(pg < pe) {
|
||||
if(!pagedout(*pg))
|
||||
(*pg)->txtflush = ~0;
|
||||
pg++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
from += len;
|
||||
if(from < to && from < s->top)
|
||||
goto more;
|
||||
|
||||
qunlock(s);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,7 +54,7 @@ proc0(void*)
|
|||
kunmap(k);
|
||||
p->txtflush = ~0;
|
||||
segpage(up->seg[TSEG], p);
|
||||
up->seg[TSEG]->flushme++;
|
||||
up->seg[TSEG]->flushme = 1;
|
||||
|
||||
/*
|
||||
* Become a user process.
|
||||
|
|
Loading…
Reference in a new issue