vmscan: convert page buffer handling to use folios
This mostly just removes calls to compound_head() although nr_reclaimed should be incremented by the number of pages, not just 1. Link: https://lkml.kernel.org/r/20220504182857.4013401-11-willy@infradead.org Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
49bd2bf967
commit
0a36111c8c
48
mm/vmscan.c
48
mm/vmscan.c
|
@ -1859,38 +1859,40 @@ retry:
|
|||
}
|
||||
|
||||
/*
|
||||
* If the page has buffers, try to free the buffer mappings
|
||||
* associated with this page. If we succeed we try to free
|
||||
* the page as well.
|
||||
* If the folio has buffers, try to free the buffer
|
||||
* mappings associated with this folio. If we succeed
|
||||
* we try to free the folio as well.
|
||||
*
|
||||
* We do this even if the page is PageDirty().
|
||||
* try_to_release_page() does not perform I/O, but it is
|
||||
* possible for a page to have PageDirty set, but it is actually
|
||||
* clean (all its buffers are clean). This happens if the
|
||||
* buffers were written out directly, with submit_bh(). ext3
|
||||
* will do this, as well as the blockdev mapping.
|
||||
* try_to_release_page() will discover that cleanness and will
|
||||
* drop the buffers and mark the page clean - it can be freed.
|
||||
* We do this even if the folio is dirty.
|
||||
* filemap_release_folio() does not perform I/O, but it
|
||||
* is possible for a folio to have the dirty flag set,
|
||||
* but it is actually clean (all its buffers are clean).
|
||||
* This happens if the buffers were written out directly,
|
||||
* with submit_bh(). ext3 will do this, as well as
|
||||
* the blockdev mapping. filemap_release_folio() will
|
||||
* discover that cleanness and will drop the buffers
|
||||
* and mark the folio clean - it can be freed.
|
||||
*
|
||||
* Rarely, pages can have buffers and no ->mapping. These are
|
||||
* the pages which were not successfully invalidated in
|
||||
* truncate_cleanup_page(). We try to drop those buffers here
|
||||
* and if that worked, and the page is no longer mapped into
|
||||
* process address space (page_count == 1) it can be freed.
|
||||
* Otherwise, leave the page on the LRU so it is swappable.
|
||||
* Rarely, folios can have buffers and no ->mapping.
|
||||
* These are the folios which were not successfully
|
||||
* invalidated in truncate_cleanup_folio(). We try to
|
||||
* drop those buffers here and if that worked, and the
|
||||
* folio is no longer mapped into process address space
|
||||
* (refcount == 1) it can be freed. Otherwise, leave
|
||||
* the folio on the LRU so it is swappable.
|
||||
*/
|
||||
if (page_has_private(page)) {
|
||||
if (!try_to_release_page(page, sc->gfp_mask))
|
||||
if (folio_has_private(folio)) {
|
||||
if (!filemap_release_folio(folio, sc->gfp_mask))
|
||||
goto activate_locked;
|
||||
if (!mapping && page_count(page) == 1) {
|
||||
unlock_page(page);
|
||||
if (put_page_testzero(page))
|
||||
if (!mapping && folio_ref_count(folio) == 1) {
|
||||
folio_unlock(folio);
|
||||
if (folio_put_testzero(folio))
|
||||
goto free_it;
|
||||
else {
|
||||
/*
|
||||
* rare race with speculative reference.
|
||||
* the speculative reference will free
|
||||
* this page shortly, so we may
|
||||
* this folio shortly, so we may
|
||||
* increment nr_reclaimed here (and
|
||||
* leave it off the LRU).
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue