Kthread stack freeing is more "accurate"
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 31 May 2011 18:02:30 +0000 (11:02 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:03 +0000 (17:36 -0700)
The old version assumed stacktop was page aligned, and PGSIZE above its
actual page.  While this ought to be true on x86, it won't always be
(like if we put the struct kthread at the top of the page) or if we
offset the stacktops per-core (a debugging technique).

kern/src/kthread.c

index 29bdca5..8cbfca7 100644 (file)
@@ -131,9 +131,11 @@ void restart_kthread(struct kthread *kthread)
         * free our current kthread *before* popping it, nor can we free the current
         * stack until we pop to the kthread's stack). */
        if (pcpui->spare) {
-               /* this should probably have a rounddown, since it's not always the top,
-                * or even always PGSIZE... */
-               page_decref(kva2page((void*)pcpui->spare->stacktop - PGSIZE));
+               /* assumes the stack is a page, and that stacktop is somewhere in
+                * (pg_bottom, pg_bottom + PGSIZE].  Normally, it ought to be pg_bottom
+                * + PGSIZE (on x86).  kva2page can take any kva, not just a page
+                * aligned addr. */
+               page_decref(kva2page((void*)pcpui->spare->stacktop - 1));
                kmem_cache_free(kthread_kcache, pcpui->spare);
        }
        current_stacktop = get_stack_top();