[PATCH v9 64/96] mm/writeback: Add folio_cancel_dirty

From: Matthew Wilcox (Oracle)
Date: Wed May 05 2021 - 12:21:43 EST


Turn __cancel_dirty_page() into __folio_cancel_dirty() and add wrappers.
Move the prototypes into pagemap.h since this is page cache functionality.
Saves 44 bytes of kernel text in total; 33 bytes from __folio_cancel_dirty
and 11 from two callers of cancel_dirty_page().

Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx>
---
include/linux/mm.h | 7 -------
include/linux/pagemap.h | 11 +++++++++++
mm/page-writeback.c | 16 ++++++++--------
3 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/include/linux/mm.h b/include/linux/mm.h
index 0beb94071a15..5ed887d51d07 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1996,13 +1996,6 @@ int redirty_page_for_writepage(struct writeback_control *wbc,
bool folio_mark_dirty(struct folio *folio);
bool set_page_dirty(struct page *page);
int set_page_dirty_lock(struct page *page);
-void __cancel_dirty_page(struct page *page);
-static inline void cancel_dirty_page(struct page *page)
-{
- /* Avoid atomic ops, locking, etc. when not actually needed. */
- if (PageDirty(page))
- __cancel_dirty_page(page);
-}
int clear_page_dirty_for_io(struct page *page);

int get_cmdline(struct task_struct *task, char *buffer, int buflen);
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index a5933bcb5f00..53a1b925f54e 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -847,6 +847,17 @@ static inline void account_page_cleaned(struct page *page,
{
return folio_account_cleaned(page_folio(page), mapping, wb);
}
+void __folio_cancel_dirty(struct folio *folio);
+static inline void folio_cancel_dirty(struct folio *folio)
+{
+ /* Avoid atomic ops, locking, etc. when not actually needed. */
+ if (folio_dirty(folio))
+ __folio_cancel_dirty(folio);
+}
+static inline void cancel_dirty_page(struct page *page)
+{
+ folio_cancel_dirty(page_folio(page));
+}

void page_endio(struct page *page, bool is_write, int err);

diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 261eb64387a9..57b39e2d46ac 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -2655,28 +2655,28 @@ EXPORT_SYMBOL(set_page_dirty_lock);
* page without actually doing it through the VM. Can you say "ext3 is
* horribly ugly"? Thought you could.
*/
-void __cancel_dirty_page(struct page *page)
+void __folio_cancel_dirty(struct folio *folio)
{
- struct address_space *mapping = page_mapping(page);
+ struct address_space *mapping = folio_mapping(folio);

if (mapping_can_writeback(mapping)) {
struct inode *inode = mapping->host;
struct bdi_writeback *wb;
struct wb_lock_cookie cookie = {};

- lock_page_memcg(page);
+ lock_folio_memcg(folio);
wb = unlocked_inode_to_wb_begin(inode, &cookie);

- if (TestClearPageDirty(page))
- account_page_cleaned(page, mapping, wb);
+ if (folio_test_clear_dirty_flag(folio))
+ folio_account_cleaned(folio, mapping, wb);

unlocked_inode_to_wb_end(inode, &cookie);
- unlock_page_memcg(page);
+ unlock_folio_memcg(folio);
} else {
- ClearPageDirty(page);
+ folio_clear_dirty_flag(folio);
}
}
-EXPORT_SYMBOL(__cancel_dirty_page);
+EXPORT_SYMBOL(__folio_cancel_dirty);

/*
* Clear a page's dirty flag, while caring for dirty memory accounting.
--
2.30.2