提交 20a7c8e8 创建 作者: Frans Kaashoek's avatar Frans Kaashoek

rcu delay VM structures

上级 2623b3bd
...@@ -76,7 +76,7 @@ void ioapicinit(void); ...@@ -76,7 +76,7 @@ void ioapicinit(void);
char* pgalloc(void); char* pgalloc(void);
void kinit(void); void kinit(void);
char* kalloc(void); char* kalloc(void);
void kfree(char*); void kfree(void *);
void* kmalloc(uint); void* kmalloc(uint);
void kmfree(void*); void kmfree(void*);
......
...@@ -84,7 +84,7 @@ kfree_pool(struct kmem *m, char *v) ...@@ -84,7 +84,7 @@ kfree_pool(struct kmem *m, char *v)
} }
void void
kfree(char *v) kfree(void *v)
{ {
kfree_pool(kmem, v); kfree_pool(kmem, v);
} }
......
...@@ -1559,7 +1559,9 @@ main(int argc, char *argv[]) ...@@ -1559,7 +1559,9 @@ main(int argc, char *argv[])
unopentest(); unopentest();
bigargtest(); bigargtest();
bsstest(); bsstest();
sbrktest(); // sbrktest(); // XXX memory layout has changed. tests needs to be changed
// we should be able to grow a user process to consume all phys mem
validatetest(); validatetest();
opentest(); opentest();
......
...@@ -340,7 +340,7 @@ freevm(pde_t *pgdir) ...@@ -340,7 +340,7 @@ freevm(pde_t *pgdir)
if(pgdir[i] & PTE_P) if(pgdir[i] & PTE_P)
kfree(p2v(PTE_ADDR(pgdir[i]))); kfree(p2v(PTE_ADDR(pgdir[i])));
} }
kfree((char*)pgdir); kfree(pgdir);
} }
struct vmnode * struct vmnode *
...@@ -390,21 +390,21 @@ vmn_free(struct vmnode *n) ...@@ -390,21 +390,21 @@ vmn_free(struct vmnode *n)
{ {
for(uint i = 0; i < n->npages; i++) { for(uint i = 0; i < n->npages; i++) {
if (n->page[i]) { if (n->page[i]) {
kfree((char *) n->page[i]); kfree(n->page[i]); // vmn_free is rcu delayed, when kfree must be delayed, don't delay
n->page[i] = 0; n->page[i] = 0;
} }
} }
if (n->ip) if (n->ip)
iput(n->ip); iput(n->ip);
n->ip = 0; n->ip = 0;
kmfree(n); kmfree(n); // vmn_free is rcu delayed, when kmfree must be delayed, don't delay again
} }
void static void
vmn_decref(struct vmnode *n) vmn_decref(struct vmnode *n)
{ {
if(__sync_sub_and_fetch(&n->ref, 1) == 0) if(__sync_sub_and_fetch(&n->ref, 1) == 0)
vmn_free(n); vmn_free(n); // XXX delay?
} }
struct vmnode * struct vmnode *
...@@ -472,7 +472,7 @@ vma_free(void *p) ...@@ -472,7 +472,7 @@ vma_free(void *p)
struct vma *e = (struct vma *) p; struct vma *e = (struct vma *) p;
if(e->n) if(e->n)
vmn_decref(e->n); vmn_decref(e->n);
kmfree(e); kmfree(e); // already rcu delayed
} }
static void static void
...@@ -481,9 +481,9 @@ vmap_free(void *p) ...@@ -481,9 +481,9 @@ vmap_free(void *p)
struct vmap *m = (struct vmap *) p; struct vmap *m = (struct vmap *) p;
for(uint i = 0; i < NELEM(m->e); i++) { for(uint i = 0; i < NELEM(m->e); i++) {
if (m->e[i]) if (m->e[i])
vma_free(m->e[i]); vma_free(m->e[i]); // already rcu delayed
} }
freevm(m->pgdir); freevm(m->pgdir); // already rcu delayed
m->pgdir = 0; m->pgdir = 0;
m->alloc = 0; m->alloc = 0;
} }
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论