From: Shiyang Ruan <ruansy.fnst@fujitsu.com> To: <linux-kernel@vger.kernel.org>, <linux-xfs@vger.kernel.org>, <nvdimm@lists.linux.dev>, <linux-mm@kvack.org>, <linux-fsdevel@vger.kernel.org>, <dm-devel@redhat.com> Cc: <darrick.wong@oracle.com>, <dan.j.williams@intel.com>, <david@fromorbit.com>, <hch@lst.de>, <agk@redhat.com>, <snitzer@redhat.com>, <rgoldwyn@suse.de> Subject: [PATCH v5 3/9] mm: factor helpers for memory_failure_dev_pagemap Date: Mon, 28 Jun 2021 08:02:12 +0800 [thread overview] Message-ID: <20210628000218.387833-4-ruansy.fnst@fujitsu.com> (raw) In-Reply-To: <20210628000218.387833-1-ruansy.fnst@fujitsu.com> memory_failure_dev_pagemap code is a bit complex before introduce RMAP feature for fsdax. So it is needed to factor some helper functions to simplify these code. Signed-off-by: Shiyang Ruan <ruansy.fnst@fujitsu.com> --- mm/memory-failure.c | 101 +++++++++++++++++++++++++------------------- 1 file changed, 57 insertions(+), 44 deletions(-) diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 0143d32bc666..068753911946 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -1243,6 +1243,60 @@ static int try_to_split_thp_page(struct page *page, const char *msg) return 0; } +static void unmap_and_kill(struct list_head *to_kill, unsigned long pfn, + struct address_space *mapping, pgoff_t index, int flags) +{ + struct to_kill *tk; + unsigned long size = 0; + + list_for_each_entry(tk, to_kill, nd) + if (tk->size_shift) + size = max(size, 1UL << tk->size_shift); + if (size) { + /* + * Unmap the largest mapping to avoid breaking up device-dax + * mappings which are constant size. The actual size of the + * mapping being torn down is communicated in siginfo, see + * kill_proc() + */ + loff_t start = (index << PAGE_SHIFT) & ~(size - 1); + + unmap_mapping_range(mapping, start, size, 0); + } + + kill_procs(to_kill, flags & MF_MUST_KILL, false, pfn, flags); +} + +static int mf_generic_kill_procs(unsigned long long pfn, int flags) +{ + struct page *page = pfn_to_page(pfn); + LIST_HEAD(to_kill); + dax_entry_t cookie; + + /* + * Prevent the inode from being freed while we are interrogating + * the address_space, typically this would be handled by + * lock_page(), but dax pages do not use the page lock. This + * also prevents changes to the mapping of this pfn until + * poison signaling is complete. + */ + cookie = dax_lock_page(page); + if (!cookie) + return -EBUSY; + /* + * Unlike System-RAM there is no possibility to swap in a + * different physical page at a given virtual address, so all + * userspace consumption of ZONE_DEVICE memory necessitates + * SIGBUS (i.e. MF_MUST_KILL) + */ + flags |= MF_ACTION_REQUIRED | MF_MUST_KILL; + collect_procs(page, &to_kill, flags & MF_ACTION_REQUIRED); + + unmap_and_kill(&to_kill, pfn, page->mapping, page->index, flags); + dax_unlock_page(page, cookie); + return 0; +} + static int memory_failure_hugetlb(unsigned long pfn, int flags) { struct page *p = pfn_to_page(pfn); @@ -1323,13 +1377,8 @@ static int memory_failure_dev_pagemap(unsigned long pfn, int flags, struct dev_pagemap *pgmap) { struct page *page = pfn_to_page(pfn); - const bool unmap_success = true; - unsigned long size = 0; - struct to_kill *tk; LIST_HEAD(tokill); int rc = -EBUSY; - loff_t start; - dax_entry_t cookie; if (flags & MF_COUNT_INCREASED) /* @@ -1343,20 +1392,9 @@ static int memory_failure_dev_pagemap(unsigned long pfn, int flags, goto out; } - /* - * Prevent the inode from being freed while we are interrogating - * the address_space, typically this would be handled by - * lock_page(), but dax pages do not use the page lock. This - * also prevents changes to the mapping of this pfn until - * poison signaling is complete. - */ - cookie = dax_lock_page(page); - if (!cookie) - goto out; - if (hwpoison_filter(page)) { rc = 0; - goto unlock; + goto out; } if (pgmap->type == MEMORY_DEVICE_PRIVATE) { @@ -1364,7 +1402,7 @@ static int memory_failure_dev_pagemap(unsigned long pfn, int flags, * TODO: Handle HMM pages which may need coordination * with device-side memory. */ - goto unlock; + goto out; } /* @@ -1373,32 +1411,7 @@ static int memory_failure_dev_pagemap(unsigned long pfn, int flags, */ SetPageHWPoison(page); - /* - * Unlike System-RAM there is no possibility to swap in a - * different physical page at a given virtual address, so all - * userspace consumption of ZONE_DEVICE memory necessitates - * SIGBUS (i.e. MF_MUST_KILL) - */ - flags |= MF_ACTION_REQUIRED | MF_MUST_KILL; - collect_procs(page, &tokill, flags & MF_ACTION_REQUIRED); - - list_for_each_entry(tk, &tokill, nd) - if (tk->size_shift) - size = max(size, 1UL << tk->size_shift); - if (size) { - /* - * Unmap the largest mapping to avoid breaking up - * device-dax mappings which are constant size. The - * actual size of the mapping being torn down is - * communicated in siginfo, see kill_proc() - */ - start = (page->index << PAGE_SHIFT) & ~(size - 1); - unmap_mapping_range(page->mapping, start, size, 0); - } - kill_procs(&tokill, flags & MF_MUST_KILL, !unmap_success, pfn, flags); - rc = 0; -unlock: - dax_unlock_page(page, cookie); + mf_generic_kill_procs(pfn, flags); out: /* drop pgmap ref acquired in caller */ put_dev_pagemap(pgmap); -- 2.32.0
WARNING: multiple messages have this Message-ID (diff)
From: Shiyang Ruan <ruansy.fnst@fujitsu.com> To: <linux-kernel@vger.kernel.org>, <linux-xfs@vger.kernel.org>, <nvdimm@lists.linux.dev>, <linux-mm@kvack.org>, <linux-fsdevel@vger.kernel.org>, <dm-devel@redhat.com> Cc: snitzer@redhat.com, darrick.wong@oracle.com, rgoldwyn@suse.de, david@fromorbit.com, dan.j.williams@intel.com, hch@lst.de, agk@redhat.com Subject: [dm-devel] [PATCH v5 3/9] mm: factor helpers for memory_failure_dev_pagemap Date: Mon, 28 Jun 2021 08:02:12 +0800 [thread overview] Message-ID: <20210628000218.387833-4-ruansy.fnst@fujitsu.com> (raw) In-Reply-To: <20210628000218.387833-1-ruansy.fnst@fujitsu.com> memory_failure_dev_pagemap code is a bit complex before introduce RMAP feature for fsdax. So it is needed to factor some helper functions to simplify these code. Signed-off-by: Shiyang Ruan <ruansy.fnst@fujitsu.com> --- mm/memory-failure.c | 101 +++++++++++++++++++++++++------------------- 1 file changed, 57 insertions(+), 44 deletions(-) diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 0143d32bc666..068753911946 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -1243,6 +1243,60 @@ static int try_to_split_thp_page(struct page *page, const char *msg) return 0; } +static void unmap_and_kill(struct list_head *to_kill, unsigned long pfn, + struct address_space *mapping, pgoff_t index, int flags) +{ + struct to_kill *tk; + unsigned long size = 0; + + list_for_each_entry(tk, to_kill, nd) + if (tk->size_shift) + size = max(size, 1UL << tk->size_shift); + if (size) { + /* + * Unmap the largest mapping to avoid breaking up device-dax + * mappings which are constant size. The actual size of the + * mapping being torn down is communicated in siginfo, see + * kill_proc() + */ + loff_t start = (index << PAGE_SHIFT) & ~(size - 1); + + unmap_mapping_range(mapping, start, size, 0); + } + + kill_procs(to_kill, flags & MF_MUST_KILL, false, pfn, flags); +} + +static int mf_generic_kill_procs(unsigned long long pfn, int flags) +{ + struct page *page = pfn_to_page(pfn); + LIST_HEAD(to_kill); + dax_entry_t cookie; + + /* + * Prevent the inode from being freed while we are interrogating + * the address_space, typically this would be handled by + * lock_page(), but dax pages do not use the page lock. This + * also prevents changes to the mapping of this pfn until + * poison signaling is complete. + */ + cookie = dax_lock_page(page); + if (!cookie) + return -EBUSY; + /* + * Unlike System-RAM there is no possibility to swap in a + * different physical page at a given virtual address, so all + * userspace consumption of ZONE_DEVICE memory necessitates + * SIGBUS (i.e. MF_MUST_KILL) + */ + flags |= MF_ACTION_REQUIRED | MF_MUST_KILL; + collect_procs(page, &to_kill, flags & MF_ACTION_REQUIRED); + + unmap_and_kill(&to_kill, pfn, page->mapping, page->index, flags); + dax_unlock_page(page, cookie); + return 0; +} + static int memory_failure_hugetlb(unsigned long pfn, int flags) { struct page *p = pfn_to_page(pfn); @@ -1323,13 +1377,8 @@ static int memory_failure_dev_pagemap(unsigned long pfn, int flags, struct dev_pagemap *pgmap) { struct page *page = pfn_to_page(pfn); - const bool unmap_success = true; - unsigned long size = 0; - struct to_kill *tk; LIST_HEAD(tokill); int rc = -EBUSY; - loff_t start; - dax_entry_t cookie; if (flags & MF_COUNT_INCREASED) /* @@ -1343,20 +1392,9 @@ static int memory_failure_dev_pagemap(unsigned long pfn, int flags, goto out; } - /* - * Prevent the inode from being freed while we are interrogating - * the address_space, typically this would be handled by - * lock_page(), but dax pages do not use the page lock. This - * also prevents changes to the mapping of this pfn until - * poison signaling is complete. - */ - cookie = dax_lock_page(page); - if (!cookie) - goto out; - if (hwpoison_filter(page)) { rc = 0; - goto unlock; + goto out; } if (pgmap->type == MEMORY_DEVICE_PRIVATE) { @@ -1364,7 +1402,7 @@ static int memory_failure_dev_pagemap(unsigned long pfn, int flags, * TODO: Handle HMM pages which may need coordination * with device-side memory. */ - goto unlock; + goto out; } /* @@ -1373,32 +1411,7 @@ static int memory_failure_dev_pagemap(unsigned long pfn, int flags, */ SetPageHWPoison(page); - /* - * Unlike System-RAM there is no possibility to swap in a - * different physical page at a given virtual address, so all - * userspace consumption of ZONE_DEVICE memory necessitates - * SIGBUS (i.e. MF_MUST_KILL) - */ - flags |= MF_ACTION_REQUIRED | MF_MUST_KILL; - collect_procs(page, &tokill, flags & MF_ACTION_REQUIRED); - - list_for_each_entry(tk, &tokill, nd) - if (tk->size_shift) - size = max(size, 1UL << tk->size_shift); - if (size) { - /* - * Unmap the largest mapping to avoid breaking up - * device-dax mappings which are constant size. The - * actual size of the mapping being torn down is - * communicated in siginfo, see kill_proc() - */ - start = (page->index << PAGE_SHIFT) & ~(size - 1); - unmap_mapping_range(page->mapping, start, size, 0); - } - kill_procs(&tokill, flags & MF_MUST_KILL, !unmap_success, pfn, flags); - rc = 0; -unlock: - dax_unlock_page(page, cookie); + mf_generic_kill_procs(pfn, flags); out: /* drop pgmap ref acquired in caller */ put_dev_pagemap(pgmap); -- 2.32.0 -- dm-devel mailing list dm-devel@redhat.com https://listman.redhat.com/mailman/listinfo/dm-devel
next prev parent reply other threads:[~2021-06-28 0:03 UTC|newest] Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-06-28 0:02 [PATCH v5 0/9] fsdax: introduce fs query to support reflink Shiyang Ruan 2021-06-28 0:02 ` [dm-devel] " Shiyang Ruan 2021-06-28 0:02 ` [PATCH v5 1/9] pagemap: Introduce ->memory_failure() Shiyang Ruan 2021-06-28 0:02 ` [dm-devel] " Shiyang Ruan 2021-06-28 0:02 ` [PATCH v5 2/9] dax: Introduce holder for dax_device Shiyang Ruan 2021-06-28 0:02 ` [dm-devel] " Shiyang Ruan 2021-07-19 15:17 ` Christoph Hellwig 2021-07-19 15:17 ` [dm-devel] " Christoph Hellwig 2021-07-20 10:37 ` ruansy.fnst 2021-07-20 10:37 ` [dm-devel] " ruansy.fnst 2021-06-28 0:02 ` Shiyang Ruan [this message] 2021-06-28 0:02 ` [dm-devel] [PATCH v5 3/9] mm: factor helpers for memory_failure_dev_pagemap Shiyang Ruan 2021-06-28 0:02 ` [PATCH v5 4/9] pmem,mm: Implement ->memory_failure in pmem driver Shiyang Ruan 2021-06-28 0:02 ` [dm-devel] [PATCH v5 4/9] pmem, mm: " Shiyang Ruan 2021-06-28 0:02 ` [PATCH v5 5/9] mm: Introduce mf_dax_kill_procs() for fsdax case Shiyang Ruan 2021-06-28 0:02 ` [dm-devel] " Shiyang Ruan 2021-06-28 3:23 ` kernel test robot 2021-06-28 3:23 ` kernel test robot 2021-06-28 3:23 ` [dm-devel] " kernel test robot 2021-06-28 11:49 ` Matthew Wilcox 2021-06-28 11:49 ` [dm-devel] " Matthew Wilcox 2021-06-29 7:49 ` ruansy.fnst 2021-06-29 7:49 ` [dm-devel] " ruansy.fnst 2021-06-29 11:46 ` Matthew Wilcox 2021-06-29 11:46 ` [dm-devel] " Matthew Wilcox 2021-07-16 6:32 ` ruansy.fnst 2021-07-16 6:32 ` [dm-devel] " ruansy.fnst 2021-06-28 0:02 ` [PATCH v5 6/9] xfs: Implement ->corrupted_range() for XFS Shiyang Ruan 2021-06-28 0:02 ` [dm-devel] " Shiyang Ruan 2021-06-28 2:02 ` kernel test robot 2021-06-28 2:02 ` kernel test robot 2021-06-28 2:02 ` [dm-devel] " kernel test robot 2021-06-28 3:05 ` kernel test robot 2021-06-28 3:05 ` kernel test robot 2021-06-28 3:05 ` [dm-devel] " kernel test robot 2021-06-28 0:02 ` [PATCH v5 7/9] dm: Introduce ->rmap() to find bdev offset Shiyang Ruan 2021-06-28 0:02 ` [dm-devel] " Shiyang Ruan 2021-06-28 0:02 ` [PATCH v5 8/9] md: Implement dax_holder_operations Shiyang Ruan 2021-06-28 0:02 ` [dm-devel] " Shiyang Ruan 2021-06-28 0:02 ` [PATCH v5 9/9] fs/dax: Remove useless functions Shiyang Ruan 2021-06-28 0:02 ` [dm-devel] " Shiyang Ruan 2021-07-19 15:18 ` Christoph Hellwig 2021-07-19 15:18 ` [dm-devel] " Christoph Hellwig
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=20210628000218.387833-4-ruansy.fnst@fujitsu.com \ --to=ruansy.fnst@fujitsu.com \ --cc=agk@redhat.com \ --cc=dan.j.williams@intel.com \ --cc=darrick.wong@oracle.com \ --cc=david@fromorbit.com \ --cc=dm-devel@redhat.com \ --cc=hch@lst.de \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=linux-xfs@vger.kernel.org \ --cc=nvdimm@lists.linux.dev \ --cc=rgoldwyn@suse.de \ --cc=snitzer@redhat.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.