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