From: Shiyang Ruan <ruansy.fnst@cn.fujitsu.com> To: <linux-kernel@vger.kernel.org>, <linux-xfs@vger.kernel.org>, <linux-nvdimm@lists.01.org> Cc: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, darrick.wong@oracle.com, david@fromorbit.com, hch@lst.de, rgoldwyn@suse.de, qi.fuli@fujitsu.com, y-goto@fujitsu.com, Goldwyn Rodrigues <rgoldwyn@suse.com> Subject: [RFC PATCH 5/8] fsdax: replace mmap entry in case of CoW Date: Fri, 7 Aug 2020 21:13:33 +0800 [thread overview] Message-ID: <20200807131336.318774-6-ruansy.fnst@cn.fujitsu.com> (raw) In-Reply-To: <20200807131336.318774-1-ruansy.fnst@cn.fujitsu.com> We replace the existing entry to the newly allocated one in case of CoW. Also, we mark the entry as PAGECACHE_TAG_TOWRITE so writeback marks this entry as writeprotected. This helps us snapshots so new write pagefaults after snapshots trigger a CoW. Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com> Signed-off-by: Shiyang Ruan <ruansy.fnst@cn.fujitsu.com> --- fs/dax.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index 65553e3f7602..28b8e23b11ac 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -766,6 +766,9 @@ static int copy_user_dax(struct block_device *bdev, struct dax_device *dax_dev, return 0; } +#define DAX_IF_DIRTY (1ULL << 0) +#define DAX_IF_COW (1ULL << 1) + /* * By this point grab_mapping_entry() has ensured that we have a locked entry * of the appropriate size so we don't have to worry about downgrading PMDs to @@ -776,14 +779,16 @@ static int copy_user_dax(struct block_device *bdev, struct dax_device *dax_dev, static void *dax_insert_entry(struct xa_state *xas, struct address_space *mapping, struct vm_fault *vmf, pgoff_t bdoff, void *entry, pfn_t pfn, unsigned long flags, - bool dirty) + bool insert_flags) { void *new_entry = dax_make_entry(pfn, flags); + bool dirty = insert_flags & DAX_IF_DIRTY; + bool cow = insert_flags & DAX_IF_COW; if (dirty) __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); - if (dax_is_zero_entry(entry) && !(flags & DAX_ZERO_PAGE)) { + if (cow || (dax_is_zero_entry(entry) && !(flags & DAX_ZERO_PAGE))) { unsigned long index = xas->xa_index; /* we are replacing a zero page with block mapping */ if (dax_is_pmd_entry(entry)) @@ -795,7 +800,7 @@ static void *dax_insert_entry(struct xa_state *xas, xas_reset(xas); xas_lock_irq(xas); - if (dax_is_zero_entry(entry) || dax_is_empty_entry(entry)) { + if (cow || dax_is_zero_entry(entry) || dax_is_empty_entry(entry)) { void *old; dax_disassociate_entry(entry, mapping, false); @@ -819,6 +824,9 @@ static void *dax_insert_entry(struct xa_state *xas, if (dirty) xas_set_mark(xas, PAGECACHE_TAG_DIRTY); + if (cow) + xas_set_mark(xas, PAGECACHE_TAG_TOWRITE); + xas_unlock_irq(xas); return entry; } @@ -1366,6 +1374,7 @@ static vm_fault_t dax_iomap_pte_fault(struct vm_fault *vmf, pfn_t *pfnp, void *entry; pfn_t pfn; void *kaddr; + unsigned long insert_flags = 0; trace_dax_pte_fault(inode, vmf, ret); /* @@ -1491,8 +1500,10 @@ static vm_fault_t dax_iomap_pte_fault(struct vm_fault *vmf, pfn_t *pfnp, goto finish_iomap; case IOMAP_UNWRITTEN: - if (write && iomap.flags & IOMAP_F_SHARED) + if (write && (iomap.flags & IOMAP_F_SHARED)) { + insert_flags |= DAX_IF_COW; goto cow; + } fallthrough; case IOMAP_HOLE: if (!write) { @@ -1602,6 +1613,7 @@ static vm_fault_t dax_iomap_pmd_fault(struct vm_fault *vmf, pfn_t *pfnp, int error; pfn_t pfn; void *kaddr; + unsigned long insert_flags = 0; /* * Check whether offset isn't beyond end of file now. Caller is @@ -1717,14 +1729,17 @@ static vm_fault_t dax_iomap_pmd_fault(struct vm_fault *vmf, pfn_t *pfnp, result = vmf_insert_pfn_pmd(vmf, pfn, write); break; case IOMAP_UNWRITTEN: - if (write && iomap.flags & IOMAP_F_SHARED) + if (write && (iomap.flags & IOMAP_F_SHARED)) { + insert_flags |= DAX_IF_COW; goto cow; + } fallthrough; case IOMAP_HOLE: - if (WARN_ON_ONCE(write)) + if (!write) { + result = dax_pmd_load_hole(&xas, vmf, &iomap, &entry); break; - result = dax_pmd_load_hole(&xas, vmf, &iomap, &entry); - break; + } + fallthrough; default: WARN_ON_ONCE(1); break; -- 2.27.0 _______________________________________________ Linux-nvdimm mailing list -- linux-nvdimm@lists.01.org To unsubscribe send an email to linux-nvdimm-leave@lists.01.org
WARNING: multiple messages have this Message-ID (diff)
From: Shiyang Ruan <ruansy.fnst@cn.fujitsu.com> To: <linux-kernel@vger.kernel.org>, <linux-xfs@vger.kernel.org>, <linux-nvdimm@lists.01.org> Cc: <linux-mm@kvack.org>, <linux-fsdevel@vger.kernel.org>, <darrick.wong@oracle.com>, <dan.j.williams@intel.com>, <david@fromorbit.com>, <hch@lst.de>, <rgoldwyn@suse.de>, <qi.fuli@fujitsu.com>, <y-goto@fujitsu.com>, Goldwyn Rodrigues <rgoldwyn@suse.com> Subject: [RFC PATCH 5/8] fsdax: replace mmap entry in case of CoW Date: Fri, 7 Aug 2020 21:13:33 +0800 [thread overview] Message-ID: <20200807131336.318774-6-ruansy.fnst@cn.fujitsu.com> (raw) In-Reply-To: <20200807131336.318774-1-ruansy.fnst@cn.fujitsu.com> We replace the existing entry to the newly allocated one in case of CoW. Also, we mark the entry as PAGECACHE_TAG_TOWRITE so writeback marks this entry as writeprotected. This helps us snapshots so new write pagefaults after snapshots trigger a CoW. Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com> Signed-off-by: Shiyang Ruan <ruansy.fnst@cn.fujitsu.com> --- fs/dax.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index 65553e3f7602..28b8e23b11ac 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -766,6 +766,9 @@ static int copy_user_dax(struct block_device *bdev, struct dax_device *dax_dev, return 0; } +#define DAX_IF_DIRTY (1ULL << 0) +#define DAX_IF_COW (1ULL << 1) + /* * By this point grab_mapping_entry() has ensured that we have a locked entry * of the appropriate size so we don't have to worry about downgrading PMDs to @@ -776,14 +779,16 @@ static int copy_user_dax(struct block_device *bdev, struct dax_device *dax_dev, static void *dax_insert_entry(struct xa_state *xas, struct address_space *mapping, struct vm_fault *vmf, pgoff_t bdoff, void *entry, pfn_t pfn, unsigned long flags, - bool dirty) + bool insert_flags) { void *new_entry = dax_make_entry(pfn, flags); + bool dirty = insert_flags & DAX_IF_DIRTY; + bool cow = insert_flags & DAX_IF_COW; if (dirty) __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); - if (dax_is_zero_entry(entry) && !(flags & DAX_ZERO_PAGE)) { + if (cow || (dax_is_zero_entry(entry) && !(flags & DAX_ZERO_PAGE))) { unsigned long index = xas->xa_index; /* we are replacing a zero page with block mapping */ if (dax_is_pmd_entry(entry)) @@ -795,7 +800,7 @@ static void *dax_insert_entry(struct xa_state *xas, xas_reset(xas); xas_lock_irq(xas); - if (dax_is_zero_entry(entry) || dax_is_empty_entry(entry)) { + if (cow || dax_is_zero_entry(entry) || dax_is_empty_entry(entry)) { void *old; dax_disassociate_entry(entry, mapping, false); @@ -819,6 +824,9 @@ static void *dax_insert_entry(struct xa_state *xas, if (dirty) xas_set_mark(xas, PAGECACHE_TAG_DIRTY); + if (cow) + xas_set_mark(xas, PAGECACHE_TAG_TOWRITE); + xas_unlock_irq(xas); return entry; } @@ -1366,6 +1374,7 @@ static vm_fault_t dax_iomap_pte_fault(struct vm_fault *vmf, pfn_t *pfnp, void *entry; pfn_t pfn; void *kaddr; + unsigned long insert_flags = 0; trace_dax_pte_fault(inode, vmf, ret); /* @@ -1491,8 +1500,10 @@ static vm_fault_t dax_iomap_pte_fault(struct vm_fault *vmf, pfn_t *pfnp, goto finish_iomap; case IOMAP_UNWRITTEN: - if (write && iomap.flags & IOMAP_F_SHARED) + if (write && (iomap.flags & IOMAP_F_SHARED)) { + insert_flags |= DAX_IF_COW; goto cow; + } fallthrough; case IOMAP_HOLE: if (!write) { @@ -1602,6 +1613,7 @@ static vm_fault_t dax_iomap_pmd_fault(struct vm_fault *vmf, pfn_t *pfnp, int error; pfn_t pfn; void *kaddr; + unsigned long insert_flags = 0; /* * Check whether offset isn't beyond end of file now. Caller is @@ -1717,14 +1729,17 @@ static vm_fault_t dax_iomap_pmd_fault(struct vm_fault *vmf, pfn_t *pfnp, result = vmf_insert_pfn_pmd(vmf, pfn, write); break; case IOMAP_UNWRITTEN: - if (write && iomap.flags & IOMAP_F_SHARED) + if (write && (iomap.flags & IOMAP_F_SHARED)) { + insert_flags |= DAX_IF_COW; goto cow; + } fallthrough; case IOMAP_HOLE: - if (WARN_ON_ONCE(write)) + if (!write) { + result = dax_pmd_load_hole(&xas, vmf, &iomap, &entry); break; - result = dax_pmd_load_hole(&xas, vmf, &iomap, &entry); - break; + } + fallthrough; default: WARN_ON_ONCE(1); break; -- 2.27.0
next prev parent reply other threads:[~2020-08-07 13:13 UTC|newest] Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-08-07 13:13 [RFC PATCH 0/8] fsdax: introduce FS query interface to support reflink Shiyang Ruan 2020-08-07 13:13 ` Shiyang Ruan 2020-08-07 13:13 ` [RFC PATCH 1/8] fs: introduce get_shared_files() for dax&reflink Shiyang Ruan 2020-08-07 13:13 ` Shiyang Ruan 2020-08-07 16:15 ` Darrick J. Wong 2020-08-07 16:15 ` Darrick J. Wong 2020-08-10 8:07 ` Ruan Shiyang 2020-08-10 8:07 ` Ruan Shiyang 2020-08-07 13:13 ` [RFC PATCH 2/8] fsdax, mm: track files sharing dax page for memory-failure Shiyang Ruan 2020-08-07 13:13 ` Shiyang Ruan 2020-08-07 13:13 ` [RFC PATCH 3/8] fsdax: introduce dax_copy_edges() for COW Shiyang Ruan 2020-08-07 13:13 ` Shiyang Ruan 2020-08-07 13:13 ` [RFC PATCH 4/8] fsdax: copy data before write Shiyang Ruan 2020-08-07 13:13 ` Shiyang Ruan 2020-08-07 13:13 ` Shiyang Ruan [this message] 2020-08-07 13:13 ` [RFC PATCH 5/8] fsdax: replace mmap entry in case of CoW Shiyang Ruan 2020-08-07 13:13 ` [RFC PATCH 6/8] fsdax: dedup file range to use a compare function Shiyang Ruan 2020-08-07 13:13 ` Shiyang Ruan 2020-08-07 13:13 ` [RFC PATCH 7/8] fs/xfs: handle CoW for fsdax write() path Shiyang Ruan 2020-08-07 13:13 ` Shiyang Ruan 2020-08-07 13:13 ` [RFC PATCH 8/8] fs/xfs: support dedupe for fsdax Shiyang Ruan 2020-08-07 13:13 ` Shiyang Ruan 2020-08-07 15:38 ` kernel test robot 2020-08-07 15:54 ` kernel test robot 2020-08-07 13:38 ` [RFC PATCH 0/8] fsdax: introduce FS query interface to support reflink Matthew Wilcox 2020-08-07 13:38 ` Matthew Wilcox 2020-08-10 8:15 ` Ruan Shiyang 2020-08-10 8:15 ` Ruan Shiyang 2020-08-10 11:16 ` Matthew Wilcox 2020-08-10 11:16 ` Matthew Wilcox 2020-08-10 21:10 ` Dave Chinner 2020-08-10 21:10 ` Dave Chinner
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=20200807131336.318774-6-ruansy.fnst@cn.fujitsu.com \ --to=ruansy.fnst@cn.fujitsu.com \ --cc=darrick.wong@oracle.com \ --cc=david@fromorbit.com \ --cc=hch@lst.de \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=linux-nvdimm@lists.01.org \ --cc=linux-xfs@vger.kernel.org \ --cc=qi.fuli@fujitsu.com \ --cc=rgoldwyn@suse.com \ --cc=rgoldwyn@suse.de \ --cc=y-goto@fujitsu.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: linkBe 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.