提交 e65d0098 创建 作者: Silas Boyd-Wickizer's avatar Silas Boyd-Wickizer

Fix a bug with freeing kernel stacks.

proc.c was using kfree, which places the two page stacks on the single page free lists.
上级 bfae3e6a
......@@ -395,3 +395,9 @@ kfree(void *v)
{
kfree_pool(mykmem(), v);
}
void
ksfree(slab_t slab, void *v)
{
kfree_pool(slabmem[slab], v);
}
......@@ -142,8 +142,9 @@ typedef enum {
slab_perf,
} slab_t;
char* kalloc(void);
void kfree(void*);
void* ksalloc(slab_t);
void kfree(void *);
void ksfree(slab_t, void*);
void* kmalloc(u64);
void kmfree(void*);
......
......@@ -563,8 +563,8 @@ fork(int flags)
if(flags == 0) {
// Copy process state from p.
if((np->vmap = vmap_copy(myproc()->vmap, cow)) == 0){
kfree(np->kstack);
np->kstack = 0;
ksfree(slab_stack, np->kstack);
np->kstack = NULL;
np->state = UNUSED;
if (ns_remove(nspid, KI(np->pid), np) == 0)
panic("fork: ns_remove");
......@@ -624,8 +624,8 @@ wait(void)
pid = p->pid;
SLIST_REMOVE(&myproc()->childq, p, proc, child_next);
release(&myproc()->lock);
kfree(p->kstack);
p->kstack = 0;
ksfree(slab_stack, p->kstack);
p->kstack = NULL;
vmap_decref(p->vmap);
p->state = UNUSED;
if (ns_remove(nspid, KI(p->pid), p) == 0)
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论