All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Matthew Wilcox (Oracle)" <willy@infradead.org>
To: linux-mm@kvack.org
Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>,
	linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: [PATCH v4 10/25] mm/util: Add folio_mapping and folio_file_mapping
Date: Fri,  5 Mar 2021 04:18:46 +0000	[thread overview]
Message-ID: <20210305041901.2396498-11-willy@infradead.org> (raw)
In-Reply-To: <20210305041901.2396498-1-willy@infradead.org>

These are the folio equivalent of page_mapping() and page_file_mapping().
Add an out-of-line page_mapping() wrapper around folio_mapping()
in order to prevent the page_folio() call from bloating every caller
of page_mapping().  Adjust page_file_mapping() and page_mapping_file()
to use folios internally.

This ends up saving 102 bytes of text overall.  folio_mapping() is
45 bytes shorter than page_mapping() was, but the compiler chooses to
inline folio_mapping() into page_mapping_file(), for a net increase of
69 bytes in the core.  This is made up for by a few bytes less in dozens
of nfs functions (which call page_file_mapping()).  The small amount of
difference appears to be a slight change in gcc's register allocation
decisions, which allow:

   48 8b 56 08         mov    0x8(%rsi),%rdx
   48 8d 42 ff         lea    -0x1(%rdx),%rax
   83 e2 01            and    $0x1,%edx
   48 0f 44 c6         cmove  %rsi,%rax

to become:

   48 8b 46 08         mov    0x8(%rsi),%rax
   48 8d 78 ff         lea    -0x1(%rax),%rdi
   a8 01               test   $0x1,%al
   48 0f 44 fe         cmove  %rsi,%rdi

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 include/linux/mm.h      | 14 --------------
 include/linux/pagemap.h | 17 +++++++++++++++++
 mm/Makefile             |  2 +-
 mm/folio-compat.c       | 13 +++++++++++++
 mm/swapfile.c           |  6 +++---
 mm/util.c               | 20 ++++++++++----------
 6 files changed, 44 insertions(+), 28 deletions(-)
 create mode 100644 mm/folio-compat.c

diff --git a/include/linux/mm.h b/include/linux/mm.h
index 4595955805f8..9199b59ee8da 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1603,19 +1603,6 @@ void page_address_init(void);
 
 extern void *page_rmapping(struct page *page);
 extern struct anon_vma *page_anon_vma(struct page *page);
-extern struct address_space *page_mapping(struct page *page);
-
-extern struct address_space *__page_file_mapping(struct page *);
-
-static inline
-struct address_space *page_file_mapping(struct page *page)
-{
-	if (unlikely(PageSwapCache(page)))
-		return __page_file_mapping(page);
-
-	return page->mapping;
-}
-
 extern pgoff_t __page_file_index(struct page *page);
 
 /*
@@ -1630,7 +1617,6 @@ static inline pgoff_t page_index(struct page *page)
 }
 
 bool page_mapped(struct page *page);
-struct address_space *page_mapping(struct page *page);
 struct address_space *page_mapping_file(struct page *page);
 
 /*
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index 5094b50f7680..5a2c0764d7c0 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -157,6 +157,23 @@ static inline void filemap_nr_thps_dec(struct address_space *mapping)
 
 void release_pages(struct page **pages, int nr);
 
+struct address_space *page_mapping(struct page *);
+struct address_space *folio_mapping(struct folio *);
+struct address_space *__folio_file_mapping(struct folio *);
+
+static inline struct address_space *folio_file_mapping(struct folio *folio)
+{
+	if (unlikely(FolioSwapCache(folio)))
+		return __folio_file_mapping(folio);
+
+	return folio->page.mapping;
+}
+
+static inline struct address_space *page_file_mapping(struct page *page)
+{
+	return folio_file_mapping(page_folio(page));
+}
+
 /*
  * speculatively take a reference to a page.
  * If the page is free (_refcount == 0), then _refcount is untouched, and 0
diff --git a/mm/Makefile b/mm/Makefile
index 72227b24a616..ceb0089efd29 100644
--- a/mm/Makefile
+++ b/mm/Makefile
@@ -46,7 +46,7 @@ mmu-$(CONFIG_MMU)	+= process_vm_access.o
 endif
 
 obj-y			:= filemap.o mempool.o oom_kill.o fadvise.o \
-			   maccess.o page-writeback.o \
+			   maccess.o page-writeback.o folio-compat.o \
 			   readahead.o swap.o truncate.o vmscan.o shmem.o \
 			   util.o mmzone.o vmstat.o backing-dev.o \
 			   mm_init.o percpu.o slab_common.o \
diff --git a/mm/folio-compat.c b/mm/folio-compat.c
new file mode 100644
index 000000000000..5e107aa30a62
--- /dev/null
+++ b/mm/folio-compat.c
@@ -0,0 +1,13 @@
+/*
+ * Compatibility functions which bloat the callers too much to make inline.
+ * All of the callers of these functions should be converted to use folios
+ * eventually.
+ */
+
+#include <linux/pagemap.h>
+
+struct address_space *page_mapping(struct page *page)
+{
+	return folio_mapping(page_folio(page));
+}
+EXPORT_SYMBOL(page_mapping);
diff --git a/mm/swapfile.c b/mm/swapfile.c
index 084a5b9a18e5..b80af7537d9e 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -3535,11 +3535,11 @@ struct swap_info_struct *page_swap_info(struct page *page)
 /*
  * out-of-line __page_file_ methods to avoid include hell.
  */
