Skip to contentSkip to conversation

mm: dont call mmu_notifier_invalidate_page during munlock

PATCH In review Konstantin Khlebnikov 2 participants 4 messages May 28, 2014 – May 29, 2014

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 mm: dont call mmu_notifier_invalidate_page during munlock

try_to_munlock() searches other mlocked vmas, it never unmaps pages. There is no reason for invalidation because ptes are left unchanged.

---
 mm/rmap.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
mm/rmap.c +1 -1
index 9c3e773..75d9d5c 100644
@@ -1225,7 +1225,7 @@ int try_to_unmap_one(struct page *page, struct vm_area_struct *vma,
 
 out_unmap:
 	pte_unmap_unlock(pte, ptl);
-	if (ret != SWAP_FAIL)
+	if (ret != SWAP_FAIL && TTU_ACTION(flags) != TTU_MUNLOCK)
 		mmu_notifier_invalidate_page(mm, address);
 out:
 	return ret;

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>

maintainer
#1 lore raw
Quoted 8 lines · On Wed, 28 May 2014 11:59:55 +0400 Konstantin Khlebnikov <[email protected]>…

try_to_munlock() searches other mlocked vmas, it never unmaps pages. There is no reason for invalidation because ptes are left unchanged.

...

mm/rmap.c int try_to_unmap_one(struct page *page, struct vm_area_struct *vma, · line 1231

Quoted 8 lines
mm/rmap.c +1 -1
@@ -1225,7 +1225,7 @@ int try_to_unmap_one(struct page *page, struct vm_area_struct *vma,
 
 out_unmap:
 	pte_unmap_unlock(pte, ptl);
-	if (ret != SWAP_FAIL)
+	if (ret != SWAP_FAIL && TTU_ACTION(flags) != TTU_MUNLOCK)
 		mmu_notifier_invalidate_page(mm, address);
 out:
 	return ret;

The patch itself looks reasonable but there is no such thing as try_to_munlock(). I rewrote the changelog thusly:

: In its munmap mode, try_to_unmap_one() searches other mlocked vmas, it : never unmaps pages. There is no reason for invalidation because ptes are : left unchanged.

Also, the name try_to_unmap_one() is now pretty inaccurate/incomplete. Perhaps if someone is feeling enthusiastic they might think up a better name for the various try_to_unmap functions and see if we can appropriately document try_to_unmap_one().

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>

#2 lore raw
Quoted 11 lines · Andrew Morton
Quoted 9 lines · On Wed, 28 May 2014 11:59:55 +0400 Konstantin Khlebnikov <[email protected]>…

try_to_munlock() searches other mlocked vmas, it never unmaps pages. There is no reason for invalidation because ptes are left unchanged.

...

mm/rmap.c +0 -0
@@ -1225,7 +1225,7 @@ int try_to_unmap_one(struct page *page, struct vm_area_struct *vma,
 
Quoted 10 lines

mm/rmap.c int try_to_unmap_one(struct page *page, struct vm_area_struct *vma, · line 1231

Quoted 7 lines
mm/rmap.c +1 -1
 out_unmap:
      pte_unmap_unlock(pte, ptl);
-     if (ret != SWAP_FAIL)
+     if (ret != SWAP_FAIL && TTU_ACTION(flags) != TTU_MUNLOCK)
              mmu_notifier_invalidate_page(mm, address);
 out:
      return ret;

The patch itself looks reasonable but there is no such thing as try_to_munlock(). I rewrote the changelog thusly:

Wait, what? I do have function with this name in my sources. It calls rmap_walk with callback try_to_unmap_one and action TTU_MUNLOCK. This is the place where TTU_MUNLOCK is used, I've mentioned it as entry point of this logic.

Quoted 9 lines

: In its munmap mode, try_to_unmap_one() searches other mlocked vmas, it : never unmaps pages. There is no reason for invalidation because ptes are : left unchanged.

Also, the name try_to_unmap_one() is now pretty inaccurate/incomplete. Perhaps if someone is feeling enthusiastic they might think up a better name for the various try_to_unmap functions and see if we can appropriately document try_to_unmap_one().

I thought about moving mlock part out of try_to_unmap_one() into separate function,
but normal unmap needs this part too...
Anyway I want to make try_to_unmap_one() static, this is internal function now.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>

maintainer
#3 lore raw
Quoted 24 lines · On Thu, 29 May 2014 11:19:27 +0400 Konstantin Khlebnikov <[email protected]>…
Quoted 11 lines · Andrew Morton
Quoted 9 lines · On Wed, 28 May 2014 11:59:55 +0400 Konstantin Khlebnikov <[email protected]>…

try_to_munlock() searches other mlocked vmas, it never unmaps pages. There is no reason for invalidation because ptes are left unchanged.

...

mm/rmap.c +0 -0
@@ -1225,7 +1225,7 @@ int try_to_unmap_one(struct page *page, struct vm_area_struct *vma,
 
Quoted 10 lines

mm/rmap.c int try_to_unmap_one(struct page *page, struct vm_area_struct *vma, · line 1231

Quoted 7 lines
mm/rmap.c +1 -1
 out_unmap:
      pte_unmap_unlock(pte, ptl);
-     if (ret != SWAP_FAIL)
+     if (ret != SWAP_FAIL && TTU_ACTION(flags) != TTU_MUNLOCK)
              mmu_notifier_invalidate_page(mm, address);
 out:
      return ret;

The patch itself looks reasonable but there is no such thing as try_to_munlock(). I rewrote the changelog thusly:

Quoted 3 lines

Wait, what? I do have function with this name in my sources. It calls rmap_walk with callback try_to_unmap_one and action TTU_MUNLOCK. This is the place where TTU_MUNLOCK is used, I've mentioned it as entry point of this logic.

Ah OK, I obviously misgrepped.

Quoted 5 lines
Quoted 5 lines

: In its munmap mode, try_to_unmap_one() searches other mlocked vmas, it : never unmaps pages. There is no reason for invalidation because ptes are : left unchanged.

Quoted 8 lines
Quoted 4 lines

Also, the name try_to_unmap_one() is now pretty inaccurate/incomplete. Perhaps if someone is feeling enthusiastic they might think up a better name for the various try_to_unmap functions and see if we can appropriately document try_to_unmap_one().

I thought about moving mlock part out of try_to_unmap_one() into separate function,
but normal unmap needs this part too...

try_to_unmap_one() does appear to have enough in common with the munlock operation to justify using common code. But doing so makes the name wrong.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>