summaryrefslogtreecommitdiff
path: root/sys/src/9/port/devsegment.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/src/9/port/devsegment.c')
-rw-r--r--sys/src/9/port/devsegment.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/sys/src/9/port/devsegment.c b/sys/src/9/port/devsegment.c
index fcaf8f3e4..dfbd34fbf 100644
--- a/sys/src/9/port/devsegment.c
+++ b/sys/src/9/port/devsegment.c
@@ -469,7 +469,7 @@ fixedseg(uintptr va, ulong len)
{
KMap *k;
Segment *s;
- Page **f, *p, *l, *h;
+ Page **f, *p, *l, *h, *t;
ulong n, i;
int color;
@@ -492,12 +492,13 @@ fixedseg(uintptr va, ulong len)
continue;
i = 0;
- h = nil;
+ h = t = nil;
f = &palloc.head;
while((p = *f) != nil){
if(p > &l[-len] && p <= l){
*f = p->next;
- p->next = h;
+ if((p->next = h) == nil)
+ t = p;
h = p;
if(++i < len)
continue;
@@ -505,15 +506,15 @@ fixedseg(uintptr va, ulong len)
}
f = &p->next;
}
- palloc.freecount -= i;
if(i != len){
- while((p = h) != nil){
- h = h->next;
- pagechainhead(p);
+ if(h != nil){
+ t->next = palloc.head;
+ palloc.head = h;
}
goto Retry;
}
+ palloc.freecount -= i;
unlock(&palloc);
p = &l[-len];