提交 d9d15998 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

no need to rcu_delayed free things that are refcounted

上级 55928725
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#define NOFILE 16 // open files per process #define NOFILE 16 // open files per process
#define NFILE 100 // open files per system #define NFILE 100 // open files per system
#define NBUF 10000 // size of disk block cache #define NBUF 10000 // size of disk block cache
#define NINODE 50 // maximum number of active i-nodes #define NINODE 1000 // maximum number of active i-nodes
#define NDEV 10 // maximum major device number #define NDEV 10 // maximum major device number
#define ROOTDEV 1 // device number of file system root disk #define ROOTDEV 1 // device number of file system root disk
#define MAXARG 32 // max exec arguments #define MAXARG 32 // max exec arguments
......
...@@ -388,21 +388,21 @@ vmn_free(struct vmnode *n) ...@@ -388,21 +388,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]) {
rcu_delayed(n->page[i], kfree); kfree(n->page[i]);
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;
rcu_delayed(n, kmfree); kmfree(n);
} }
static 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)
rcu_delayed(vmn_free, (void*)n); vmn_free(n);
} }
struct vmnode * struct vmnode *
...@@ -470,7 +470,7 @@ vma_free(void *p) ...@@ -470,7 +470,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);
rcu_delayed(e, kmfree); kmfree(e);
} }
static void static void
...@@ -479,9 +479,9 @@ vmap_free(void *p) ...@@ -479,9 +479,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])
rcu_delayed(m->e[i], vma_free); vma_free(m->e[i]);
} }
rcu_delayed(m->pgdir, (void*)freevm); freevm(m->pgdir);
m->pgdir = 0; m->pgdir = 0;
m->alloc = 0; m->alloc = 0;
} }
...@@ -490,7 +490,7 @@ void ...@@ -490,7 +490,7 @@ void
vmap_decref(struct vmap *m) vmap_decref(struct vmap *m)
{ {
if(__sync_sub_and_fetch(&m->ref, 1) == 0) if(__sync_sub_and_fetch(&m->ref, 1) == 0)
rcu_delayed(m, vmap_free); vmap_free(m);
} }
// Does any vma overlap start..start+len? // Does any vma overlap start..start+len?
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论