BACKPORT: mm: remove use of folio list from folios_put()

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
Change-Id: I1c416d2a6b8a78a9b194c4cf45577b64b8cb99c6
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>
(cherry picked from commit 7c33b8c4229af19797c78de48827ca70228c1f47)
[ Fix trivial conflicts in folio_put_ref() - Kalesh Singh]
Bug: 419599659
Signed-off-by: Kalesh Singh <kaleshsingh@google.com>
This commit is contained in:
Matthew Wilcox (Oracle)
2024-02-27 17:42:40 +00:00
committed by Kalesh Singh
parent f9c6fb1b82
commit 316b2e6e4b

View File

@@ -973,12 +973,11 @@ EXPORT_SYMBOL_GPL(lru_cache_disable);
*/ */
void folios_put_refs(struct folio_batch *folios, unsigned int *refs) void folios_put_refs(struct folio_batch *folios, unsigned int *refs)
{ {
int i; int i, j;
LIST_HEAD(pages_to_free);
struct lruvec *lruvec = NULL; struct lruvec *lruvec = NULL;
unsigned long flags = 0; 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]; struct folio *folio = folios->folios[i];
unsigned int nr_refs = refs ? refs[i] : 1; unsigned int nr_refs = refs ? refs[i] : 1;
@@ -1017,14 +1016,20 @@ void folios_put_refs(struct folio_batch *folios, unsigned int *refs)
__folio_clear_lru_flags(folio); __folio_clear_lru_flags(folio);
} }
list_add(&folio->lru, &pages_to_free); if (j != i)
folios->folios[j] = folio;
j++;
} }
if (lruvec) if (lruvec)
unlock_page_lruvec_irqrestore(lruvec, flags); unlock_page_lruvec_irqrestore(lruvec, flags);
if (!j) {
folio_batch_reinit(folios);
return;
}
mem_cgroup_uncharge_list(&pages_to_free); folios->nr = j;
free_unref_page_list(&pages_to_free); mem_cgroup_uncharge_folios(folios);
folio_batch_reinit(folios); free_unref_folios(folios);
} }
EXPORT_SYMBOL(folios_put_refs); EXPORT_SYMBOL(folios_put_refs);