aboutsummaryrefslogtreecommitdiffstats
path: root/mm/memory.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/memory.c')
-rw-r--r--mm/memory.c90
1 files changed, 58 insertions, 32 deletions
diff --git a/mm/memory.c b/mm/memory.c
index cae514e7dcfc..85e7a87da79f 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -438,7 +438,7 @@ static void free_pte_range(struct mmu_gather *tlb, pmd_t *pmd,
438 pgtable_t token = pmd_pgtable(*pmd); 438 pgtable_t token = pmd_pgtable(*pmd);
439 pmd_clear(pmd); 439 pmd_clear(pmd);
440 pte_free_tlb(tlb, token, addr); 440 pte_free_tlb(tlb, token, addr);
441 atomic_long_dec(&tlb->mm->nr_ptes); 441 mm_dec_nr_ptes(tlb->mm);
442} 442}
443 443
444static inline void free_pmd_range(struct mmu_gather *tlb, pud_t *pud, 444static inline void free_pmd_range(struct mmu_gather *tlb, pud_t *pud,
@@ -506,6 +506,7 @@ static inline void free_pud_range(struct mmu_gather *tlb, p4d_t *p4d,
506 pud = pud_offset(p4d, start); 506 pud = pud_offset(p4d, start);
507 p4d_clear(p4d); 507 p4d_clear(p4d);
508 pud_free_tlb(tlb, pud, start); 508 pud_free_tlb(tlb, pud, start);
509 mm_dec_nr_puds(tlb->mm);
509} 510}
510 511
511static inline void free_p4d_range(struct mmu_gather *tlb, pgd_t *pgd, 512static inline void free_p4d_range(struct mmu_gather *tlb, pgd_t *pgd,
@@ -665,7 +666,7 @@ int __pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address)
665 666
666 ptl = pmd_lock(mm, pmd); 667 ptl = pmd_lock(mm, pmd);
667 if (likely(pmd_none(*pmd))) { /* Has another populated it ? */ 668 if (likely(pmd_none(*pmd))) { /* Has another populated it ? */
668 atomic_long_inc(&mm->nr_ptes); 669 mm_inc_nr_ptes(mm);
669 pmd_populate(mm, pmd, new); 670 pmd_populate(mm, pmd, new);
670 new = NULL; 671 new = NULL;
671 } 672 }
@@ -2554,7 +2555,11 @@ static int wp_page_copy(struct vm_fault *vmf)
2554 put_page(new_page); 2555 put_page(new_page);
2555 2556
2556 pte_unmap_unlock(vmf->pte, vmf->ptl); 2557 pte_unmap_unlock(vmf->pte, vmf->ptl);
2557 mmu_notifier_invalidate_range_end(mm, mmun_start, mmun_end); 2558 /*
2559 * No need to double call mmu_notifier->invalidate_range() callback as
2560 * the above ptep_clear_flush_notify() did already call it.
2561 */
2562 mmu_notifier_invalidate_range_only_end(mm, mmun_start, mmun_end);
2558 if (old_page) { 2563 if (old_page) {
2559 /* 2564 /*
2560 * Don't let another task, with possibly unlocked vma, 2565 * Don't let another task, with possibly unlocked vma,
@@ -2842,7 +2847,7 @@ EXPORT_SYMBOL(unmap_mapping_range);
2842int do_swap_page(struct vm_fault *vmf) 2847int do_swap_page(struct vm_fault *vmf)
2843{ 2848{
2844 struct vm_area_struct *vma = vmf->vma; 2849 struct vm_area_struct *vma = vmf->vma;
2845 struct page *page = NULL, *swapcache; 2850 struct page *page = NULL, *swapcache = NULL;
2846 struct mem_cgroup *memcg; 2851 struct mem_cgroup *memcg;
2847 struct vma_swap_readahead swap_ra; 2852 struct vma_swap_readahead swap_ra;
2848 swp_entry_t entry; 2853 swp_entry_t entry;
@@ -2881,17 +2886,36 @@ int do_swap_page(struct vm_fault *vmf)
2881 } 2886 }
2882 goto out; 2887 goto out;
2883 } 2888 }
2889
2890
2884 delayacct_set_flag(DELAYACCT_PF_SWAPIN); 2891 delayacct_set_flag(DELAYACCT_PF_SWAPIN);
2885 if (!page) 2892 if (!page)
2886 page = lookup_swap_cache(entry, vma_readahead ? vma : NULL, 2893 page = lookup_swap_cache(entry, vma_readahead ? vma : NULL,
2887 vmf->address); 2894 vmf->address);
2888 if (!page) { 2895 if (!page) {
2889 if (vma_readahead) 2896 struct swap_info_struct *si = swp_swap_info(entry);
2890 page = do_swap_page_readahead(entry, 2897
2891 GFP_HIGHUSER_MOVABLE, vmf, &swap_ra); 2898 if (si->flags & SWP_SYNCHRONOUS_IO &&
2892 else 2899 __swap_count(si, entry) == 1) {
2893 page = swapin_readahead(entry, 2900 /* skip swapcache */
2894 GFP_HIGHUSER_MOVABLE, vma, vmf->address); 2901 page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, vmf->address);
2902 if (page) {
2903 __SetPageLocked(page);
2904 __SetPageSwapBacked(page);
2905 set_page_private(page, entry.val);
2906 lru_cache_add_anon(page);
2907 swap_readpage(page, true);
2908 }
2909 } else {
2910 if (vma_readahead)
2911 page = do_swap_page_readahead(entry,
2912 GFP_HIGHUSER_MOVABLE, vmf, &swap_ra);
2913 else
2914 page = swapin_readahead(entry,
2915 GFP_HIGHUSER_MOVABLE, vma, vmf->address);
2916 swapcache = page;
2917 }
2918
2895 if (!page) { 2919 if (!page) {
2896 /* 2920 /*
2897 * Back out if somebody else faulted in this pte 2921 * Back out if somebody else faulted in this pte
@@ -2920,7 +2944,6 @@ int do_swap_page(struct vm_fault *vmf)
2920 goto out_release; 2944 goto out_release;
2921 } 2945 }
2922 2946
2923 swapcache = page;
2924 locked = lock_page_or_retry(page, vma->vm_mm, vmf->flags); 2947 locked = lock_page_or_retry(page, vma->vm_mm, vmf->flags);
2925 2948
2926 delayacct_clear_flag(DELAYACCT_PF_SWAPIN); 2949 delayacct_clear_flag(DELAYACCT_PF_SWAPIN);
@@ -2935,7 +2958,8 @@ int do_swap_page(struct vm_fault *vmf)
2935 * test below, are not enough to exclude that. Even if it is still 2958 * test below, are not enough to exclude that. Even if it is still
2936 * swapcache, we need to check that the page's swap has not changed. 2959 * swapcache, we need to check that the page's swap has not changed.
2937 */ 2960 */
2938 if (unlikely(!PageSwapCache(page) || page_private(page) != entry.val)) 2961 if (unlikely((!PageSwapCache(page) ||
2962 page_private(page) != entry.val)) && swapcache)
2939 goto out_page; 2963 goto out_page;
2940 2964
2941 page = ksm_might_need_to_copy(page, vma, vmf->address); 2965 page = ksm_might_need_to_copy(page, vma, vmf->address);
@@ -2988,14 +3012,16 @@ int do_swap_page(struct vm_fault *vmf)
2988 pte = pte_mksoft_dirty(pte); 3012 pte = pte_mksoft_dirty(pte);
2989 set_pte_at(vma->vm_mm, vmf->address, vmf->pte, pte); 3013 set_pte_at(vma->vm_mm, vmf->address, vmf->pte, pte);
2990 vmf->orig_pte = pte; 3014 vmf->orig_pte = pte;
2991 if (page == swapcache) { 3015
2992 do_page_add_anon_rmap(page, vma, vmf->address, exclusive); 3016 /* ksm created a completely new copy */
2993 mem_cgroup_commit_charge(page, memcg, true, false); 3017 if (unlikely(page != swapcache && swapcache)) {
2994 activate_page(page);
2995 } else { /* ksm created a completely new copy */
2996 page_add_new_anon_rmap(page, vma, vmf->address, false); 3018 page_add_new_anon_rmap(page, vma, vmf->address, false);
2997 mem_cgroup_commit_charge(page, memcg, false, false); 3019 mem_cgroup_commit_charge(page, memcg, false, false);
2998 lru_cache_add_active_or_unevictable(page, vma); 3020 lru_cache_add_active_or_unevictable(page, vma);
3021 } else {
3022 do_page_add_anon_rmap(page, vma, vmf->address, exclusive);
3023 mem_cgroup_commit_charge(page, memcg, true, false);
3024 activate_page(page);
2999 } 3025 }
3000 3026
3001 swap_free(entry); 3027 swap_free(entry);
@@ -3003,7 +3029,7 @@ int do_swap_page(struct vm_fault *vmf)
3003 (vma->vm_flags & VM_LOCKED) || PageMlocked(page)) 3029 (vma->vm_flags & VM_LOCKED) || PageMlocked(page))
3004 try_to_free_swap(page); 3030 try_to_free_swap(page);
3005 unlock_page(page); 3031 unlock_page(page);
3006 if (page != swapcache) { 3032 if (page != swapcache && swapcache) {
3007 /* 3033 /*
3008 * Hold the lock to avoid the swap entry to be reused 3034 * Hold the lock to avoid the swap entry to be reused
3009 * until we take the PT lock for the pte_same() check 3035 * until we take the PT lock for the pte_same() check
@@ -3036,7 +3062,7 @@ out_page:
3036 unlock_page(page); 3062 unlock_page(page);
3037out_release: 3063out_release:
3038 put_page(page); 3064 put_page(page);
3039 if (page != swapcache) { 3065 if (page != swapcache && swapcache) {
3040 unlock_page(swapcache); 3066 unlock_page(swapcache);
3041 put_page(swapcache); 3067 put_page(swapcache);
3042 } 3068 }
@@ -3212,7 +3238,7 @@ static int pte_alloc_one_map(struct vm_fault *vmf)
3212 goto map_pte; 3238 goto map_pte;
3213 } 3239 }
3214 3240
3215 atomic_long_inc(&vma->vm_mm->nr_ptes); 3241 mm_inc_nr_ptes(vma->vm_mm);
3216 pmd_populate(vma->vm_mm, vmf->pmd, vmf->prealloc_pte); 3242 pmd_populate(vma->vm_mm, vmf->pmd, vmf->prealloc_pte);
3217 spin_unlock(vmf->ptl); 3243 spin_unlock(vmf->ptl);
3218 vmf->prealloc_pte = NULL; 3244 vmf->prealloc_pte = NULL;
@@ -3271,7 +3297,7 @@ static void deposit_prealloc_pte(struct vm_fault *vmf)
3271 * We are going to consume the prealloc table, 3297 * We are going to consume the prealloc table,
3272 * count that as nr_ptes. 3298 * count that as nr_ptes.
3273 */ 3299 */
3274 atomic_long_inc(&vma->vm_mm->nr_ptes); 3300 mm_inc_nr_ptes(vma->vm_mm);
3275 vmf->prealloc_pte = NULL; 3301 vmf->prealloc_pte = NULL;
3276} 3302}
3277 3303
@@ -4124,15 +4150,17 @@ int __pud_alloc(struct mm_struct *mm, p4d_t *p4d, unsigned long address)
4124 4150
4125 spin_lock(&mm->page_table_lock); 4151 spin_lock(&mm->page_table_lock);
4126#ifndef __ARCH_HAS_5LEVEL_HACK 4152#ifndef __ARCH_HAS_5LEVEL_HACK
4127 if (p4d_present(*p4d)) /* Another has populated it */ 4153 if (!p4d_present(*p4d)) {
4128 pud_free(mm, new); 4154 mm_inc_nr_puds(mm);
4129 else
4130 p4d_populate(mm, p4d, new); 4155 p4d_populate(mm, p4d, new);
4131#else 4156 } else /* Another has populated it */
4132 if (pgd_present(*p4d)) /* Another has populated it */
4133 pud_free(mm, new); 4157 pud_free(mm, new);
4134 else 4158#else
4159 if (!pgd_present(*p4d)) {
4160 mm_inc_nr_puds(mm);
4135 pgd_populate(mm, p4d, new); 4161 pgd_populate(mm, p4d, new);
4162 } else /* Another has populated it */
4163 pud_free(mm, new);
4136#endif /* __ARCH_HAS_5LEVEL_HACK */ 4164#endif /* __ARCH_HAS_5LEVEL_HACK */
4137 spin_unlock(&mm->page_table_lock); 4165 spin_unlock(&mm->page_table_lock);
4138 return 0; 4166 return 0;
@@ -4457,17 +4485,15 @@ void print_vma_addr(char *prefix, unsigned long ip)
4457 struct vm_area_struct *vma; 4485 struct vm_area_struct *vma;
4458 4486
4459 /* 4487 /*
4460 * Do not print if we are in atomic 4488 * we might be running from an atomic context so we cannot sleep
4461 * contexts (in exception stacks, etc.):
4462 */ 4489 */
4463 if (preempt_count()) 4490 if (!down_read_trylock(&mm->mmap_sem))
4464 return; 4491 return;
4465 4492
4466 down_read(&mm->mmap_sem);
4467 vma = find_vma(mm, ip); 4493 vma = find_vma(mm, ip);
4468 if (vma && vma->vm_file) { 4494 if (vma && vma->vm_file) {
4469 struct file *f = vma->vm_file; 4495 struct file *f = vma->vm_file;
4470 char *buf = (char *)__get_free_page(GFP_KERNEL); 4496 char *buf = (char *)__get_free_page(GFP_NOWAIT);
4471 if (buf) { 4497 if (buf) {
4472 char *p; 4498 char *p;
4473 4499