diff options
Diffstat (limited to 'arch/x86/mm/pgtable.c')
-rw-r--r-- | arch/x86/mm/pgtable.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c index c96314abd144..6fb6927f9e76 100644 --- a/arch/x86/mm/pgtable.c +++ b/arch/x86/mm/pgtable.c | |||
@@ -399,13 +399,20 @@ int pmdp_test_and_clear_young(struct vm_area_struct *vma, | |||
399 | int ptep_clear_flush_young(struct vm_area_struct *vma, | 399 | int ptep_clear_flush_young(struct vm_area_struct *vma, |
400 | unsigned long address, pte_t *ptep) | 400 | unsigned long address, pte_t *ptep) |
401 | { | 401 | { |
402 | int young; | 402 | /* |
403 | 403 | * On x86 CPUs, clearing the accessed bit without a TLB flush | |
404 | young = ptep_test_and_clear_young(vma, address, ptep); | 404 | * doesn't cause data corruption. [ It could cause incorrect |
405 | if (young) | 405 | * page aging and the (mistaken) reclaim of hot pages, but the |
406 | flush_tlb_page(vma, address); | 406 | * chance of that should be relatively low. ] |
407 | 407 | * | |
408 | return young; | 408 | * So as a performance optimization don't flush the TLB when |
409 | * clearing the accessed bit, it will eventually be flushed by | ||
410 | * a context switch or a VM operation anyway. [ In the rare | ||
411 | * event of it not getting flushed for a long time the delay | ||
412 | * shouldn't really matter because there's no real memory | ||
413 | * pressure for swapout to react to. ] | ||
414 | */ | ||
415 | return ptep_test_and_clear_young(vma, address, ptep); | ||
409 | } | 416 | } |
410 | 417 | ||
411 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | 418 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
@@ -449,9 +456,9 @@ void __init reserve_top_address(unsigned long reserve) | |||
449 | { | 456 | { |
450 | #ifdef CONFIG_X86_32 | 457 | #ifdef CONFIG_X86_32 |
451 | BUG_ON(fixmaps_set > 0); | 458 | BUG_ON(fixmaps_set > 0); |
452 | printk(KERN_INFO "Reserving virtual address space above 0x%08x\n", | 459 | __FIXADDR_TOP = round_down(-reserve, 1 << PMD_SHIFT) - PAGE_SIZE; |
453 | (int)-reserve); | 460 | printk(KERN_INFO "Reserving virtual address space above 0x%08lx (rounded to 0x%08lx)\n", |
454 | __FIXADDR_TOP = -reserve - PAGE_SIZE; | 461 | -reserve, __FIXADDR_TOP + PAGE_SIZE); |
455 | #endif | 462 | #endif |
456 | } | 463 | } |
457 | 464 | ||