aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-02-04 10:48:09 -0500
committerIngo Molnar <mingo@elte.hu>2008-02-04 10:48:09 -0500
commit9df84993cb3d71669894654ab257f01f6e4ed48e (patch)
tree08e8c80dd35d465e59c002a50e1baf27f5eb1496
parentf07333fd149eb6826da26a89c3aff90324f270b0 (diff)
x86: cpa, cleanups
Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r--arch/x86/mm/pageattr.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 42ca3d8effad..029fb07b3f03 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -16,6 +16,9 @@
16#include <asm/uaccess.h> 16#include <asm/uaccess.h>
17#include <asm/pgalloc.h> 17#include <asm/pgalloc.h>
18 18
19/*
20 * The current flushing context - we pass it instead of 5 arguments:
21 */
19struct cpa_data { 22struct cpa_data {
20 unsigned long vaddr; 23 unsigned long vaddr;
21 pgprot_t mask_set; 24 pgprot_t mask_set;
@@ -206,6 +209,7 @@ pte_t *lookup_address(unsigned long address, int *level)
206 209
207 if (pgd_none(*pgd)) 210 if (pgd_none(*pgd))
208 return NULL; 211 return NULL;
212
209 pud = pud_offset(pgd, address); 213 pud = pud_offset(pgd, address);
210 if (pud_none(*pud)) 214 if (pud_none(*pud))
211 return NULL; 215 return NULL;
@@ -223,9 +227,13 @@ pte_t *lookup_address(unsigned long address, int *level)
223 return (pte_t *)pmd; 227 return (pte_t *)pmd;
224 228
225 *level = PG_LEVEL_4K; 229 *level = PG_LEVEL_4K;
230
226 return pte_offset_kernel(pmd, address); 231 return pte_offset_kernel(pmd, address);
227} 232}
228 233
234/*
235 * Set the new pmd in all the pgds we know about:
236 */
229static void __set_pmd_pte(pte_t *kpte, unsigned long address, pte_t pte) 237static void __set_pmd_pte(pte_t *kpte, unsigned long address, pte_t pte)
230{ 238{
231 /* change init_mm */ 239 /* change init_mm */
@@ -248,8 +256,9 @@ static void __set_pmd_pte(pte_t *kpte, unsigned long address, pte_t pte)
248#endif 256#endif
249} 257}
250 258
251static int try_preserve_large_page(pte_t *kpte, unsigned long address, 259static int
252 struct cpa_data *cpa) 260try_preserve_large_page(pte_t *kpte, unsigned long address,
261 struct cpa_data *cpa)
253{ 262{
254 unsigned long nextpage_addr, numpages, pmask, psize, flags; 263 unsigned long nextpage_addr, numpages, pmask, psize, flags;
255 pte_t new_pte, old_pte, *tmp; 264 pte_t new_pte, old_pte, *tmp;
@@ -341,17 +350,18 @@ static int try_preserve_large_page(pte_t *kpte, unsigned long address,
341 350
342out_unlock: 351out_unlock:
343 spin_unlock_irqrestore(&pgd_lock, flags); 352 spin_unlock_irqrestore(&pgd_lock, flags);
353
344 return res; 354 return res;
345} 355}
346 356
347static int split_large_page(pte_t *kpte, unsigned long address) 357static int split_large_page(pte_t *kpte, unsigned long address)
348{ 358{
349 pgprot_t ref_prot;
350 gfp_t gfp_flags = GFP_KERNEL;
351 unsigned long flags, addr, pfn, pfninc = 1; 359 unsigned long flags, addr, pfn, pfninc = 1;
360 gfp_t gfp_flags = GFP_KERNEL;
361 unsigned int i, level;
352 pte_t *pbase, *tmp; 362 pte_t *pbase, *tmp;
363 pgprot_t ref_prot;
353 struct page *base; 364 struct page *base;
354 unsigned int i, level;
355 365
356#ifdef CONFIG_DEBUG_PAGEALLOC 366#ifdef CONFIG_DEBUG_PAGEALLOC
357 gfp_flags = GFP_ATOMIC | __GFP_NOWARN; 367 gfp_flags = GFP_ATOMIC | __GFP_NOWARN;
@@ -505,7 +515,6 @@ repeat:
505 * 515 *
506 * Modules and drivers should use the set_memory_* APIs instead. 516 * Modules and drivers should use the set_memory_* APIs instead.
507 */ 517 */
508
509static int change_page_attr_addr(struct cpa_data *cpa) 518static int change_page_attr_addr(struct cpa_data *cpa)
510{ 519{
511 int err; 520 int err;