mm/memcg: Convert mem_cgroup_charge() to take a folio
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 25 Jun 2021 13:27:04 +0000 (09:27 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 27 Sep 2021 13:27:31 +0000 (09:27 -0400)
Convert all callers of mem_cgroup_charge() to call page_folio() on the
page they're currently passing in.  Many of them will be converted to
use folios themselves soon.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: David Howells <dhowells@redhat.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
include/linux/memcontrol.h
kernel/events/uprobes.c
mm/filemap.c
mm/huge_memory.c
mm/khugepaged.c
mm/ksm.c
mm/memcontrol.c
mm/memory.c
mm/migrate.c
mm/shmem.c
mm/userfaultfd.c

index 0665967..19a5172 100644 (file)
@@ -694,14 +694,28 @@ static inline bool mem_cgroup_below_min(struct mem_cgroup *memcg)
                page_counter_read(&memcg->memory);
 }
 
-int __mem_cgroup_charge(struct page *page, struct mm_struct *mm,
-                       gfp_t gfp_mask);
-static inline int mem_cgroup_charge(struct page *page, struct mm_struct *mm,
-                                   gfp_t gfp_mask)
+int __mem_cgroup_charge(struct folio *folio, struct mm_struct *mm, gfp_t gfp);
+
+/**
+ * mem_cgroup_charge - Charge a newly allocated folio to a cgroup.
+ * @folio: Folio to charge.
+ * @mm: mm context of the allocating task.
+ * @gfp: Reclaim mode.
+ *
+ * Try to charge @folio to the memcg that @mm belongs to, reclaiming
+ * pages according to @gfp if necessary.  If @mm is NULL, try to
+ * charge to the active memcg.
+ *
+ * Do not use this for folios allocated for swapin.
+ *
+ * Return: 0 on success. Otherwise, an error code is returned.
+ */
+static inline int mem_cgroup_charge(struct folio *folio, struct mm_struct *mm,
+                                   gfp_t gfp)
 {
        if (mem_cgroup_disabled())
                return 0;
-       return __mem_cgroup_charge(page, mm, gfp_mask);
+       return __mem_cgroup_charge(folio, mm, gfp);
 }
 
 int mem_cgroup_swapin_charge_page(struct page *page, struct mm_struct *mm,
@@ -1199,8 +1213,8 @@ static inline bool mem_cgroup_below_min(struct mem_cgroup *memcg)
        return false;
 }
 
-static inline int mem_cgroup_charge(struct page *page, struct mm_struct *mm,
-                                   gfp_t gfp_mask)
+static inline int mem_cgroup_charge(struct folio *folio,
+               struct mm_struct *mm, gfp_t gfp)
 {
        return 0;
 }
index af24dc3..6357c35 100644 (file)
@@ -167,7 +167,8 @@ static int __replace_page(struct vm_area_struct *vma, unsigned long addr,
                                addr + PAGE_SIZE);
 
        if (new_page) {
-               err = mem_cgroup_charge(new_page, vma->vm_mm, GFP_KERNEL);
+               err = mem_cgroup_charge(page_folio(new_page), vma->vm_mm,
+                                       GFP_KERNEL);
                if (err)
                        return err;
        }
