]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm/memcg: Convert mem_cgroup_migrate() to take folios
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Thu, 6 May 2021 22:14:59 +0000 (18:14 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Sat, 14 Aug 2021 01:35:23 +0000 (21:35 -0400)
Convert all callers of mem_cgroup_migrate() to call page_folio() first.
They all look like they're using head pages already, but this proves it.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Acked-by: Mike Rapoport <rppt@linux.ibm.com>
Reviewed-by: David Howells <dhowells@redhat.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
include/linux/memcontrol.h
mm/filemap.c
mm/memcontrol.c
mm/migrate.c
mm/shmem.c

index 3e5311045d5f40bbfe3e26afdb1c71ad4661395c..40678ea2f206c6015eb90ae6ac2fc1845f7a9518 100644 (file)
@@ -711,7 +711,7 @@ void mem_cgroup_swapin_uncharge_swap(swp_entry_t entry);
 void mem_cgroup_uncharge(struct folio *folio);
 void mem_cgroup_uncharge_list(struct list_head *page_list);
 
-void mem_cgroup_migrate(struct page *oldpage, struct page *newpage);
+void mem_cgroup_migrate(struct folio *old, struct folio *new);
 
 /**
  * mem_cgroup_lruvec - get the lru list vector for a memcg & node
@@ -1213,7 +1213,7 @@ static inline void mem_cgroup_uncharge_list(struct list_head *page_list)
 {
 }
 
-static inline void mem_cgroup_migrate(struct page *old, struct page *new)
+static inline void mem_cgroup_migrate(struct folio *old, struct folio *new)
 {
 }
 
index 1d8cf186c0e13adec3657df349661a04023583ce..4bf66a17ce1fa5a15505c846a2eb2f48cb65540f 100644 (file)
@@ -817,6 +817,8 @@ EXPORT_SYMBOL(file_write_and_wait_range);
  */
 void replace_page_cache_page(struct page *old, struct page *new)
 {
+       struct folio *fold = page_folio(old);
+       struct folio *fnew = page_folio(new);
        struct address_space *mapping = old->mapping;
        void (*freepage)(struct page *) = mapping->a_ops->freepage;
        pgoff_t offset = old->index;
@@ -831,7 +833,7 @@ void replace_page_cache_page(struct page *old, struct page *new)
        new->mapping = mapping;
        new->index = offset;
 
-       mem_cgroup_migrate(old, new);
+       mem_cgroup_migrate(fold, fnew);
 
        xas_lock_irqsave(&xas, flags);
        xas_store(&xas, new);
index db26a83d1535c8e19051e65db65e4cb283ab5078..a0c6e7deeb0bb332cf6dac035b12143dd7981bb6 100644 (file)
@@ -6941,36 +6941,35 @@ void mem_cgroup_uncharge_list(struct list_head *page_list)
 }
 
 /**
- * mem_cgroup_migrate - charge a page's replacement
- * @oldpage: currently circulating page
- * @newpage: replacement page
+ * mem_cgroup_migrate - Charge a folio's replacement.
+ * @old: Currently circulating folio.
+ * @new: Replacement folio.
  *
- * Charge @newpage as a replacement page for @oldpage. @oldpage will
+ * Charge @new as a replacement folio for @old. @old will
  * be uncharged upon free.
  *
- * Both pages must be locked, @newpage->mapping must be set up.
+ * Both folios must be locked, @new->mapping must be set up.
  */
-void mem_cgroup_migrate(struct page *oldpage, struct page *newpage)
+void mem_cgroup_migrate(struct folio *old, struct folio *new)
 {
-       struct folio *newfolio = page_folio(newpage);
        struct mem_cgroup *memcg;
-       long nr_pages = folio_nr_pages(newfolio);
+       long nr_pages = folio_nr_pages(new);
        unsigned long flags;
 
-       VM_BUG_ON_PAGE(!PageLocked(oldpage), oldpage);
-       VM_BUG_ON_FOLIO(!folio_test_locked(newfolio), newfolio);
-       VM_BUG_ON_FOLIO(PageAnon(oldpage) != folio_test_anon(newfolio), newfolio);
-       VM_BUG_ON_FOLIO(compound_nr(oldpage) != nr_pages, newfolio);
+       VM_BUG_ON_FOLIO(!folio_test_locked(old), old);
+       VM_BUG_ON_FOLIO(!folio_test_locked(new), new);
+       VM_BUG_ON_FOLIO(folio_test_anon(old) != folio_test_anon(new), new);
+       VM_BUG_ON_FOLIO(folio_nr_pages(old) != nr_pages, new);
 
        if (mem_cgroup_disabled())
                return;
 
-       /* Page cache replacement: new page already charged? */
-       if (folio_memcg(newfolio))
+       /* Page cache replacement: new folio already charged? */
+       if (folio_memcg(new))
                return;
 
-       memcg = page_memcg(oldpage);
-       VM_WARN_ON_ONCE_PAGE(!memcg, oldpage);
+       memcg = folio_memcg(old);
+       VM_WARN_ON_ONCE_FOLIO(!memcg, old);
        if (!memcg)
                return;
 
@@ -6982,11 +6981,11 @@ void mem_cgroup_migrate(struct page *oldpage, struct page *newpage)
        }
 
        css_get(&memcg->css);
-       commit_charge(newfolio, memcg);
+       commit_charge(new, memcg);
 
        local_irq_save(flags);
        mem_cgroup_charge_statistics(memcg, nr_pages);
-       memcg_check_events(memcg, page_to_nid(newpage));
+       memcg_check_events(memcg, folio_nid(new));
        local_irq_restore(flags);
 }
 
index b5bdae748f82c36705f6c4b56a80cff5d63e3fda..910552318df355d98d6b2ce960eeff4e7def4275 100644 (file)
@@ -541,6 +541,8 @@ int migrate_huge_page_move_mapping(struct address_space *mapping,
  */
 void migrate_page_states(struct page *newpage, struct page *page)
 {
+       struct folio *folio = page_folio(page);
+       struct folio *newfolio = page_folio(newpage);
        int cpupid;
 
        if (PageError(page))
@@ -608,7 +610,7 @@ void migrate_page_states(struct page *newpage, struct page *page)
        copy_page_owner(page, newpage);
 
        if (!PageHuge(page))
-               mem_cgroup_migrate(page, newpage);
+               mem_cgroup_migrate(folio, newfolio);
 }
 EXPORT_SYMBOL(migrate_page_states);
 
index 3931fed5c8d8c48e45bae2fa0fc14de604c49630..2fd75b4d49740967e8a3822e891479561bc88b99 100644 (file)
@@ -1619,6 +1619,7 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp,
                                struct shmem_inode_info *info, pgoff_t index)
 {
        struct page *oldpage, *newpage;
+       struct folio *old, *new;
        struct address_space *swap_mapping;
        swp_entry_t entry;
        pgoff_t swap_index;
@@ -1655,7 +1656,9 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp,
        xa_lock_irq(&swap_mapping->i_pages);
        error = shmem_replace_entry(swap_mapping, swap_index, oldpage, newpage);
        if (!error) {
-               mem_cgroup_migrate(oldpage, newpage);
+               old = page_folio(oldpage);
+               new = page_folio(newpage);
+               mem_cgroup_migrate(old, new);
                __inc_lruvec_page_state(newpage, NR_FILE_PAGES);
                __dec_lruvec_page_state(oldpage, NR_FILE_PAGES);
        }