lkml.org 
[lkml]   [2021]   [Jul]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v13 072/137] mm/writeback: Add folio_cancel_dirty()
    Date
    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@infradead.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    ---
    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 54fde920d8e0..dcab9c9c5b92 100644
    --- a/include/linux/mm.h
    +++ b/include/linux/mm.h
    @@ -2004,13 +2004,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 3907244ed4a0..a0619a693675 100644
    --- a/include/linux/pagemap.h
    +++ b/include/linux/pagemap.h
    @@ -786,6 +786,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));
    +}

    int __set_page_dirty_nobuffers(struct page *page);
    int __set_page_dirty_no_writeback(struct page *page);
    diff --git a/mm/page-writeback.c b/mm/page-writeback.c
    index 3bbf15a7a60f..7f65e220ae9a 100644
    --- a/mm/page-writeback.c
    +++ b/mm/page-writeback.c
    @@ -2640,28 +2640,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);
    + folio_memcg_lock(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);
    + folio_memcg_unlock(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
    \
     
     \ /
      Last update: 2021-07-12 05:48    [W:4.058 / U:0.708 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site