From: Jan Kara <jack@suse.cz>
To: <linux-fsdevel@vger.kernel.org>
Cc: Ross Zwisler <ross.zwisler@linux.intel.com>, <linux-mm@kvack.org>,
<linux-ext4@vger.kernel.org>,
Johannes Weiner <hannes@cmpxchg.org>, Jan Kara <jack@suse.cz>
Subject: [PATCH 3/6] dax: Avoid page invalidation races and unnecessary radix tree traversals
Date: Mon, 12 Dec 2016 17:47:05 +0100 [thread overview]
Message-ID: <20161212164708.23244-4-jack@suse.cz> (raw)
In-Reply-To: <20161212164708.23244-1-jack@suse.cz>
Currently dax_iomap_rw() takes care of invalidating page tables and
evicting hole pages from the radix tree when write(2) to the file
happens. This invalidation is only necessary when there is some block
allocation resulting from write(2). Furthermore in current place the
invalidation is racy wrt page fault instantiating a hole page just after
we have invalidated it.
So perform the page invalidation inside dax_iomap_actor() where we can
do it only when really necessary and after blocks have been allocated so
nobody will be instantiating new hole pages anymore.
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Ross Zwisler <ross.zwisler@linux.intel.com>
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/dax.c | 28 +++++++++++-----------------
1 file changed, 11 insertions(+), 17 deletions(-)
diff --git a/fs/dax.c b/fs/dax.c
index 71863f0d51f7..97858dd5dab6 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -986,6 +986,17 @@ dax_iomap_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
if (WARN_ON_ONCE(iomap->type != IOMAP_MAPPED))
return -EIO;
+ /*
+ * Write can allocate block for an area which has a hole page mapped
+ * into page tables. We have to tear down these mappings so that data
+ * written by write(2) is visible in mmap.
+ */
+ if ((iomap->flags & IOMAP_F_NEW) && inode->i_mapping->nrpages) {
+ invalidate_inode_pages2_range(inode->i_mapping,
+ pos >> PAGE_SHIFT,
+ (end - 1) >> PAGE_SHIFT);
+ }
+
while (pos < end) {
unsigned offset = pos & (PAGE_SIZE - 1);
struct blk_dax_ctl dax = { 0 };
@@ -1044,23 +1055,6 @@ dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter,
if (iov_iter_rw(iter) == WRITE)
flags |= IOMAP_WRITE;
- /*
- * Yes, even DAX files can have page cache attached to them: A zeroed
- * page is inserted into the pagecache when we have to serve a write
- * fault on a hole. It should never be dirtied and can simply be
- * dropped from the pagecache once we get real data for the page.
- *
- * XXX: This is racy against mmap, and there's nothing we can do about
- * it. We'll eventually need to shift this down even further so that
- * we can check if we allocated blocks over a hole first.
- */
- if (mapping->nrpages) {
- ret = invalidate_inode_pages2_range(mapping,
- pos >> PAGE_SHIFT,
- (pos + iov_iter_count(iter) - 1) >> PAGE_SHIFT);
- WARN_ON_ONCE(ret);
- }
-
while (iov_iter_count(iter)) {
ret = iomap_apply(inode, pos, iov_iter_count(iter), flags, ops,
iter, dax_iomap_actor);
--
2.10.2
--
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:[~2016-12-12 16:47 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-12 16:47 [PATCH 0/6 v3] dax: Page invalidation fixes Jan Kara
2016-12-12 16:47 ` [PATCH 1/6] ext2: Return BH_New buffers for zeroed blocks Jan Kara
2016-12-12 16:47 ` [PATCH 2/6] mm: Invalidate DAX radix tree entries only if appropriate Jan Kara
2016-12-12 17:50 ` Johannes Weiner
2016-12-12 16:47 ` Jan Kara [this message]
2016-12-12 16:47 ` [PATCH 4/6] dax: Finish fault completely when loading holes Jan Kara
2016-12-12 16:47 ` [PATCH 5/6] dax: Call ->iomap_begin without entry lock during dax fault Jan Kara
2016-12-12 16:47 ` [PATCH 6/6] ext4: Simplify DAX fault path Jan Kara
2016-12-12 17:51 ` [PATCH 0/6 v3] dax: Page invalidation fixes Johannes Weiner
2016-12-13 11:52 ` Jan Kara
2016-12-13 18:57 ` Dan Williams
2016-12-17 1:35 ` Dan Williams
2016-12-17 1:49 ` Dan Williams
2016-12-19 9:56 ` Jan Kara
2016-12-19 21:51 ` Dan Williams
2016-12-20 7:59 ` Jan Kara
2016-12-20 20:09 ` Dan Williams
2016-12-13 20:01 ` Dave Chinner
2016-12-13 20:42 ` Theodore Ts'o
-- strict thread matches above, loose matches on Subject: below --
2016-11-24 9:46 [PATCH 0/6 v2] " Jan Kara
2016-11-24 9:46 ` [PATCH 3/6] dax: Avoid page invalidation races and unnecessary radix tree traversals Jan Kara
2016-11-29 22:31 ` Ross Zwisler
2016-11-30 8:23 ` 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=20161212164708.23244-4-jack@suse.cz \
--to=jack@suse.cz \
--cc=hannes@cmpxchg.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ross.zwisler@linux.intel.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).