diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-02-04 15:48:09 (GMT) |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-02-04 15:48:09 (GMT) |
commit | 9df84993cb3d71669894654ab257f01f6e4ed48e (patch) | |
tree | 08e8c80dd35d465e59c002a50e1baf27f5eb1496 /arch/x86/mm/pageattr.c | |
parent | f07333fd149eb6826da26a89c3aff90324f270b0 (diff) | |
download | linux-fsl-qoriq-9df84993cb3d71669894654ab257f01f6e4ed48e.tar.xz |
x86: cpa, cleanups
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/mm/pageattr.c')
-rw-r--r-- | arch/x86/mm/pageattr.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 42ca3d8..029fb07 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c @@ -16,6 +16,9 @@ #include <asm/uaccess.h> #include <asm/pgalloc.h> +/* + * The current flushing context - we pass it instead of 5 arguments: + */ struct cpa_data { unsigned long vaddr; pgprot_t mask_set; @@ -206,6 +209,7 @@ pte_t *lookup_address(unsigned long address, int *level) if (pgd_none(*pgd)) return NULL; + pud = pud_offset(pgd, address); if (pud_none(*pud)) return NULL; @@ -223,9 +227,13 @@ pte_t *lookup_address(unsigned long address, int *level) return (pte_t *)pmd; *level = PG_LEVEL_4K; + return pte_offset_kernel(pmd, address); } +/* + * Set the new pmd in all the pgds we know about: + */ static void __set_pmd_pte(pte_t *kpte, unsigned long address, pte_t pte) { /* change init_mm */ @@ -248,8 +256,9 @@ static void __set_pmd_pte(pte_t *kpte, unsigned long address, pte_t pte) #endif } -static int try_preserve_large_page(pte_t *kpte, unsigned long address, - struct cpa_data *cpa) +static int +try_preserve_large_page(pte_t *kpte, unsigned long address, + struct cpa_data *cpa) { unsigned long nextpage_addr, numpages, pmask, psize, flags; pte_t new_pte, old_pte, *tmp; @@ -341,17 +350,18 @@ static int try_preserve_large_page(pte_t *kpte, unsigned long address, out_unlock: spin_unlock_irqrestore(&pgd_lock, flags); + return res; } static int split_large_page(pte_t *kpte, unsigned long address) { - pgprot_t ref_prot; - gfp_t gfp_flags = GFP_KERNEL; unsigned long flags, addr, pfn, pfninc = 1; + gfp_t gfp_flags = GFP_KERNEL; + unsigned int i, level; pte_t *pbase, *tmp; + pgprot_t ref_prot; struct page *base; - unsigned int i, level; #ifdef CONFIG_DEBUG_PAGEALLOC gfp_flags = GFP_ATOMIC | __GFP_NOWARN; @@ -505,7 +515,6 @@ repeat: * * Modules and drivers should use the set_memory_* APIs instead. */ - static int change_page_attr_addr(struct cpa_data *cpa) { int err; |