From ded52a53eeb4531c47e4a4cf1ac828082629084f Mon Sep 17 00:00:00 2001 From: Jeff Dike Date: Sat, 3 Sep 2005 15:57:52 -0700 Subject: [PATCH] --- yaml --- r: 7043 b: refs/heads/master c: 7ef939054139ef857cebbec07cbd12d7cf7beedd h: refs/heads/master i: 7041: 2b19f4ff215665598c373dc6ff9e580d05e24a48 7039: ab37f6a4bb4463ff0ed15d79f10570678d38ff23 v: v3 --- [refs] | 2 +- trunk/arch/um/kernel/skas/include/mmu-skas.h | 4 ++++ trunk/arch/um/kernel/skas/mmu.c | 9 ++++++++- trunk/include/asm-um/pgalloc.h | 12 +++++++----- trunk/include/asm-um/pgtable-3level.h | 9 +++------ 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/[refs] b/[refs] index cdd7ee152203..9c448ebac418 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f9dfefe423a7633d81310c7b06c5566c74f9167b +refs/heads/master: 7ef939054139ef857cebbec07cbd12d7cf7beedd diff --git a/trunk/arch/um/kernel/skas/include/mmu-skas.h b/trunk/arch/um/kernel/skas/include/mmu-skas.h index 278b72f1d9ad..09536f81ee42 100644 --- a/trunk/arch/um/kernel/skas/include/mmu-skas.h +++ b/trunk/arch/um/kernel/skas/include/mmu-skas.h @@ -6,11 +6,15 @@ #ifndef __SKAS_MMU_H #define __SKAS_MMU_H +#include "linux/config.h" #include "mm_id.h" struct mmu_context_skas { struct mm_id id; unsigned long last_page_table; +#ifdef CONFIG_3_LEVEL_PGTABLES + unsigned long last_pmd; +#endif }; extern void switch_mm_skas(struct mm_id * mm_idp); diff --git a/trunk/arch/um/kernel/skas/mmu.c b/trunk/arch/um/kernel/skas/mmu.c index d837223e22af..240143b616a2 100644 --- a/trunk/arch/um/kernel/skas/mmu.c +++ b/trunk/arch/um/kernel/skas/mmu.c @@ -56,6 +56,9 @@ static int init_stub_pte(struct mm_struct *mm, unsigned long proc, */ mm->context.skas.last_page_table = pmd_page_kernel(*pmd); +#ifdef CONFIG_3_LEVEL_PGTABLES + mm->context.skas.last_pmd = (unsigned long) __va(pud_val(*pud)); +#endif *pte = mk_pte(virt_to_page(kernel), __pgprot(_PAGE_PRESENT)); *pte = pte_mkexec(*pte); @@ -144,6 +147,10 @@ void destroy_context_skas(struct mm_struct *mm) if(!proc_mm || !ptrace_faultinfo){ free_page(mmu->id.stack); - free_page(mmu->last_page_table); + pte_free_kernel((pte_t *) mmu->last_page_table); + dec_page_state(nr_page_table_pages); +#ifdef CONFIG_3_LEVEL_PGTABLES + pmd_free((pmd_t *) mmu->last_pmd); +#endif } } diff --git a/trunk/include/asm-um/pgalloc.h b/trunk/include/asm-um/pgalloc.h index 8fcb2fc0a892..ea49411236dc 100644 --- a/trunk/include/asm-um/pgalloc.h +++ b/trunk/include/asm-um/pgalloc.h @@ -42,11 +42,13 @@ static inline void pte_free(struct page *pte) #define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte)) #ifdef CONFIG_3_LEVEL_PGTABLES -/* - * In the 3-level case we free the pmds as part of the pgd. - */ -#define pmd_free(x) do { } while (0) -#define __pmd_free_tlb(tlb,x) do { } while (0) + +extern __inline__ void pmd_free(pmd_t *pmd) +{ + free_page((unsigned long)pmd); +} + +#define __pmd_free_tlb(tlb,x) tlb_remove_page((tlb),virt_to_page(x)) #endif #define check_pgt_cache() do { } while (0) diff --git a/trunk/include/asm-um/pgtable-3level.h b/trunk/include/asm-um/pgtable-3level.h index 32cd6236f245..786c25727289 100644 --- a/trunk/include/asm-um/pgtable-3level.h +++ b/trunk/include/asm-um/pgtable-3level.h @@ -69,14 +69,11 @@ static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) return pmd; } -static inline void pmd_free(pmd_t *pmd){ - free_page((unsigned long) pmd); +extern inline void pud_clear (pud_t *pud) +{ + set_pud(pud, __pud(0)); } -#define __pmd_free_tlb(tlb,x) do { } while (0) - -static inline void pud_clear (pud_t * pud) { } - #define pud_page(pud) \ ((struct page *) __va(pud_val(pud) & PAGE_MASK))