Thread (18 messages) 18 messages, 5 authors, 2020-01-30

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:190
Thanks.

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=c0ba10b512eb2e2a3888b6e6cc0e089f5e7a191b
Thanks, 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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help