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

Free crange

上级 3cc3aa9c
...@@ -41,7 +41,7 @@ struct crange { ...@@ -41,7 +41,7 @@ struct crange {
} cr; } cr;
struct crange* struct crange*
crange_init(int nlevel) crange_alloc(int nlevel)
{ {
struct crange *cr = kmalloc(sizeof(struct crange)); struct crange *cr = kmalloc(sizeof(struct crange));
cr->nlevel = (nlevel < MINNLEVEL) ? MINNLEVEL : nlevel; // XXX cr->nlevel = (nlevel < MINNLEVEL) ? MINNLEVEL : nlevel; // XXX
...@@ -50,10 +50,28 @@ crange_init(int nlevel) ...@@ -50,10 +50,28 @@ crange_init(int nlevel)
initlock(cr->crange_head.lock, "head lock"); initlock(cr->crange_head.lock, "head lock");
cr->crange_head.next = kmalloc(sizeof(cr->crange_head.next[0]) * nlevel); cr->crange_head.next = kmalloc(sizeof(cr->crange_head.next[0]) * nlevel);
for (int l = 0; l < nlevel; l++) cr->crange_head.next[l] = 0; for (int l = 0; l < nlevel; l++) cr->crange_head.next[l] = 0;
if (crange_debug) cprintf("crange_init: return 0x%x\n", cr); if (crange_debug) cprintf("crange_alloc: return 0x%x\n", cr);
return cr; return cr;
} }
static void clist_range_free(void *p);
void
crange_free(struct crange *cr)
{
assert(cr);
if (crange_debug) cprintf("crange_free: 0x%x\n", cr);
struct clist_range *e, *n;
for (e = RANGE_WOMARK(cr->crange_head.next[0]); e; e = n) {
n = RANGE_WOMARK(e->next[0]);
clist_range_free(e);
}
kmfree(cr->crange_head.next);
kmfree(cr->crange_head.lock);
kmfree(cr);
}
// draw nlevel in [1, nlevel] // draw nlevel in [1, nlevel]
static int static int
crange_draw_nlevel(int nlevel) crange_draw_nlevel(int nlevel)
...@@ -137,7 +155,7 @@ crange_check(struct crange *cr, int lockcheck, struct clist_range *absent) ...@@ -137,7 +155,7 @@ crange_check(struct crange *cr, int lockcheck, struct clist_range *absent)
} }
static void static void
crange_free(void *p) clist_range_free(void *p)
{ {
struct clist_range *e = (struct clist_range *) p; struct clist_range *e = (struct clist_range *) p;
// cprintf("crange_free: %u(%u)\n", e->key, e->size); // cprintf("crange_free: %u(%u)\n", e->key, e->size);
...@@ -145,9 +163,9 @@ crange_free(void *p) ...@@ -145,9 +163,9 @@ crange_free(void *p)
for (int l = 0; l < e->nlevel; l++) { for (int l = 0; l < e->nlevel; l++) {
e->next[l] = (struct clist_range *) 0xDEADBEEF; e->next[l] = (struct clist_range *) 0xDEADBEEF;
} }
kfree(e->lock); kmfree(e->lock);
kfree(e->next); kmfree(e->next);
kfree(e); kmfree(e);
} }
static void static void
...@@ -155,7 +173,7 @@ crange_free_delayed(struct clist_range *e) ...@@ -155,7 +173,7 @@ crange_free_delayed(struct clist_range *e)
{ {
// cprintf("crange_free_delayed: 0x%lx %u(%u) %u\n", (long) e, (e)->key, (e)->size, myepoch); // cprintf("crange_free_delayed: 0x%lx %u(%u) %u\n", (long) e, (e)->key, (e)->size, myepoch);
crange_check(e->cr, 0, e); crange_check(e->cr, 0, e);
gc_delayed(e, crange_free); gc_delayed(e, clist_range_free);
} }
static struct clist_range * static struct clist_range *
......
...@@ -73,7 +73,8 @@ struct clist_range { ...@@ -73,7 +73,8 @@ struct clist_range {
struct crange; struct crange;
struct crange* crange_init(int nlevel); struct crange* crange_alloc(int nlevel);
void crange_free(struct crange *cr);
void crange_del(struct crange *cr, u64 k, u64 sz); void crange_del(struct crange *cr, u64 k, u64 sz);
void crange_add(struct crange *cr, u64 k, u64 sz, void *v); void crange_add(struct crange *cr, u64 k, u64 sz, void *v);
struct clist_range* crange_search(struct crange *cr, u64 k); struct clist_range* crange_search(struct crange *cr, u64 k);
......
...@@ -116,7 +116,7 @@ vmap_alloc(void) ...@@ -116,7 +116,7 @@ vmap_alloc(void)
return 0; return 0;
} }
#ifdef TREE #ifdef TREE
m->cr = crange_init(10); m->cr = crange_alloc(10);
if (m->cr == 0) if (m->cr == 0)
return 0; return 0;
#endif #endif
...@@ -326,6 +326,7 @@ vmap_free(void *p) ...@@ -326,6 +326,7 @@ vmap_free(void *p)
{ {
struct vmap *m = (struct vmap *) p; struct vmap *m = (struct vmap *) p;
crange_foreach(m->cr, vmap_free_vma, NULL); crange_foreach(m->cr, vmap_free_vma, NULL);
crange_free(m->cr);
freevm(m->pml4); freevm(m->pml4);
m->pml4 = 0; m->pml4 = 0;
m->alloc = 0; m->alloc = 0;
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论