History

mm: memcontrol: convert anon and file-thp to new mem_cgroup_charge() API

With the page->mapping requirement gone from memcg, we can charge anon and file-thp pages in one single step, right after they're allocated. This removes two out of three API calls - especially the tricky commit step that needed to happen at just the right time between when the page is "set up" and when it's "published" - somewhat vague and fluid concepts that varied by page type. All we need is a freshly allocated page and a memcg context to charge. v2: prevent double charges on pre-allocated hugepages in khugepaged [hannes@cmpxchg.org: Fix crash - *hpage could be ERR_PTR instead of NULL] Link: http://lkml.kernel.org/r/20200512215813.GA487759@cmpxchg.org Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Reviewed-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: Alex Shi <alex.shi@linux.alibaba.com> Cc: Hugh Dickins <hughd@google.com> Cc: "Kirill A. Shutemov" <kirill@shutemov.name> Cc: Michal Hocko <mhocko@suse.com> Cc: Roman Gushchin <guro@fb.com> Cc: Shakeel Butt <shakeelb@google.com> Cc: Balbir Singh <bsingharora@gmail.com> Cc: Qian Cai <cai@lca.pw> Link: http://lkml.kernel.org/r/20200508183105.225460-13-hannes@cmpxchg.org Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Johannes Weiner committed 6 years ago

Commit 9d82c691 parent 468c3989 files · +31 −82Browse files

Unified · Split

9 files
  1. include/linux/mm.h +1 −3
  2. kernel/events/uprobes.c +3 −8
  3. mm/filemap.c +1 −1
  4. mm/huge_memory.c +3 −6
  5. mm/khugepaged.c +10 −25
  6. mm/memory.c +10 −26
  7. mm/migrate.c +1 −4
  8. mm/swapfile.c +1 −5
  9. mm/userfaultfd.c +1 −4
