diff options
Diffstat (limited to 'mm/memory.c')
-rw-r--r-- | mm/memory.c | 90 |
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 | ||
444 | static inline void free_pmd_range(struct mmu_gather *tlb, pud_t *pud, | 444 | static 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 | ||
511 | static inline void free_p4d_range(struct mmu_gather *tlb, pgd_t *pgd, | 512 | static 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); | |||
2842 | int do_swap_page(struct vm_fault *vmf) | 2847 | int 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); |
3037 | out_release: | 3063 | out_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 | ||