[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250427185908.90450-5-ryncsn@gmail.com>
Date: Mon, 28 Apr 2025 02:59:06 +0800
From: Kairui Song <ryncsn@...il.com>
To: linux-mm@...ck.org
Cc: Andrew Morton <akpm@...ux-foundation.org>,
Matthew Wilcox <willy@...radead.org>,
David Hildenbrand <david@...hat.com>,
Hugh Dickins <hughd@...gle.com>,
Chris Li <chrisl@...nel.org>,
Yosry Ahmed <yosryahmed@...gle.com>,
"Huang, Ying" <ying.huang@...ux.alibaba.com>,
Nhat Pham <nphamcs@...il.com>,
Johannes Weiner <hannes@...xchg.org>,
linux-kernel@...r.kernel.org,
Kairui Song <kasong@...cent.com>
Subject: [PATCH 4/6] filemap: do not use folio_contains for swap cache folios
From: Kairui Song <kasong@...cent.com>
Currently, none of the folio_contains callers will encounter swap
cache folios.
For fs/ callers, swap cache folios are never part of their workflow.
For filemap and truncate, folio_contains is only used for sanity checks
to verify the folio index matches the expected lookup/invalidation target.
The swap cache does not utilize filemap or truncate helpers in ways that
would trigger these checks, as it mostly implements its own cache management.
Shmem won't interact with these sanity checks either unless thing went
wrong, it would directly trigger a BUG, because swap cache index are
unrelated to shmem index, and would almost certainly mismatch (unless
on collide).
While some filemap helpers works for swap cache space, the swap cache
is different from the page cache in many ways. So this helper will
unlikely to work in a helpful way for swap cache folios.
So make it explicit here that folio_contains should not be used for
swap cache folios. This helps to avoid misuse and remove the folio_index
usage here.
Signed-off-by: Kairui Song <kasong@...cent.com>
---
include/linux/pagemap.h | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index af25fb640463..a0bed4568c66 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -935,14 +935,14 @@ static inline struct page *folio_file_page(struct folio *folio, pgoff_t index)
* @folio: The folio.
* @index: The page index within the file.
*
- * Context: The caller should have the page locked in order to prevent
- * (eg) shmem from moving the page between the page cache and swap cache
- * and changing its index in the middle of the operation.
+ * Context: The caller should ensure folio->index is stable and it's
+ * not added to the swap cache.
* Return: true or false.
*/
static inline bool folio_contains(struct folio *folio, pgoff_t index)
{
- return index - folio_index(folio) < folio_nr_pages(folio);
+ VM_BUG_ON_FOLIO(folio_test_swapcache(folio), folio);
+ return index - folio->index < folio_nr_pages(folio);
}
unsigned filemap_get_folios(struct address_space *mapping, pgoff_t *start,
--
2.49.0
Powered by blists - more mailing lists