-struct address_space *__page_file_mapping(struct page *page)
+struct address_space *__folio_file_mapping(struct folio *folio)
 {
-	return page_swap_info(page)->swap_file->f_mapping;
+	return page_swap_info(&folio->page)->swap_file->f_mapping;
 }
-EXPORT_SYMBOL_GPL(__page_file_mapping);
+EXPORT_SYMBOL_GPL(__folio_file_mapping);
 
 pgoff_t __page_file_index(struct page *page)
 {
diff --git a/mm/util.c b/mm/util.c
index 54870226cea6..9ab72cfa4aa1 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -686,39 +686,39 @@ struct anon_vma *page_anon_vma(struct page *page)
 	return __page_rmapping(page);
 }
 
-struct address_space *page_mapping(struct page *page)
+struct address_space *folio_mapping(struct folio *folio)
 {
 	struct address_space *mapping;
 
-	page = compound_head(page);
-
 	/* This happens if someone calls flush_dcache_page on slab page */
-	if (unlikely(PageSlab(page)))
+	if (unlikely(FolioSlab(folio)))
 		return NULL;
 
-	if (unlikely(PageSwapCache(page))) {
+	if (unlikely(FolioSwapCache(folio))) {
 		swp_entry_t entry;
 
-		entry.val = page_private(page);
+		entry.val = folio_private(folio);
 		return swap_address_space(entry);
 	}
 
-	mapping = page->mapping;
+	mapping = folio->page.mapping;
 	if ((unsigned long)mapping & PAGE_MAPPING_ANON)
 		return NULL;
 
 	return (void *)((unsigned long)mapping & ~PAGE_MAPPING_FLAGS);
 }
-EXPORT_SYMBOL(page_mapping);
+EXPORT_SYMBOL(folio_mapping);
 
 /*
  * For file cache pages, return the address_space, otherwise return NULL
  */
 struct address_space *page_mapping_file(struct page *page)
 {
-	if (unlikely(PageSwapCache(page)))
+	struct folio *folio = page_folio(page);
+
+	if (unlikely(FolioSwapCache(folio)))
 		return NULL;
-	return page_mapping(page);
+	return folio_mapping(folio);
 }
 
 /* Slow path of page_mapcount() for compound pages */
-- 
2.30.0


  parent reply	other threads:[~2021-03-05  4:22 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-05  4:18 [PATCH v4 00/25] Page folios Matthew Wilcox (Oracle)
2021-03-05  4:18 ` [PATCH v4 01/25] mm: Introduce struct folio Matthew Wilcox (Oracle)
2021-03-13 20:37   ` Andrew Morton
2021-03-14  4:07     ` Matthew Wilcox
2021-03-17 17:14   ` Christoph Hellwig
2021-03-18 23:56   ` Balbir Singh
2021-03-19  1:25     ` Matthew Wilcox
2021-03-20  2:09       ` Balbir Singh
2021-03-22  2:52       ` Nicholas Piggin
2021-03-22  3:54         ` Matthew Wilcox
2021-03-05  4:18 ` [PATCH v4 02/25] mm: Add folio_pgdat and folio_zone Matthew Wilcox (Oracle)
2021-03-05  4:18 ` [PATCH v4 03/25] mm/vmstat: Add functions to account folio statistics Matthew Wilcox (Oracle)
2021-03-13 20:37   ` Andrew Morton
2021-03-14  4:11     ` Matthew Wilcox
2021-03-14  4:51       ` Andrew Morton
2021-03-17 17:16   ` Christoph Hellwig
2021-03-05  4:18 ` [PATCH v4 04/25] mm/debug: Add VM_BUG_ON_FOLIO and VM_WARN_ON_ONCE_FOLIO Matthew Wilcox (Oracle)
2021-03-05  4:18 ` [PATCH v4 05/25] mm: Add put_folio Matthew Wilcox (Oracle)
2021-03-05  4:18 ` [PATCH v4 06/25] mm: Add get_folio Matthew Wilcox (Oracle)
2021-03-05  4:18 ` [PATCH v4 07/25] mm: Create FolioFlags Matthew Wilcox (Oracle)
2021-03-15  2:24   ` Matthew Wilcox
2021-03-05  4:18 ` [PATCH v4 08/25] mm: Handle per-folio private data Matthew Wilcox (Oracle)
2021-03-17 17:20   ` Christoph Hellwig
2021-03-18 17:57     ` Matthew Wilcox
2021-03-05  4:18 ` [PATCH v4 09/25] mm: Add folio_index, folio_page and folio_contains Matthew Wilcox (Oracle)
2021-03-13 20:37   ` Andrew Morton
2021-03-14  3:45     ` Matthew Wilcox
2021-03-17 17:22     ` Christoph Hellwig
2021-03-05  4:18 ` Matthew Wilcox (Oracle) [this message]
2021-03-17 17:26   ` [PATCH v4 10/25] mm/util: Add folio_mapping and folio_file_mapping Christoph Hellwig
2021-03-05  4:18 ` [PATCH v4 11/25] mm/memcg: Add folio wrappers for various memcontrol functions Matthew Wilcox (Oracle)
2021-03-05  4:18 ` [PATCH v4 12/25] mm/filemap: Add unlock_folio Matthew Wilcox (Oracle)
2021-03-05  4:18 ` [PATCH v4 13/25] mm/filemap: Add lock_folio Matthew Wilcox (Oracle)
2021-03-05  4:18 ` [PATCH v4 14/25] mm/filemap: Add lock_folio_killable Matthew Wilcox (Oracle)
2021-03-05  4:18 ` [PATCH v4 15/25] mm/filemap: Convert lock_page_async to lock_folio_async Matthew Wilcox (Oracle)
2021-03-17 17:29   ` Christoph Hellwig
2021-03-05  4:18 ` [PATCH v4 16/25] mm/filemap: Convert end_page_writeback to end_folio_writeback Matthew Wilcox (Oracle)
2021-03-05  4:18 ` [PATCH v4 17/25] mm/filemap: Add wait_on_folio_locked & wait_on_folio_locked_killable Matthew Wilcox (Oracle)
2021-03-05  4:18 ` [PATCH v4 18/25] mm/page-writeback: Add wait_on_folio_writeback Matthew Wilcox (Oracle)
2021-03-05  4:18 ` [PATCH v4 19/25] mm/page-writeback: Add wait_for_stable_folio Matthew Wilcox (Oracle)
2021-03-05  4:18 ` [PATCH v4 20/25] mm/filemap: Convert wait_on_page_bit to wait_on_folio_bit Matthew Wilcox (Oracle)
2021-03-17 17:39   ` Christoph Hellwig
2021-03-05  4:18 ` [PATCH v4 21/25] mm/filemap: Add __lock_folio_or_retry Matthew Wilcox (Oracle)
2021-03-05  4:18 ` [PATCH v4 22/25] mm/filemap: Convert wake_up_page_bit to wake_up_folio_bit Matthew Wilcox (Oracle)
2021-03-05  4:18 ` [PATCH v4 23/25] mm/page-writeback: Convert test_clear_page_writeback to take a folio Matthew Wilcox (Oracle)
2021-03-05  4:19 ` [PATCH v4 24/25] mm/filemap: Convert page wait queues to be folios Matthew Wilcox (Oracle)
2021-03-05  4:19 ` [PATCH v4 25/25] cachefiles: Switch to wait_page_key Matthew Wilcox (Oracle)
2021-03-17 17:45   ` Christoph Hellwig
2021-03-13 20:36 ` [PATCH v4 00/25] Page folios Andrew Morton
2021-03-14  2:30   ` Matthew Wilcox
2021-03-14  3:09   ` Hugh Dickins
2021-03-14  3:09     ` Hugh Dickins
2021-03-15 11:55     ` Kirill A. Shutemov
2021-03-15 12:38       ` Michal Hocko
2021-03-15 19:09         ` Christoph Hellwig
2021-03-15 19:40           ` Matthew Wilcox
2021-03-15 22:27             ` Dave Chinner
2021-03-17 17:48             ` Christoph Hellwig
2021-03-15 21:33         ` Andi Kleen
2021-03-15 21:33           ` Andi Kleen
2021-03-15 13:45       ` Matthew Wilcox
2021-03-19  4:01 ` Matthew Wilcox

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210305041901.2396498-11-willy@infradead.org \
    --to=willy@infradead.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.