From: Jan Kara <jack@suse.cz> To: <linux-mm@kvack.org> Cc: <linux-fsdevel@vger.kernel.org>, Mel Gorman <mgorman@suse.com>, "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>, Jan Kara <jack@suse.cz> Subject: [PATCH 1/7] mm: Speedup cancel_dirty_page() for clean pages Date: Tue, 17 Oct 2017 18:21:14 +0200 [thread overview] Message-ID: <20171017162120.30990-2-jack@suse.cz> (raw) In-Reply-To: <20171017162120.30990-1-jack@suse.cz> cancel_dirty_page() does quite some work even for clean pages (fetching of mapping, locking of memcg, atomic bit op on page flags) so it accounts for ~2.5% of cost of truncation of a clean page. That is not much but still dumb for something we don't need at all. Check whether a page is actually dirty and avoid any work if not. Acked-by: Mel Gorman <mgorman@suse.de> Reviewed-by: Andi Kleen <ak@linux.intel.com> Signed-off-by: Jan Kara <jack@suse.cz> --- include/linux/mm.h | 8 +++++++- mm/page-writeback.c | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 065d99deb847..d14a9bb2a3d7 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1430,7 +1430,13 @@ void account_page_cleaned(struct page *page, struct address_space *mapping, struct bdi_writeback *wb); int set_page_dirty(struct page *page); int set_page_dirty_lock(struct page *page); -void cancel_dirty_page(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/mm/page-writeback.c b/mm/page-writeback.c index 0b9c5cbe8eba..c3bed3f5cd24 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -2623,7 +2623,7 @@ 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 __cancel_dirty_page(struct page *page) { struct address_space *mapping = page_mapping(page); @@ -2644,7 +2644,7 @@ void cancel_dirty_page(struct page *page) ClearPageDirty(page); } } -EXPORT_SYMBOL(cancel_dirty_page); +EXPORT_SYMBOL(__cancel_dirty_page); /* * Clear a page's dirty flag, while caring for dirty memory accounting. -- 2.12.3 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
WARNING: multiple messages have this Message-ID
From: Jan Kara <jack@suse.cz> To: linux-mm@kvack.org Cc: linux-fsdevel@vger.kernel.org, Mel Gorman <mgorman@suse.com>, "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>, Jan Kara <jack@suse.cz> Subject: [PATCH 1/7] mm: Speedup cancel_dirty_page() for clean pages Date: Tue, 17 Oct 2017 18:21:14 +0200 [thread overview] Message-ID: <20171017162120.30990-2-jack@suse.cz> (raw) In-Reply-To: <20171017162120.30990-1-jack@suse.cz> cancel_dirty_page() does quite some work even for clean pages (fetching of mapping, locking of memcg, atomic bit op on page flags) so it accounts for ~2.5% of cost of truncation of a clean page. That is not much but still dumb for something we don't need at all. Check whether a page is actually dirty and avoid any work if not. Acked-by: Mel Gorman <mgorman@suse.de> Reviewed-by: Andi Kleen <ak@linux.intel.com> Signed-off-by: Jan Kara <jack@suse.cz> --- include/linux/mm.h | 8 +++++++- mm/page-writeback.c | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 065d99deb847..d14a9bb2a3d7 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1430,7 +1430,13 @@ void account_page_cleaned(struct page *page, struct address_space *mapping, struct bdi_writeback *wb); int set_page_dirty(struct page *page); int set_page_dirty_lock(struct page *page); -void cancel_dirty_page(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/mm/page-writeback.c b/mm/page-writeback.c index 0b9c5cbe8eba..c3bed3f5cd24 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -2623,7 +2623,7 @@ 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 __cancel_dirty_page(struct page *page) { struct address_space *mapping = page_mapping(page); @@ -2644,7 +2644,7 @@ void cancel_dirty_page(struct page *page) ClearPageDirty(page); } } -EXPORT_SYMBOL(cancel_dirty_page); +EXPORT_SYMBOL(__cancel_dirty_page); /* * Clear a page's dirty flag, while caring for dirty memory accounting. -- 2.12.3 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2017-10-17 16:21 UTC|newest] Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-10-17 16:21 [PATCH 0/7 v2] Speed up page cache truncation Jan Kara 2017-10-17 16:21 ` Jan Kara 2017-10-17 16:21 ` Jan Kara [this message] 2017-10-17 16:21 ` [PATCH 1/7] mm: Speedup cancel_dirty_page() for clean pages Jan Kara 2017-10-17 16:21 ` [PATCH 2/7] mm: Refactor truncate_complete_page() Jan Kara 2017-10-17 16:21 ` Jan Kara 2017-10-17 16:21 ` [PATCH 3/7] mm: Factor out page cache page freeing into a separate function Jan Kara 2017-10-17 16:21 ` Jan Kara 2017-10-17 16:21 ` [PATCH 4/7] mm: Move accounting updates before page_cache_tree_delete() Jan Kara 2017-10-17 16:21 ` Jan Kara 2017-10-17 16:21 ` [PATCH 5/7] mm: Move clearing of page->mapping to page_cache_tree_delete() Jan Kara 2017-10-17 16:21 ` Jan Kara 2017-10-17 16:21 ` [PATCH 6/7] mm: Factor out checks and accounting from __delete_from_page_cache() Jan Kara 2017-10-17 16:21 ` Jan Kara 2017-10-17 16:21 ` [PATCH 7/7] mm: Batch radix tree operations when truncating pages Jan Kara 2017-10-17 16:21 ` Jan Kara -- strict thread matches above, loose matches on Subject: below -- 2017-10-10 15:19 [PATCH 0/7 v1] Speed up page cache truncation Jan Kara 2017-10-10 15:19 ` [PATCH 1/7] mm: Speedup cancel_dirty_page() for clean pages Jan Kara 2017-10-10 15:19 ` Jan Kara
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=20171017162120.30990-2-jack@suse.cz \ --to=jack@suse.cz \ --cc=kirill.shutemov@linux.intel.com \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=mgorman@suse.com \ --subject='Re: [PATCH 1/7] mm: Speedup cancel_dirty_page() for clean pages' \ /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
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.