include/linux/mm.h+1−3
@@ -501,7 +501,6 @@ struct vm_fault { · 500 unmodified lines
501 pte_t orig_pte; /* Value of PTE at the time of fault */501 pte_t orig_pte; /* Value of PTE at the time of fault */
502 502
503 struct page *cow_page; /* Page handler may use for COW fault */503 struct page *cow_page; /* Page handler may use for COW fault */
504 struct mem_cgroup *memcg; /* Cgroup cow_page belongs to */
505 struct page *page; /* ->fault handlers should return a504 struct page *page; /* ->fault handlers should return a
506 * page here, unless VM_FAULT_NOPAGE505 * page here, unless VM_FAULT_NOPAGE
507 * is set (which is also implied by506 * is set (which is also implied by
@@ -946,8 +945,7 @@ static inline pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma) · 438 unmodified lines
946 return pte;945 return pte;
947}946}
948 947
949vm_fault_t alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg,948vm_fault_t alloc_set_pte(struct vm_fault *vmf, struct page *page);
950 struct page *page);
951vm_fault_t finish_fault(struct vm_fault *vmf);949vm_fault_t finish_fault(struct vm_fault *vmf);
952vm_fault_t finish_mkwrite_fault(struct vm_fault *vmf);950vm_fault_t finish_mkwrite_fault(struct vm_fault *vmf);
953#endif951#endif
kernel/events/uprobes.c+3−8
@@ -162,14 +162,13 @@ static int __replace_page(struct vm_area_struct *vma, unsigned long addr, · 161 unmodified lines
162 };162 };
163 int err;163 int err;
164 struct mmu_notifier_range range;164 struct mmu_notifier_range range;
165 struct mem_cgroup *memcg;
166 165
167 mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, vma, mm, addr,166 mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, vma, mm, addr,
168 addr + PAGE_SIZE);167 addr + PAGE_SIZE);
169 168
170 if (new_page) {169 if (new_page) {
171 err = mem_cgroup_try_charge(new_page, vma->vm_mm, GFP_KERNEL,170 err = mem_cgroup_charge(new_page, vma->vm_mm, GFP_KERNEL,
172 &memcg);171 false);
173 if (err)172 if (err)
174 return err;173 return err;
175 }174 }
@@ -179,16 +178,12 @@ static int __replace_page(struct vm_area_struct *vma, unsigned long addr, · 3 unmodified lines
179 178
180 mmu_notifier_invalidate_range_start(&range);179 mmu_notifier_invalidate_range_start(&range);
181 err = -EAGAIN;180 err = -EAGAIN;
182 if (!page_vma_mapped_walk(&pvmw)) {181 if (!page_vma_mapped_walk(&pvmw))
183 if (new_page)
184 mem_cgroup_cancel_charge(new_page, memcg);
185 goto unlock;182 goto unlock;
186 }
187 VM_BUG_ON_PAGE(addr != pvmw.address, old_page);183 VM_BUG_ON_PAGE(addr != pvmw.address, old_page);
188 184
189 if (new_page) {185 if (new_page) {
190 get_page(new_page);186 get_page(new_page);
191 mem_cgroup_commit_charge(new_page, memcg, false);
192 page_add_new_anon_rmap(new_page, vma, addr, false);187 page_add_new_anon_rmap(new_page, vma, addr, false);
193 lru_cache_add_active_or_unevictable(new_page, vma);188 lru_cache_add_active_or_unevictable(new_page, vma);
194 } else189 } else
mm/filemap.c+1−1
@@ -2633,7 +2633,7 @@ void filemap_map_pages(struct vm_fault *vmf, · 2632 unmodified lines
2633 if (vmf->pte)2633 if (vmf->pte)
2634 vmf->pte += xas.xa_index - last_pgoff;2634 vmf->pte += xas.xa_index - last_pgoff;
2635 last_pgoff = xas.xa_index;2635 last_pgoff = xas.xa_index;
2636 if (alloc_set_pte(vmf, NULL, page))2636 if (alloc_set_pte(vmf, page))
2637 goto unlock;2637 goto unlock;
2638 unlock_page(page);2638 unlock_page(page);
2639 goto next;2639 goto next;
mm/huge_memory.c+3−6
@@ -587,19 +587,19 @@ static vm_fault_t __do_huge_pmd_anonymous_page(struct vm_fault *vmf, · 586 unmodified lines
587 struct page *page, gfp_t gfp)587 struct page *page, gfp_t gfp)
588{588{
589 struct vm_area_struct *vma = vmf->vma;589 struct vm_area_struct *vma = vmf->vma;
590 struct mem_cgroup *memcg;
591 pgtable_t pgtable;590 pgtable_t pgtable;
592 unsigned long haddr = vmf->address & HPAGE_PMD_MASK;591 unsigned long haddr = vmf->address & HPAGE_PMD_MASK;
593 vm_fault_t ret = 0;592 vm_fault_t ret = 0;
594 593
595 VM_BUG_ON_PAGE(!PageCompound(page), page);594 VM_BUG_ON_PAGE(!PageCompound(page), page);
596 595
597 if (mem_cgroup_try_charge_delay(page, vma->vm_mm, gfp, &memcg)) {596 if (mem_cgroup_charge(page, vma->vm_mm, gfp, false)) {
598 put_page(page);597 put_page(page);
599 count_vm_event(THP_FAULT_FALLBACK);598 count_vm_event(THP_FAULT_FALLBACK);
600 count_vm_event(THP_FAULT_FALLBACK_CHARGE);599 count_vm_event(THP_FAULT_FALLBACK_CHARGE);
601 return VM_FAULT_FALLBACK;600 return VM_FAULT_FALLBACK;
602 }601 }
602 cgroup_throttle_swaprate(page, gfp);
603 603
604 pgtable = pte_alloc_one(vma->vm_mm);604 pgtable = pte_alloc_one(vma->vm_mm);
605 if (unlikely(!pgtable)) {605 if (unlikely(!pgtable)) {
@@ -630,7 +630,6 @@ static vm_fault_t __do_huge_pmd_anonymous_page(struct vm_fault *vmf, · 24 unmodified lines
630 vm_fault_t ret2;630 vm_fault_t ret2;
631 631
632 spin_unlock(vmf->ptl);632 spin_unlock(vmf->ptl);
633 mem_cgroup_cancel_charge(page, memcg);
634 put_page(page);633 put_page(page);
635 pte_free(vma->vm_mm, pgtable);634 pte_free(vma->vm_mm, pgtable);
636 ret2 = handle_userfault(vmf, VM_UFFD_MISSING);635 ret2 = handle_userfault(vmf, VM_UFFD_MISSING);
@@ -640,7 +639,6 @@ static vm_fault_t __do_huge_pmd_anonymous_page(struct vm_fault *vmf, · 3 unmodified lines
640 639
641 entry = mk_huge_pmd(page, vma->vm_page_prot);640 entry = mk_huge_pmd(page, vma->vm_page_prot);
642 entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma);641 entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma);
643 mem_cgroup_commit_charge(page, memcg, false);
644 page_add_new_anon_rmap(page, vma, haddr, true);642 page_add_new_anon_rmap(page, vma, haddr, true);
645 lru_cache_add_active_or_unevictable(page, vma);643 lru_cache_add_active_or_unevictable(page, vma);
646 pgtable_trans_huge_deposit(vma->vm_mm, vmf->pmd, pgtable);644 pgtable_trans_huge_deposit(vma->vm_mm, vmf->pmd, pgtable);
@@ -649,7 +647,7 @@ static vm_fault_t __do_huge_pmd_anonymous_page(struct vm_fault *vmf, · 2 unmodified lines
649 mm_inc_nr_ptes(vma->vm_mm);647 mm_inc_nr_ptes(vma->vm_mm);
650 spin_unlock(vmf->ptl);648 spin_unlock(vmf->ptl);
651 count_vm_event(THP_FAULT_ALLOC);649 count_vm_event(THP_FAULT_ALLOC);
652 count_memcg_events(memcg, THP_FAULT_ALLOC, 1);650 count_memcg_event_mm(vma->vm_mm, THP_FAULT_ALLOC);
653 }651 }
654 652
655 return 0;653 return 0;
@@ -658,7 +656,6 @@ unlock_release: · 2 unmodified lines
658release:656release:
659 if (pgtable)657 if (pgtable)
660 pte_free(vma->vm_mm, pgtable);658 pte_free(vma->vm_mm, pgtable);
661 mem_cgroup_cancel_charge(page, memcg);
662 put_page(page);659 put_page(page);
663 return ret;660 return ret;
664 661
mm/khugepaged.c+10−25
@@ -1037,7 +1037,6 @@ static void collapse_huge_page(struct mm_struct *mm, · 1036 unmodified lines
1037 struct page *new_page;1037 struct page *new_page;
1038 spinlock_t *pmd_ptl, *pte_ptl;1038 spinlock_t *pmd_ptl, *pte_ptl;
1039 int isolated = 0, result = 0;1039 int isolated = 0, result = 0;
1040 struct mem_cgroup *memcg;
1041 struct vm_area_struct *vma;1040 struct vm_area_struct *vma;
1042 struct mmu_notifier_range range;1041 struct mmu_notifier_range range;
1043 gfp_t gfp;1042 gfp_t gfp;
@@ -1060,15 +1059,15 @@ static void collapse_huge_page(struct mm_struct *mm, · 16 unmodified lines
1060 goto out_nolock;1059 goto out_nolock;
1061 }1060 }
1062 1061
1063 if (unlikely(mem_cgroup_try_charge(new_page, mm, gfp, &memcg))) {1062 if (unlikely(mem_cgroup_charge(new_page, mm, gfp, false))) {
1064 result = SCAN_CGROUP_CHARGE_FAIL;1063 result = SCAN_CGROUP_CHARGE_FAIL;
1065 goto out_nolock;1064 goto out_nolock;
1066 }1065 }
1066 count_memcg_page_event(new_page, THP_COLLAPSE_ALLOC);
1067 1067
1068 down_read(&mm->mmap_sem);1068 down_read(&mm->mmap_sem);
1069 result = hugepage_vma_revalidate(mm, address, &vma);1069 result = hugepage_vma_revalidate(mm, address, &vma);
1070 if (result) {1070 if (result) {
1071 mem_cgroup_cancel_charge(new_page, memcg);
1072 up_read(&mm->mmap_sem);1071 up_read(&mm->mmap_sem);
1073 goto out_nolock;1072 goto out_nolock;
1074 }1073 }
@@ -1076,7 +1075,6 @@ static void collapse_huge_page(struct mm_struct *mm, · 1 unmodified line
1076 pmd = mm_find_pmd(mm, address);1075 pmd = mm_find_pmd(mm, address);
1077 if (!pmd) {1076 if (!pmd) {
1078 result = SCAN_PMD_NULL;1077 result = SCAN_PMD_NULL;
1079 mem_cgroup_cancel_charge(new_page, memcg);
1080 up_read(&mm->mmap_sem);1078 up_read(&mm->mmap_sem);
1081 goto out_nolock;1079 goto out_nolock;
1082 }1080 }
@@ -1088,7 +1086,6 @@ static void collapse_huge_page(struct mm_struct *mm, · 5 unmodified lines
1088 */1086 */
1089 if (unmapped && !__collapse_huge_page_swapin(mm, vma, address,1087 if (unmapped && !__collapse_huge_page_swapin(mm, vma, address,
1090 pmd, referenced)) {1088 pmd, referenced)) {
1091 mem_cgroup_cancel_charge(new_page, memcg);
1092 up_read(&mm->mmap_sem);1089 up_read(&mm->mmap_sem);
1093 goto out_nolock;1090 goto out_nolock;
1094 }1091 }
@@ -1175,9 +1172,7 @@ static void collapse_huge_page(struct mm_struct *mm, · 80 unmodified lines
1175 1172
1176 spin_lock(pmd_ptl);1173 spin_lock(pmd_ptl);
1177 BUG_ON(!pmd_none(*pmd));1174 BUG_ON(!pmd_none(*pmd));
1178 mem_cgroup_commit_charge(new_page, memcg, false);
1179 page_add_new_anon_rmap(new_page, vma, address, true);1175 page_add_new_anon_rmap(new_page, vma, address, true);
1180 count_memcg_events(memcg, THP_COLLAPSE_ALLOC, 1);
1181 lru_cache_add_active_or_unevictable(new_page, vma);1176 lru_cache_add_active_or_unevictable(new_page, vma);
1182 pgtable_trans_huge_deposit(mm, pmd, pgtable);1177 pgtable_trans_huge_deposit(mm, pmd, pgtable);
1183 set_pmd_at(mm, address, pmd, _pmd);1178 set_pmd_at(mm, address, pmd, _pmd);
@@ -1191,10 +1186,11 @@ static void collapse_huge_page(struct mm_struct *mm, · 7 unmodified lines
1191out_up_write:1186out_up_write:
1192 up_write(&mm->mmap_sem);1187 up_write(&mm->mmap_sem);
1193out_nolock:1188out_nolock:
1189 if (!IS_ERR_OR_NULL(*hpage))
1190 mem_cgroup_uncharge(*hpage);
1194 trace_mm_collapse_huge_page(mm, isolated, result);1191 trace_mm_collapse_huge_page(mm, isolated, result);
1195 return;1192 return;
1196out:1193out:
1197 mem_cgroup_cancel_charge(new_page, memcg);
1198 goto out_up_write;1194 goto out_up_write;
1199}1195}
1200 1196
@@ -1618,7 +1614,6 @@ static void collapse_file(struct mm_struct *mm, · 417 unmodified lines
1618 struct address_space *mapping = file->f_mapping;1614 struct address_space *mapping = file->f_mapping;
1619 gfp_t gfp;1615 gfp_t gfp;
1620 struct page *new_page;1616 struct page *new_page;
1621 struct mem_cgroup *memcg;
1622 pgoff_t index, end = start + HPAGE_PMD_NR;1617 pgoff_t index, end = start + HPAGE_PMD_NR;
1623 LIST_HEAD(pagelist);1618 LIST_HEAD(pagelist);
1624 XA_STATE_ORDER(xas, &mapping->i_pages, start, HPAGE_PMD_ORDER);1619 XA_STATE_ORDER(xas, &mapping->i_pages, start, HPAGE_PMD_ORDER);
@@ -1637,10 +1632,11 @@ static void collapse_file(struct mm_struct *mm, · 12 unmodified lines
1637 goto out;1632 goto out;
1638 }1633 }
1639 1634
1640 if (unlikely(mem_cgroup_try_charge(new_page, mm, gfp, &memcg))) {1635 if (unlikely(mem_cgroup_charge(new_page, mm, gfp, false))) {
1641 result = SCAN_CGROUP_CHARGE_FAIL;1636 result = SCAN_CGROUP_CHARGE_FAIL;
1642 goto out;1637 goto out;
1643 }1638 }
1639 count_memcg_page_event(new_page, THP_COLLAPSE_ALLOC);
1644 1640
1645 /* This will be less messy when we use multi-index entries */1641 /* This will be less messy when we use multi-index entries */
1646 do {1642 do {
@@ -1650,7 +1646,6 @@ static void collapse_file(struct mm_struct *mm, · 3 unmodified lines
1650 break;1646 break;
1651 xas_unlock_irq(&xas);1647 xas_unlock_irq(&xas);
1652 if (!xas_nomem(&xas, GFP_KERNEL)) {1648 if (!xas_nomem(&xas, GFP_KERNEL)) {
1653 mem_cgroup_cancel_charge(new_page, memcg);
1654 result = SCAN_FAIL;1649 result = SCAN_FAIL;
1655 goto out;1650 goto out;
1656 }1651 }
@@ -1844,18 +1839,9 @@ out_unlock: · 187 unmodified lines
1844 }1839 }
1845 1840
1846 if (nr_none) {1841 if (nr_none) {
1847 struct lruvec *lruvec;1842 __mod_lruvec_page_state(new_page, NR_FILE_PAGES, nr_none);
1848 /*
1849 * XXX: We have started try_charge and pinned the
1850 * memcg, but the page isn't committed yet so we
1851 * cannot use mod_lruvec_page_state(). This hackery
1852 * will be cleaned up when remove the page->mapping
1853 * dependency from memcg and fully charge above.
1854 */
1855 lruvec = mem_cgroup_lruvec(memcg, page_pgdat(new_page));
1856 __mod_lruvec_state(lruvec, NR_FILE_PAGES, nr_none);
1857 if (is_shmem)1843 if (is_shmem)
1858 __mod_lruvec_state(lruvec, NR_SHMEM, nr_none);1844 __mod_lruvec_page_state(new_page, NR_SHMEM, nr_none);
1859 }1845 }
1860 1846
1861xa_locked:1847xa_locked:
@@ -1893,7 +1879,6 @@ xa_unlocked: · 31 unmodified lines
1893 1879
1894 SetPageUptodate(new_page);1880 SetPageUptodate(new_page);
1895 page_ref_add(new_page, HPAGE_PMD_NR - 1);1881 page_ref_add(new_page, HPAGE_PMD_NR - 1);
1896 mem_cgroup_commit_charge(new_page, memcg, false);
1897 1882
1898 if (is_shmem) {1883 if (is_shmem) {
1899 set_page_dirty(new_page);1884 set_page_dirty(new_page);
@@ -1901,7 +1886,6 @@ xa_unlocked: · 1 unmodified line
1901 } else {1886 } else {
1902 lru_cache_add_file(new_page);1887 lru_cache_add_file(new_page);
1903 }1888 }
1904 count_memcg_events(memcg, THP_COLLAPSE_ALLOC, 1);
1905 1889
1906 /*1890 /*
1907 * Remove pte page tables, so we can re-fault the page as huge.1891 * Remove pte page tables, so we can re-fault the page as huge.
@@ -1948,13 +1932,14 @@ xa_unlocked: · 40 unmodified lines
1948 VM_BUG_ON(nr_none);1932 VM_BUG_ON(nr_none);
1949 xas_unlock_irq(&xas);1933 xas_unlock_irq(&xas);
1950 1934
1951 mem_cgroup_cancel_charge(new_page, memcg);
1952 new_page->mapping = NULL;1935 new_page->mapping = NULL;
1953 }1936 }
1954 1937
1955 unlock_page(new_page);1938 unlock_page(new_page);
1956out:1939out:
1957 VM_BUG_ON(!list_empty(&pagelist));1940 VM_BUG_ON(!list_empty(&pagelist));
1941 if (!IS_ERR_OR_NULL(*hpage))
1942 mem_cgroup_uncharge(*hpage);
1958 /* TODO: tracepoints */1943 /* TODO: tracepoints */
1959}1944}
1960 1945
mm/memory.c+10−26
@@ -2645,7 +2645,6 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf) · 2644 unmodified lines
2645 struct page *new_page = NULL;2645 struct page *new_page = NULL;
2646 pte_t entry;2646 pte_t entry;
2647 int page_copied = 0;2647 int page_copied = 0;
2648 struct mem_cgroup *memcg;
2649 struct mmu_notifier_range range;2648 struct mmu_notifier_range range;
2650 2649
2651 if (unlikely(anon_vma_prepare(vma)))2650 if (unlikely(anon_vma_prepare(vma)))
@@ -2676,8 +2675,9 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf) · 24 unmodified lines
2676 }2675 }
2677 }2676 }
2678 2677
2679 if (mem_cgroup_try_charge_delay(new_page, mm, GFP_KERNEL, &memcg))2678 if (mem_cgroup_charge(new_page, mm, GFP_KERNEL, false))
2680 goto oom_free_new;2679 goto oom_free_new;
2680 cgroup_throttle_swaprate(new_page, GFP_KERNEL);
2681 2681
2682 __SetPageUptodate(new_page);2682 __SetPageUptodate(new_page);
2683 2683
@@ -2710,7 +2710,6 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf) · 26 unmodified lines
2710 * thread doing COW.2710 * thread doing COW.
2711 */2711 */
2712 ptep_clear_flush_notify(vma, vmf->address, vmf->pte);2712 ptep_clear_flush_notify(vma, vmf->address, vmf->pte);
2713 mem_cgroup_commit_charge(new_page, memcg, false);
2714 page_add_new_anon_rmap(new_page, vma, vmf->address, false);2713 page_add_new_anon_rmap(new_page, vma, vmf->address, false);
2715 lru_cache_add_active_or_unevictable(new_page, vma);2714 lru_cache_add_active_or_unevictable(new_page, vma);
2716 /*2715 /*
@@ -2749,8 +2748,6 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf) · 32 unmodified lines
2749 /* Free the old page.. */2748 /* Free the old page.. */
2750 new_page = old_page;2749 new_page = old_page;
2751 page_copied = 1;2750 page_copied = 1;
2752 } else {
2753 mem_cgroup_cancel_charge(new_page, memcg);
2754 }2751 }
2755 2752
2756 if (new_page)2753 if (new_page)
@@ -3088,7 +3085,6 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) · 331 unmodified lines
3088{3085{
3089 struct vm_area_struct *vma = vmf->vma;3086 struct vm_area_struct *vma = vmf->vma;
3090 struct page *page = NULL, *swapcache;3087 struct page *page = NULL, *swapcache;
3091 struct mem_cgroup *memcg;
3092 swp_entry_t entry;3088 swp_entry_t entry;
3093 pte_t pte;3089 pte_t pte;
3094 int locked;3090 int locked;
@@ -3193,10 +3189,11 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) · 98 unmodified lines
3193 goto out_page;3189 goto out_page;
3194 }3190 }
3195 3191
3196 if (mem_cgroup_try_charge_delay(page, vma->vm_mm, GFP_KERNEL, &memcg)) {3192 if (mem_cgroup_charge(page, vma->vm_mm, GFP_KERNEL, true)) {
3197 ret = VM_FAULT_OOM;3193 ret = VM_FAULT_OOM;
3198 goto out_page;3194 goto out_page;
3199 }3195 }
3196 cgroup_throttle_swaprate(page, GFP_KERNEL);
3200 3197
3201 /*3198 /*
3202 * Back out if somebody else already faulted in this pte.3199 * Back out if somebody else already faulted in this pte.
@@ -3243,11 +3240,9 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) · 40 unmodified lines
3243 3240
3244 /* ksm created a completely new copy */3241 /* ksm created a completely new copy */
3245 if (unlikely(page != swapcache && swapcache)) {3242 if (unlikely(page != swapcache && swapcache)) {
3246 mem_cgroup_commit_charge(page, memcg, false);
3247 page_add_new_anon_rmap(page, vma, vmf->address, false);3243 page_add_new_anon_rmap(page, vma, vmf->address, false);
3248 lru_cache_add_active_or_unevictable(page, vma);3244 lru_cache_add_active_or_unevictable(page, vma);
3249 } else {3245 } else {
3250 mem_cgroup_commit_charge(page, memcg, true);
3251 do_page_add_anon_rmap(page, vma, vmf->address, exclusive);3246 do_page_add_anon_rmap(page, vma, vmf->address, exclusive);
3252 activate_page(page);3247 activate_page(page);
3253 }3248 }
@@ -3284,7 +3279,6 @@ unlock: · 30 unmodified lines
3284out:3279out:
3285 return ret;3280 return ret;
3286out_nomap:3281out_nomap:
3287 mem_cgroup_cancel_charge(page, memcg);
3288 pte_unmap_unlock(vmf->pte, vmf->ptl);3282 pte_unmap_unlock(vmf->pte, vmf->ptl);
3289out_page:3283out_page:
3290 unlock_page(page);3284 unlock_page(page);
@@ -3305,7 +3299,6 @@ out_release: · 14 unmodified lines
3305static vm_fault_t do_anonymous_page(struct vm_fault *vmf)3299static vm_fault_t do_anonymous_page(struct vm_fault *vmf)
3306{3300{
3307 struct vm_area_struct *vma = vmf->vma;3301 struct vm_area_struct *vma = vmf->vma;
3308 struct mem_cgroup *memcg;
3309 struct page *page;3302 struct page *page;
3310 vm_fault_t ret = 0;3303 vm_fault_t ret = 0;
3311 pte_t entry;3304 pte_t entry;
@@ -3358,8 +3351,9 @@ static vm_fault_t do_anonymous_page(struct vm_fault *vmf) · 46 unmodified lines
3358 if (!page)3351 if (!page)
3359 goto oom;3352 goto oom;
3360 3353
3361 if (mem_cgroup_try_charge_delay(page, vma->vm_mm, GFP_KERNEL, &memcg))3354 if (mem_cgroup_charge(page, vma->vm_mm, GFP_KERNEL, false))
3362 goto oom_free_page;3355 goto oom_free_page;
3356 cgroup_throttle_swaprate(page, GFP_KERNEL);
3363 3357
3364 /*3358 /*
3365 * The memory barrier inside __SetPageUptodate makes sure that3359 * The memory barrier inside __SetPageUptodate makes sure that
@@ -3384,13 +3378,11 @@ static vm_fault_t do_anonymous_page(struct vm_fault *vmf) · 18 unmodified lines
3384 /* Deliver the page fault to userland, check inside PT lock */3378 /* Deliver the page fault to userland, check inside PT lock */
3385 if (userfaultfd_missing(vma)) {3379 if (userfaultfd_missing(vma)) {
3386 pte_unmap_unlock(vmf->pte, vmf->ptl);3380 pte_unmap_unlock(vmf->pte, vmf->ptl);
3387 mem_cgroup_cancel_charge(page, memcg);
3388 put_page(page);3381 put_page(page);
3389 return handle_userfault(vmf, VM_UFFD_MISSING);3382 return handle_userfault(vmf, VM_UFFD_MISSING);
3390 }3383 }
3391 3384
3392 inc_mm_counter_fast(vma->vm_mm, MM_ANONPAGES);3385 inc_mm_counter_fast(vma->vm_mm, MM_ANONPAGES);
3393 mem_cgroup_commit_charge(page, memcg, false);
3394 page_add_new_anon_rmap(page, vma, vmf->address, false);3386 page_add_new_anon_rmap(page, vma, vmf->address, false);
3395 lru_cache_add_active_or_unevictable(page, vma);3387 lru_cache_add_active_or_unevictable(page, vma);
3396setpte:3388setpte:
@@ -3402,7 +3394,6 @@ unlock: · 5 unmodified lines
3402 pte_unmap_unlock(vmf->pte, vmf->ptl);3394 pte_unmap_unlock(vmf->pte, vmf->ptl);
3403 return ret;3395 return ret;
3404release:3396release:
3405 mem_cgroup_cancel_charge(page, memcg);
3406 put_page(page);3397 put_page(page);
3407 goto unlock;3398 goto unlock;
3408oom_free_page:3399oom_free_page:
@@ -3607,7 +3598,6 @@ static vm_fault_t do_set_pmd(struct vm_fault *vmf, struct page *page) · 198 unmodified lines
3607 * mapping. If needed, the fucntion allocates page table or use pre-allocated.3598 * mapping. If needed, the fucntion allocates page table or use pre-allocated.
3608 *3599 *
3609 * @vmf: fault environment3600 * @vmf: fault environment
3610 * @memcg: memcg to charge page (only for private mappings)
3611 * @page: page to map3601 * @page: page to map
3612 *3602 *
3613 * Caller must take care of unlocking vmf->ptl, if vmf->pte is non-NULL on3603 * Caller must take care of unlocking vmf->ptl, if vmf->pte is non-NULL on
@@ -3618,8 +3608,7 @@ static vm_fault_t do_set_pmd(struct vm_fault *vmf, struct page *page) · 4 unmodified lines
3618 *3608 *
3619 * Return: %0 on success, %VM_FAULT_ code in case of error.3609 * Return: %0 on success, %VM_FAULT_ code in case of error.
3620 */3610 */
3621vm_fault_t alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg,3611vm_fault_t alloc_set_pte(struct vm_fault *vmf, struct page *page)
3622 struct page *page)
3623{3612{
3624 struct vm_area_struct *vma = vmf->vma;3613 struct vm_area_struct *vma = vmf->vma;
3625 bool write = vmf->flags & FAULT_FLAG_WRITE;3614 bool write = vmf->flags & FAULT_FLAG_WRITE;
@@ -3627,9 +3616,6 @@ vm_fault_t alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg, · 1 unmodified line
3627 vm_fault_t ret;3616 vm_fault_t ret;
3628 3617
3629 if (pmd_none(*vmf->pmd) && PageTransCompound(page)) {3618 if (pmd_none(*vmf->pmd) && PageTransCompound(page)) {
3630 /* THP on COW? */
3631 VM_BUG_ON_PAGE(memcg, page);
3632
3633 ret = do_set_pmd(vmf, page);3619 ret = do_set_pmd(vmf, page);
3634 if (ret != VM_FAULT_FALLBACK)3620 if (ret != VM_FAULT_FALLBACK)
3635 return ret;3621 return ret;
@@ -3652,7 +3638,6 @@ vm_fault_t alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg, · 16 unmodified lines
3652 /* copy-on-write page */3638 /* copy-on-write page */
3653 if (write && !(vma->vm_flags & VM_SHARED)) {3639 if (write && !(vma->vm_flags & VM_SHARED)) {
3654 inc_mm_counter_fast(vma->vm_mm, MM_ANONPAGES);3640 inc_mm_counter_fast(vma->vm_mm, MM_ANONPAGES);
3655 mem_cgroup_commit_charge(page, memcg, false);
3656 page_add_new_anon_rmap(page, vma, vmf->address, false);3641 page_add_new_anon_rmap(page, vma, vmf->address, false);
3657 lru_cache_add_active_or_unevictable(page, vma);3642 lru_cache_add_active_or_unevictable(page, vma);
3658 } else {3643 } else {
@@ -3702,7 +3687,7 @@ vm_fault_t finish_fault(struct vm_fault *vmf) · 43 unmodified lines
3702 if (!(vmf->vma->vm_flags & VM_SHARED))3687 if (!(vmf->vma->vm_flags & VM_SHARED))
3703 ret = check_stable_address_space(vmf->vma->vm_mm);3688 ret = check_stable_address_space(vmf->vma->vm_mm);
3704 if (!ret)3689 if (!ret)
3705 ret = alloc_set_pte(vmf, vmf->memcg, page);3690 ret = alloc_set_pte(vmf, page);
3706 if (vmf->pte)3691 if (vmf->pte)
3707 pte_unmap_unlock(vmf->pte, vmf->ptl);3692 pte_unmap_unlock(vmf->pte, vmf->ptl);
3708 return ret;3693 return ret;
@@ -3862,11 +3847,11 @@ static vm_fault_t do_cow_fault(struct vm_fault *vmf) · 153 unmodified lines
3862 if (!vmf->cow_page)3847 if (!vmf->cow_page)
3863 return VM_FAULT_OOM;3848 return VM_FAULT_OOM;
3864 3849
3865 if (mem_cgroup_try_charge_delay(vmf->cow_page, vma->vm_mm,3850 if (mem_cgroup_charge(vmf->cow_page, vma->vm_mm, GFP_KERNEL, false)) {
3866 GFP_KERNEL, &vmf->memcg)) {
3867 put_page(vmf->cow_page);3851 put_page(vmf->cow_page);
3868 return VM_FAULT_OOM;3852 return VM_FAULT_OOM;
3869 }3853 }
3854 cgroup_throttle_swaprate(vmf->cow_page, GFP_KERNEL);
3870 3855
3871 ret = __do_fault(vmf);3856 ret = __do_fault(vmf);
3872 if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE | VM_FAULT_RETRY)))3857 if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE | VM_FAULT_RETRY)))
@@ -3884,7 +3869,6 @@ static vm_fault_t do_cow_fault(struct vm_fault *vmf) · 11 unmodified lines
3884 goto uncharge_out;3869 goto uncharge_out;
3885 return ret;3870 return ret;
3886uncharge_out:3871uncharge_out:
3887 mem_cgroup_cancel_charge(vmf->cow_page, vmf->memcg);
3888 put_page(vmf->cow_page);3872 put_page(vmf->cow_page);
3889 return ret;3873 return ret;
3890}3874}
mm/migrate.c+1−4
@@ -2740,7 +2740,6 @@ static void migrate_vma_insert_page(struct migrate_vma *migrate, · 2739 unmodified lines
2740{2740{
2741 struct vm_area_struct *vma = migrate->vma;2741 struct vm_area_struct *vma = migrate->vma;
2742 struct mm_struct *mm = vma->vm_mm;2742 struct mm_struct *mm = vma->vm_mm;
2743 struct mem_cgroup *memcg;
2744 bool flush = false;2743 bool flush = false;
2745 spinlock_t *ptl;2744 spinlock_t *ptl;
2746 pte_t entry;2745 pte_t entry;
@@ -2787,7 +2786,7 @@ static void migrate_vma_insert_page(struct migrate_vma *migrate, · 40 unmodified lines
2787 2786
2788 if (unlikely(anon_vma_prepare(vma)))2787 if (unlikely(anon_vma_prepare(vma)))
2789 goto abort;2788 goto abort;
2790 if (mem_cgroup_try_charge(page, vma->vm_mm, GFP_KERNEL, &memcg))2789 if (mem_cgroup_charge(page, vma->vm_mm, GFP_KERNEL, false))
2791 goto abort;2790 goto abort;
2792 2791
2793 /*2792 /*
@@ -2832,7 +2831,6 @@ static void migrate_vma_insert_page(struct migrate_vma *migrate, · 38 unmodified lines
2832 goto unlock_abort;2831 goto unlock_abort;
2833 2832
2834 inc_mm_counter(mm, MM_ANONPAGES);2833 inc_mm_counter(mm, MM_ANONPAGES);
2835 mem_cgroup_commit_charge(page, memcg, false);
2836 page_add_new_anon_rmap(page, vma, addr, false);2834 page_add_new_anon_rmap(page, vma, addr, false);
2837 if (!is_zone_device_page(page))2835 if (!is_zone_device_page(page))
2838 lru_cache_add_active_or_unevictable(page, vma);2836 lru_cache_add_active_or_unevictable(page, vma);
@@ -2855,7 +2853,6 @@ static void migrate_vma_insert_page(struct migrate_vma *migrate, · 16 unmodified lines
2855 2853
2856unlock_abort:2854unlock_abort:
2857 pte_unmap_unlock(ptep, ptl);2855 pte_unmap_unlock(ptep, ptl);
2858 mem_cgroup_cancel_charge(page, memcg);
2859abort:2856abort:
2860 *src &= ~MIGRATE_PFN_MIGRATE;2857 *src &= ~MIGRATE_PFN_MIGRATE;
2861}2858}
mm/swapfile.c+1−5
@@ -1892,7 +1892,6 @@ static int unuse_pte(struct vm_area_struct *vma, pmd_t *pmd, · 1891 unmodified lines
1892 unsigned long addr, swp_entry_t entry, struct page *page)1892 unsigned long addr, swp_entry_t entry, struct page *page)
1893{1893{
1894 struct page *swapcache;1894 struct page *swapcache;
1895 struct mem_cgroup *memcg;
1896 spinlock_t *ptl;1895 spinlock_t *ptl;
1897 pte_t *pte;1896 pte_t *pte;
1898 int ret = 1;1897 int ret = 1;
@@ -1902,14 +1901,13 @@ static int unuse_pte(struct vm_area_struct *vma, pmd_t *pmd, · 3 unmodified lines
1902 if (unlikely(!page))1901 if (unlikely(!page))
1903 return -ENOMEM;1902 return -ENOMEM;
1904 1903
1905 if (mem_cgroup_try_charge(page, vma->vm_mm, GFP_KERNEL, &memcg)) {1904 if (mem_cgroup_charge(page, vma->vm_mm, GFP_KERNEL, true)) {
1906 ret = -ENOMEM;1905 ret = -ENOMEM;
1907 goto out_nolock;1906 goto out_nolock;
1908 }1907 }
1909 1908
1910 pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);1909 pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);
1911 if (unlikely(!pte_same_as_swp(*pte, swp_entry_to_pte(entry)))) {1910 if (unlikely(!pte_same_as_swp(*pte, swp_entry_to_pte(entry)))) {
1912 mem_cgroup_cancel_charge(page, memcg);
1913 ret = 0;1911 ret = 0;
1914 goto out;1912 goto out;
1915 }1913 }
@@ -1920,10 +1918,8 @@ static int unuse_pte(struct vm_area_struct *vma, pmd_t *pmd, · 4 unmodified lines
1920 set_pte_at(vma->vm_mm, addr, pte,1918 set_pte_at(vma->vm_mm, addr, pte,
1921 pte_mkold(mk_pte(page, vma->vm_page_prot)));1919 pte_mkold(mk_pte(page, vma->vm_page_prot)));
1922 if (page == swapcache) {1920 if (page == swapcache) {
1923 mem_cgroup_commit_charge(page, memcg, true);
1924 page_add_anon_rmap(page, vma, addr, false);1921 page_add_anon_rmap(page, vma, addr, false);
1925 } else { /* ksm created a completely new copy */1922 } else { /* ksm created a completely new copy */
1926 mem_cgroup_commit_charge(page, memcg, false);
1927 page_add_new_anon_rmap(page, vma, addr, false);1923 page_add_new_anon_rmap(page, vma, addr, false);
1928 lru_cache_add_active_or_unevictable(page, vma);1924 lru_cache_add_active_or_unevictable(page, vma);
1929 }1925 }
mm/userfaultfd.c+1−4
@@ -56,7 +56,6 @@ static int mcopy_atomic_pte(struct mm_struct *dst_mm, · 55 unmodified lines
56 struct page **pagep,56 struct page **pagep,
57 bool wp_copy)57 bool wp_copy)
58{58{
59 struct mem_cgroup *memcg;
60 pte_t _dst_pte, *dst_pte;59 pte_t _dst_pte, *dst_pte;
61 spinlock_t *ptl;60 spinlock_t *ptl;
62 void *page_kaddr;61 void *page_kaddr;
@@ -97,7 +96,7 @@ static int mcopy_atomic_pte(struct mm_struct *dst_mm, · 34 unmodified lines
97 __SetPageUptodate(page);96 __SetPageUptodate(page);
98 97
99 ret = -ENOMEM;98 ret = -ENOMEM;
100 if (mem_cgroup_try_charge(page, dst_mm, GFP_KERNEL, &memcg))99 if (mem_cgroup_charge(page, dst_mm, GFP_KERNEL, false))
101 goto out_release;100 goto out_release;
102 101
103 _dst_pte = pte_mkdirty(mk_pte(page, dst_vma->vm_page_prot));102 _dst_pte = pte_mkdirty(mk_pte(page, dst_vma->vm_page_prot));
@@ -123,7 +122,6 @@ static int mcopy_atomic_pte(struct mm_struct *dst_mm, · 19 unmodified lines
123 goto out_release_uncharge_unlock;122 goto out_release_uncharge_unlock;
124 123
125 inc_mm_counter(dst_mm, MM_ANONPAGES);124 inc_mm_counter(dst_mm, MM_ANONPAGES);
126 mem_cgroup_commit_charge(page, memcg, false);
127 page_add_new_anon_rmap(page, dst_vma, dst_addr, false);125 page_add_new_anon_rmap(page, dst_vma, dst_addr, false);
128 lru_cache_add_active_or_unevictable(page, dst_vma);126 lru_cache_add_active_or_unevictable(page, dst_vma);
129 127
@@ -138,7 +136,6 @@ out: · 8 unmodified lines
138 return ret;136 return ret;
139out_release_uncharge_unlock:137out_release_uncharge_unlock:
140 pte_unmap_unlock(dst_pte, ptl);138 pte_unmap_unlock(dst_pte, ptl);
141 mem_cgroup_cancel_charge(page, memcg);
142out_release:139out_release:
143 put_page(page);140 put_page(page);
144 goto out;141 goto out;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t