index d74be9f..816af22 100644 (file)
@@ -889,7 +889,7 @@ noinline int __add_to_page_cache_locked(struct page *page,
        page->index = offset;
 
        if (!huge) {
-               error = mem_cgroup_charge(page, NULL, gfp);
+               error = mem_cgroup_charge(page_folio(page), NULL, gfp);
                if (error)
                        goto error;
                charged = true;
index 5e9ef0f..d49986a 100644 (file)
@@ -603,7 +603,7 @@ static vm_fault_t __do_huge_pmd_anonymous_page(struct vm_fault *vmf,
 
        VM_BUG_ON_PAGE(!PageCompound(page), page);
 
-       if (mem_cgroup_charge(page, vma->vm_mm, gfp)) {
+       if (mem_cgroup_charge(page_folio(page), vma->vm_mm, gfp)) {
                put_page(page);
                count_vm_event(THP_FAULT_FALLBACK);
                count_vm_event(THP_FAULT_FALLBACK_CHARGE);
index 045cc57..8480a3b 100644 (file)
@@ -1087,7 +1087,7 @@ static void collapse_huge_page(struct mm_struct *mm,
                goto out_nolock;
        }
 
-       if (unlikely(mem_cgroup_charge(new_page, mm, gfp))) {
+       if (unlikely(mem_cgroup_charge(page_folio(new_page), mm, gfp))) {
                result = SCAN_CGROUP_CHARGE_FAIL;
                goto out_nolock;
        }
@@ -1658,7 +1658,7 @@ static void collapse_file(struct mm_struct *mm,
                goto out;
        }
 
-       if (unlikely(mem_cgroup_charge(new_page, mm, gfp))) {
+       if (unlikely(mem_cgroup_charge(page_folio(new_page), mm, gfp))) {
                result = SCAN_CGROUP_CHARGE_FAIL;
                goto out;
        }
index a5716fd..c246a0b 100644 (file)
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -2578,7 +2578,8 @@ struct page *ksm_might_need_to_copy(struct page *page,
                return page;            /* let do_swap_page report the error */
 
        new_page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, address);
-       if (new_page && mem_cgroup_charge(new_page, vma->vm_mm, GFP_KERNEL)) {
+       if (new_page &&
+           mem_cgroup_charge(page_folio(new_page), vma->vm_mm, GFP_KERNEL)) {
                put_page(new_page);
                new_page = NULL;
        }
index e352225..dbca7bf 100644 (file)
@@ -6660,9 +6660,9 @@ void mem_cgroup_calculate_protection(struct mem_cgroup *root,
                        atomic_long_read(&parent->memory.children_low_usage)));
 }
 
-static int charge_memcg(struct page *page, struct mem_cgroup *memcg, gfp_t gfp)
+static int charge_memcg(struct folio *folio, struct mem_cgroup *memcg,
+                       gfp_t gfp)
 {
-       struct folio *folio = page_folio(page);
        long nr_pages = folio_nr_pages(folio);
        int ret;
 
@@ -6675,34 +6675,19 @@ static int charge_memcg(struct page *page, struct mem_cgroup *memcg, gfp_t gfp)
 
        local_irq_disable();
        mem_cgroup_charge_statistics(memcg, nr_pages);
-       memcg_check_events(memcg, page_to_nid(page));
+       memcg_check_events(memcg, folio_nid(folio));
        local_irq_enable();
 out:
        return ret;
 }
 
-/**
- * __mem_cgroup_charge - charge a newly allocated page to a cgroup
- * @page: page to charge
- * @mm: mm context of the victim
- * @gfp_mask: reclaim mode
- *
- * Try to charge @page to the memcg that @mm belongs to, reclaiming
- * pages according to @gfp_mask if necessary. if @mm is NULL, try to
- * charge to the active memcg.
- *
- * Do not use this for pages allocated for swapin.
- *
- * Returns 0 on success. Otherwise, an error code is returned.
- */
-int __mem_cgroup_charge(struct page *page, struct mm_struct *mm,
-                       gfp_t gfp_mask)
+int __mem_cgroup_charge(struct folio *folio, struct mm_struct *mm, gfp_t gfp)
 {
        struct mem_cgroup *memcg;
        int ret;
 
        memcg = get_mem_cgroup_from_mm(mm);
-       ret = charge_memcg(page, memcg, gfp_mask);
+       ret = charge_memcg(folio, memcg, gfp);
        css_put(&memcg->css);
 
        return ret;
@@ -6723,6 +6708,7 @@ int __mem_cgroup_charge(struct page *page, struct mm_struct *mm,
 int mem_cgroup_swapin_charge_page(struct page *page, struct mm_struct *mm,
                                  gfp_t gfp, swp_entry_t entry)
 {
+       struct folio *folio = page_folio(page);
        struct mem_cgroup *memcg;
        unsigned short id;
        int ret;
@@ -6737,7 +6723,7 @@ int mem_cgroup_swapin_charge_page(struct page *page, struct mm_struct *mm,
                memcg = get_mem_cgroup_from_mm(mm);
        rcu_read_unlock();
 
-       ret = charge_memcg(page, memcg, gfp);
+       ret = charge_memcg(folio, memcg, gfp);
 
        css_put(&memcg->css);
        return ret;
index 269992b..b67d805 100644 (file)
@@ -990,7 +990,7 @@ page_copy_prealloc(struct mm_struct *src_mm, struct vm_area_struct *vma,
        if (!new_page)
                return NULL;
 
-       if (mem_cgroup_charge(new_page, src_mm, GFP_KERNEL)) {
+       if (mem_cgroup_charge(page_folio(new_page), src_mm, GFP_KERNEL)) {
                put_page(new_page);
                return NULL;
        }
@@ -3019,7 +3019,7 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf)
                }
        }
 
-       if (mem_cgroup_charge(new_page, mm, GFP_KERNEL))
+       if (mem_cgroup_charge(page_folio(new_page), mm, GFP_KERNEL))
                goto oom_free_new;
        cgroup_throttle_swaprate(new_page, GFP_KERNEL);
 
@@ -3769,7 +3769,7 @@ static vm_fault_t do_anonymous_page(struct vm_fault *vmf)
        if (!page)
                goto oom;
 
-       if (mem_cgroup_charge(page, vma->vm_mm, GFP_KERNEL))
+       if (mem_cgroup_charge(page_folio(page), vma->vm_mm, GFP_KERNEL))
                goto oom_free_page;
        cgroup_throttle_swaprate(page, GFP_KERNEL);
 
@@ -4193,7 +4193,8 @@ static vm_fault_t do_cow_fault(struct vm_fault *vmf)
        if (!vmf->cow_page)
                return VM_FAULT_OOM;
 
-       if (mem_cgroup_charge(vmf->cow_page, vma->vm_mm, GFP_KERNEL)) {
+       if (mem_cgroup_charge(page_folio(vmf->cow_page), vma->vm_mm,
+                               GFP_KERNEL)) {
                put_page(vmf->cow_page);
                return VM_FAULT_OOM;
        }
index a6a7743..da55d2a 100644 (file)
@@ -2846,7 +2846,7 @@ static void migrate_vma_insert_page(struct migrate_vma *migrate,
 
        if (unlikely(anon_vma_prepare(vma)))
                goto abort;
-       if (mem_cgroup_charge(page, vma->vm_mm, GFP_KERNEL))
+       if (mem_cgroup_charge(page_folio(page), vma->vm_mm, GFP_KERNEL))
                goto abort;
 
        /*
index b5860f4..a2e653a 100644 (file)
@@ -710,7 +710,7 @@ static int shmem_add_to_page_cache(struct page *page,
        page->index = index;
 
        if (!PageSwapCache(page)) {
-               error = mem_cgroup_charge(page, charge_mm, gfp);
+               error = mem_cgroup_charge(page_folio(page), charge_mm, gfp);
                if (error) {
                        if (PageTransHuge(page)) {
                                count_vm_event(THP_FILE_FALLBACK);
index 7a90084..36e5f6a 100644 (file)
@@ -164,7 +164,7 @@ static int mcopy_atomic_pte(struct mm_struct *dst_mm,
        __SetPageUptodate(page);
 
        ret = -ENOMEM;
-       if (mem_cgroup_charge(page, dst_mm, GFP_KERNEL))
+       if (mem_cgroup_charge(page_folio(page), dst_mm, GFP_KERNEL))
                goto out_release;
 
        ret = mfill_atomic_install_pte(dst_mm, dst_pmd, dst_vma, dst_addr,