OSDN Git Service

mm: Convert remove_mapping() to take a folio
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Sun, 13 Feb 2022 03:48:55 +0000 (22:48 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 21 Mar 2022 16:59:01 +0000 (12:59 -0400)
Add kernel-doc and return the number of pages removed in order to
get the statistics right in __invalidate_mapping_pages().

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Miaohe Lin <linmiaohe@huawei.com>
fs/splice.c
include/linux/swap.h
mm/truncate.c
mm/vmscan.c

index 23ff9c3..047b79d 100644 (file)
@@ -46,8 +46,7 @@
 static bool page_cache_pipe_buf_try_steal(struct pipe_inode_info *pipe,
                struct pipe_buffer *buf)
 {
-       struct page *page = buf->page;
-       struct folio *folio = page_folio(page);
+       struct folio *folio = page_folio(buf->page);
        struct address_space *mapping;
 
        folio_lock(folio);
@@ -74,7 +73,7 @@ static bool page_cache_pipe_buf_try_steal(struct pipe_inode_info *pipe,
                 * If we succeeded in removing the mapping, set LRU flag
                 * and return good.
                 */
-               if (remove_mapping(mapping, page)) {
+               if (remove_mapping(mapping, folio)) {
                        buf->flags |= PIPE_BUF_FLAG_LRU;
                        return true;
                }
index e7cb7a1..304f174 100644 (file)
@@ -395,7 +395,7 @@ extern unsigned long mem_cgroup_shrink_node(struct mem_cgroup *mem,
                                                unsigned long *nr_scanned);
 extern unsigned long shrink_all_memory(unsigned long nr_pages);
 extern int vm_swappiness;
-extern int remove_mapping(struct address_space *mapping, struct page *page);
+long remove_mapping(struct address_space *mapping, struct folio *folio);
 
 extern unsigned long reclaim_pages(struct list_head *page_list);
 #ifdef CONFIG_NUMA
index 06b7a4c..1d97c4c 100644 (file)
@@ -294,7 +294,7 @@ int invalidate_inode_page(struct page *page)
        if (folio_has_private(folio) && !filemap_release_folio(folio, 0))
                return 0;
 
-       return remove_mapping(mapping, page);
+       return remove_mapping(mapping, folio);
 }
 
 /**
index e49f5fb..5a018aa 100644 (file)
@@ -1335,23 +1335,28 @@ cannot_free:
        return 0;
 }
 
-/*
- * Attempt to detach a locked page from its ->mapping.  If it is dirty or if
- * someone else has a ref on the page, abort and return 0.  If it was
- * successfully detached, return 1.  Assumes the caller has a single ref on
- * this page.
+/**
+ * remove_mapping() - Attempt to remove a folio from its mapping.
+ * @mapping: The address space.
+ * @folio: The folio to remove.
+ *
+ * If the folio is dirty, under writeback or if someone else has a ref
+ * on it, removal will fail.
+ * Return: The number of pages removed from the mapping.  0 if the folio
+ * could not be removed.
+ * Context: The caller should have a single refcount on the folio and
+ * hold its lock.
  */
-int remove_mapping(struct address_space *mapping, struct page *page)
+long remove_mapping(struct address_space *mapping, struct folio *folio)
 {
-       struct folio *folio = page_folio(page);
        if (__remove_mapping(mapping, folio, false, NULL)) {
                /*
-                * Unfreezing the refcount with 1 rather than 2 effectively
+                * Unfreezing the refcount with 1 effectively
                 * drops the pagecache ref for us without requiring another
                 * atomic operation.
                 */
                folio_ref_unfreeze(folio, 1);
-               return 1;
+               return folio_nr_pages(folio);
        }
        return 0;
 }