From: Jane Chu <jane.chu@oracle.com>
To: "Matthew Wilcox (Oracle)" <willy@infradead.org>,
Andrew Morton <akpm@linux-foundation.org>,
ruansy.fnst@fujitsu.com
Cc: linux-mm@kvack.org, Miaohe Lin <linmiaohe@huawei.com>,
Naoya Horiguchi <naoya.horiguchi@nec.com>,
Dan Williams <dan.j.williams@intel.com>,
Jane Chu <jane.chu@oracle.com>
Subject: Re: [PATCH 1/8] mm/memory-failure: Remove fsdax_pgoff argument from __add_to_kill
Date: Tue, 12 Mar 2024 19:07:10 -0700 [thread overview]
Message-ID: <35c987d6-e78e-41df-a157-cc764245fa30@oracle.com> (raw)
In-Reply-To: <20240229212036.2160900-2-willy@infradead.org>
On 2/29/2024 1:20 PM, Matthew Wilcox (Oracle) wrote:
> Unify the KSM and DAX codepaths by calculating the addr in
> add_to_kill_fsdax() instead of telling __add_to_kill() to calculate it.
>
> Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
> Cc: Dan Williams <dan.j.williams@intel.com>
> ---
> mm/memory-failure.c | 27 +++++++++------------------
> 1 file changed, 9 insertions(+), 18 deletions(-)
>
> diff --git a/mm/memory-failure.c b/mm/memory-failure.c
> index 9349948f1abf..9356227a50bb 100644
> --- a/mm/memory-failure.c
> +++ b/mm/memory-failure.c
> @@ -416,21 +416,13 @@ static unsigned long dev_pagemap_mapping_shift(struct vm_area_struct *vma,
> * not much we can do. We just print a message and ignore otherwise.
> */
>
> -#define FSDAX_INVALID_PGOFF ULONG_MAX
> -
> /*
> * Schedule a process for later kill.
> * Uses GFP_ATOMIC allocations to avoid potential recursions in the VM.
> - *
> - * Note: @fsdax_pgoff is used only when @p is a fsdax page and a
> - * filesystem with a memory failure handler has claimed the
> - * memory_failure event. In all other cases, page->index and
> - * page->mapping are sufficient for mapping the page back to its
> - * corresponding user virtual address.
> */
> static void __add_to_kill(struct task_struct *tsk, struct page *p,
> struct vm_area_struct *vma, struct list_head *to_kill,
> - unsigned long ksm_addr, pgoff_t fsdax_pgoff)
> + unsigned long addr)
> {
> struct to_kill *tk;
>
> @@ -440,12 +432,10 @@ static void __add_to_kill(struct task_struct *tsk, struct page *p,
> return;
> }
>
> - tk->addr = ksm_addr ? ksm_addr : page_address_in_vma(p, vma);
> - if (is_zone_device_page(p)) {
> - if (fsdax_pgoff != FSDAX_INVALID_PGOFF)
> - tk->addr = vma_pgoff_address(fsdax_pgoff, 1, vma);
> + tk->addr = addr ? addr : page_address_in_vma(p, vma);
> + if (is_zone_device_page(p))
> tk->size_shift = dev_pagemap_mapping_shift(vma, tk->addr);
Not sure about the simplification. The fsdax special calculation was added by
commit c36e2024957120566efd99395b5c8cc95b5175c1
Author: Shiyang Ruan <ruansy.fnst@fujitsu.com>
Date: Fri Jun 3 13:37:29 2022 +0800
mm: introduce mf_dax_kill_procs() for fsdax case
This new function is a variant of mf_generic_kill_procs that accepts a
file, offset pair instead of a struct to support multiple files sharing a
DAX mapping. It is intended to be called by the file systems as part of
the memory_failure handler after the file system performed a reverse
mapping from the storage address to the file and file offset.
Link: https://lkml.kernel.org/r/20220603053738.1218681-6-ruansy.fnst@fujitsu.co
m
[..]
@@ -354,9 +357,15 @@ static void add_to_kill(struct task_struct *tsk, struct page *p,
}
tk->addr = page_address_in_vma(p, vma);
- if (is_zone_device_page(p))
- tk->size_shift = dev_pagemap_mapping_shift(p, vma);
- else
+ if (is_zone_device_page(p)) {
+ /*
+ * Since page->mapping is not used for fsdax, we need
+ * calculate the address based on the vma.
+ */
+ if (p->pgmap->type == MEMORY_DEVICE_FS_DAX)
+ tk->addr = vma_pgoff_address(fsdax_pgoff, 1, vma);
+ tk->size_shift = dev_pagemap_mapping_shift(vma, tk->addr);
+ } else
tk->size_shift = page_shift(compound_head(p));
Looks like it was to deal away with this check
unsignedlongpage_address_in_vma
<https://elixir.bootlin.com/linux/v6.8/C/ident/page_address_in_vma>(structpage
<https://elixir.bootlin.com/linux/v6.8/C/ident/page>*page
<https://elixir.bootlin.com/linux/v6.8/C/ident/page>,structvm_area_struct
<https://elixir.bootlin.com/linux/v6.8/C/ident/vm_area_struct>*vma
<https://elixir.bootlin.com/linux/v6.8/C/ident/vma>)
{ [..]
}elseif(vma <https://elixir.bootlin.com/linux/v6.8/C/ident/vma>->vm_file
<https://elixir.bootlin.com/linux/v6.8/C/ident/vm_file>->f_mapping
<https://elixir.bootlin.com/linux/v6.8/C/ident/f_mapping>!=folio
<https://elixir.bootlin.com/linux/v6.8/C/ident/folio>->mapping
<https://elixir.bootlin.com/linux/v6.8/C/ident/mapping>){
return-EFAULT <https://elixir.bootlin.com/linux/v6.8/C/ident/EFAULT>;
}
But, by providing nr=1 in vma_pgoff_address(fsdax_pgoff, 1, vma), it also avoided dealing with
wrap around, which perhaps doesn't matter? perhaps noone runs fsdax on 32-bit machine?
Add Shiyang Ruan for comment.
thanks,
-jane
> - } else
> + else
> tk->size_shift = page_shift(compound_head(p));
>
> /*
> @@ -475,7 +465,7 @@ static void add_to_kill_anon_file(struct task_struct *tsk, struct page *p,
> struct vm_area_struct *vma,
> struct list_head *to_kill)
> {
> - __add_to_kill(tsk, p, vma, to_kill, 0, FSDAX_INVALID_PGOFF);
> + __add_to_kill(tsk, p, vma, to_kill, 0);
> }
>
> #ifdef CONFIG_KSM
> @@ -493,10 +483,10 @@ static bool task_in_to_kill_list(struct list_head *to_kill,
> }
> void add_to_kill_ksm(struct task_struct *tsk, struct page *p,
> struct vm_area_struct *vma, struct list_head *to_kill,
> - unsigned long ksm_addr)
> + unsigned long addr)
> {
> if (!task_in_to_kill_list(to_kill, tsk))
> - __add_to_kill(tsk, p, vma, to_kill, ksm_addr, FSDAX_INVALID_PGOFF);
> + __add_to_kill(tsk, p, vma, to_kill, addr);
> }
> #endif
> /*
> @@ -670,7 +660,8 @@ static void add_to_kill_fsdax(struct task_struct *tsk, struct page *p,
> struct vm_area_struct *vma,
> struct list_head *to_kill, pgoff_t pgoff)
> {
> - __add_to_kill(tsk, p, vma, to_kill, 0, pgoff);
> + unsigned long addr = vma_pgoff_address(pgoff, 1, vma);
> + __add_to_kill(tsk, p, vma, to_kill, addr);
> }
>
> /*
next prev parent reply other threads:[~2024-03-13 2:07 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-29 21:20 [PATCH 0/8] Some cleanups for memory-failure Matthew Wilcox (Oracle)
2024-02-29 21:20 ` [PATCH 1/8] mm/memory-failure: Remove fsdax_pgoff argument from __add_to_kill Matthew Wilcox (Oracle)
2024-03-04 12:09 ` Miaohe Lin
2024-03-13 2:07 ` Jane Chu [this message]
2024-03-13 3:23 ` Matthew Wilcox
2024-03-13 18:11 ` Jane Chu
2024-03-14 3:51 ` Matthew Wilcox
2024-03-14 17:54 ` Jane Chu
2024-03-19 0:36 ` Dan Williams
2024-02-29 21:20 ` [PATCH 2/8] mm/memory-failure: Pass addr to __add_to_kill() Matthew Wilcox (Oracle)
2024-03-04 12:10 ` Miaohe Lin
2024-02-29 21:20 ` [PATCH 3/8] mm: Return the address from page_mapped_in_vma() Matthew Wilcox (Oracle)
2024-03-04 12:31 ` Miaohe Lin
2024-03-05 20:09 ` Matthew Wilcox
2024-03-06 8:10 ` Miaohe Lin
2024-03-06 8:17 ` Miaohe Lin
2024-02-29 21:20 ` [PATCH 4/8] mm/memory-failure: Convert shake_page() to shake_folio() Matthew Wilcox (Oracle)
2024-03-06 9:31 ` Miaohe Lin
2024-04-08 15:36 ` Matthew Wilcox
2024-04-08 18:31 ` Jane Chu
2024-04-10 4:01 ` Miaohe Lin
2024-02-29 21:20 ` [PATCH 5/8] mm: Convert hugetlb_page_mapping_lock_write to folio Matthew Wilcox (Oracle)
2024-03-08 8:33 ` Miaohe Lin
2024-02-29 21:20 ` [PATCH 6/8] mm/memory-failure: Convert memory_failure() to use a folio Matthew Wilcox (Oracle)
2024-03-08 8:48 ` Miaohe Lin
2024-03-11 12:31 ` Matthew Wilcox
2024-03-12 7:07 ` Miaohe Lin
2024-03-12 14:14 ` Matthew Wilcox
2024-03-13 1:23 ` Jane Chu
2024-03-14 2:34 ` Miaohe Lin
2024-03-14 18:15 ` Jane Chu
2024-03-15 6:25 ` Miaohe Lin
2024-03-15 8:32 ` Miaohe Lin
2024-03-15 19:22 ` Jane Chu
2024-03-18 2:28 ` Miaohe Lin
2024-02-29 21:20 ` [PATCH 7/8] mm/memory-failure: Convert hwpoison_user_mappings to take " Matthew Wilcox (Oracle)
2024-03-11 11:44 ` Miaohe Lin
2024-02-29 21:20 ` [PATCH 8/8] mm/memory-failure: Add some folio conversions to unpoison_memory Matthew Wilcox (Oracle)
2024-03-11 11:29 ` Miaohe Lin
2024-03-01 6:28 ` [PATCH 0/8] Some cleanups for memory-failure Miaohe Lin
2024-03-01 12:40 ` Muhammad Usama Anjum
2024-03-04 1:55 ` Miaohe Lin
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=35c987d6-e78e-41df-a157-cc764245fa30@oracle.com \
--to=jane.chu@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=dan.j.williams@intel.com \
--cc=linmiaohe@huawei.com \
--cc=linux-mm@kvack.org \
--cc=naoya.horiguchi@nec.com \
--cc=ruansy.fnst@fujitsu.com \
--cc=willy@infradead.org \
/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 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.