]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - arch/sparc/mm/tsb.c
sparc64: Eliminate PTE table memory wastage.
[karo-tx-linux.git] / arch / sparc / mm / tsb.c
index 70e50ea2a5b6d9ca48e5a34072ddf8e59a3d7e88..a35ee832baf38576ddc6e4e6c21bb1b7805ac083 100644 (file)
@@ -445,6 +445,8 @@ int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
        mm->context.huge_pte_count = 0;
 #endif
 
+       mm->context.pgtable_page = NULL;
+
        /* copy_mm() copies over the parent's mm_struct before calling
         * us, so we need to zero out the TSB pointer or else tsb_grow()
         * will be confused and think there is an older TSB to free up.
@@ -483,10 +485,17 @@ static void tsb_destroy_one(struct tsb_config *tp)
 void destroy_context(struct mm_struct *mm)
 {
        unsigned long flags, i;
+       struct page *page;
 
        for (i = 0; i < MM_NUM_TSBS; i++)
                tsb_destroy_one(&mm->context.tsb_block[i]);
 
+       page = mm->context.pgtable_page;
+       if (page && put_page_testzero(page)) {
+               pgtable_page_dtor(page);
+               free_hot_cold_page(page, 0);
+       }
+
        spin_lock_irqsave(&ctx_alloc_lock, flags);
 
        if (CTX_VALID(mm->context)) {