From 4e8f237be819424f922399f8d121d9867b675541 Mon Sep 17 00:00:00 2001 From: rtm Date: Wed, 12 Jul 2006 01:48:35 +0000 Subject: no more big kernel lock succeeds at usertests.c pipe test --- kalloc.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'kalloc.c') diff --git a/kalloc.c b/kalloc.c index b14a69a..969b81d 100644 --- a/kalloc.c +++ b/kalloc.c @@ -10,6 +10,9 @@ #include "param.h" #include "types.h" #include "defs.h" +#include "spinlock.h" + +struct spinlock kalloc_lock; struct run { struct run *next; @@ -54,6 +57,8 @@ kfree(char *cp, int len) for(i = 0; i < len; i++) cp[i] = 1; + acquire(&kalloc_lock); + rr = &freelist; while(*rr){ struct run *rend = (struct run *) ((char *)(*rr) + (*rr)->len); @@ -63,13 +68,13 @@ kfree(char *cp, int len) p->len = len + (*rr)->len; p->next = (*rr)->next; *rr = p; - return; + goto out; } if(pend < *rr){ p->len = len; p->next = *rr; *rr = p; - return; + goto out; } if(p == rend){ (*rr)->len += len; @@ -77,13 +82,16 @@ kfree(char *cp, int len) (*rr)->len += (*rr)->next->len; (*rr)->next = (*rr)->next->next; } - return; + goto out; } rr = &((*rr)->next); } p->len = len; p->next = 0; *rr = p; + + out: + release(&kalloc_lock); } /* @@ -99,20 +107,25 @@ kalloc(int n) if(n % PAGE) panic("kalloc"); + acquire(&kalloc_lock); + rr = &freelist; while(*rr){ struct run *r = *rr; if(r->len == n){ *rr = r->next; + release(&kalloc_lock); return (char *) r; } if(r->len > n){ char *p = (char *)r + (r->len - n); r->len -= n; + release(&kalloc_lock); return p; } rr = &(*rr)->next; } + release(&kalloc_lock); return 0; } -- cgit v1.2.3