Re: [PATCH 3/5] mm/mremap: use pmd_addr_end to calculate next in move_page_tables()
From: Wei Yang <hidden>
Date: 2020-01-29 00:28:55
Also in:
linux-mm, linux-tegra, lkml
On Wed, Jan 29, 2020 at 02:35:25AM +0300, Dmitry Osipenko wrote:
29.01.2020 02:29, Wei Yang пишет:quoted
On Tue, Jan 28, 2020 at 06:59:48PM +0300, Dmitry Osipenko wrote:quoted
28.01.2020 03:43, Wei Yang пишет:quoted
On Sun, Jan 26, 2020 at 05:47:57PM +0300, Dmitry Osipenko wrote:quoted
18.01.2020 02:22, Wei Yang пишет:quoted
Use the general helper instead of do it by hand. Signed-off-by: Wei Yang <redacted> --- mm/mremap.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)diff --git a/mm/mremap.c b/mm/mremap.c index c2af8ba4ba43..a258914f3ee1 100644 --- a/mm/mremap.c +++ b/mm/mremap.c@@ -253,11 +253,8 @@ unsigned long move_page_tables(struct vm_area_struct *vma, for (; old_addr < old_end; old_addr += extent, new_addr += extent) { cond_resched(); - next = (old_addr + PMD_SIZE) & PMD_MASK; - /* even if next overflowed, extent below will be ok */ + next = pmd_addr_end(old_addr, old_end); extent = next - old_addr; - if (extent > old_end - old_addr) - extent = old_end - old_addr; old_pmd = get_old_pmd(vma->vm_mm, old_addr); if (!old_pmd) continue;@@ -301,7 +298,7 @@ unsigned long move_page_tables(struct vm_area_struct *vma, if (pte_alloc(new_vma->vm_mm, new_pmd)) break; - next = (new_addr + PMD_SIZE) & PMD_MASK; + next = pmd_addr_end(new_addr, new_addr + len); if (extent > next - new_addr) extent = next - new_addr; move_ptes(vma, old_pmd, old_addr, old_addr + extent, new_vma,Hello Wei, Starting with next-20200122, I'm seeing the following in KMSG on NVIDIA Tegra (ARM32): BUG: Bad rss-counter state mm:(ptrval) type:MM_ANONPAGES val:190Thanks. Would you mind letting me know which case you are testing?Nothing special, systemd starts to fall apart during boot.quoted
Or the special thing is 32-bit platform?I have a limited knowledge about mm/, so can't provide detailed explanation. Please take a look at this: [1] https://elixir.bootlin.com/linux/v5.5/source/arch/arm/include/asm/pgtable-2level.h#L210 [2] https://elixir.bootlin.com/linux/v5.5/source/include/asm-generic/pgtable.h#L549 [3] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c0ba10b512eb2e2a3888b6e6cc0e089f5e7a191bThanks, I see the difference here. If this is the case, we can't use pmd_addr_end() to simplify the calculation. This changes the behavior. I would prepare another patch set to fix this. Would you mind helping me verify on your platform?Sure, please feel free to CC me on that patch.
Thanks, you are in the cc list of v2. Hope this one works fine on ARM. -- Wei Yang Help you, Help me _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel