mm: remove use of folio list from folios_put()
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Tue, 27 Feb 2024 17:42:40 +0000 (17:42 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 5 Mar 2024 01:01:23 +0000 (17:01 -0800)
Instead of putting the interesting folios on a list, delete the
uninteresting one from the folio_batch.

Link: https://lkml.kernel.org/r/20240227174254.710559-7-willy@infradead.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Ryan Roberts <ryan.roberts@arm.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Mel Gorman <mgorman@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/swap.c

index 1cfb7b897ebd1849fef4f6e22c8ec785910b1023..ee8b131bf32cf1859f80df5c0f6d725e8a0aea9d 100644 (file)
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -961,12 +961,11 @@ void lru_cache_disable(void)
  */
 void folios_put_refs(struct folio_batch *folios, unsigned int *refs)
 {
-       int i;
-       LIST_HEAD(pages_to_free);
+       int i, j;
        struct lruvec *lruvec = NULL;
        unsigned long flags = 0;
 
-       for (i = 0; i < folios->nr; i++) {
+       for (i = 0, j = 0; i < folios->nr; i++) {
                struct folio *folio = folios->folios[i];
                unsigned int nr_refs = refs ? refs[i] : 1;
 
@@ -1016,14 +1015,20 @@ void folios_put_refs(struct folio_batch *folios, unsigned int *refs)
                        count_vm_event(UNEVICTABLE_PGCLEARED);
                }
 
-               list_add(&folio->lru, &pages_to_free);
+               if (j != i)
+                       folios->folios[j] = folio;
+               j++;
        }
        if (lruvec)
                unlock_page_lruvec_irqrestore(lruvec, flags);
+       if (!j) {
+               folio_batch_reinit(folios);
+               return;
+       }
 
-       mem_cgroup_uncharge_list(&pages_to_free);
-       free_unref_page_list(&pages_to_free);
-       folio_batch_reinit(folios);
+       folios->nr = j;
+       mem_cgroup_uncharge_folios(folios);
+       free_unref_folios(folios);
 }
 EXPORT_SYMBOL(folios_put_refs);