Skip to contentSkip to conversation

mm: fix corner case in anon_vma endless growing prevention

PATCH In review Konstantin Khlebnikov 5 participants 6 messages Jan 11, 2015 – Jan 13, 2015

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

PATCH 1/1 mm: fix corner case in anon_vma endless growing prevention

Fix for BUG_ON(anon_vma->degree) splashes in unlink_anon_vmas() ("kernel BUG at mm/rmap.c:399!").

Anon_vma_clone() is usually called for a copy of source vma in destination argument. If source vma has anon_vma it should be already in dst->anon_vma. NULL in dst->anon_vma is used as a sign that it's called from anon_vma_fork(). In this case anon_vma_clone() finds anon_vma for reusing.

Vma_adjust() calls it differently and this breaks anon_vma reusing logic:
anon_vma_clone() links vma to old anon_vma and updates degree counters but vma_adjust() overrides vma->anon_vma right after that. As a result final unlink_anon_vmas() decrements degree for wrong anon_vma.

This patch assigns ->anon_vma before calling anon_vma_clone().

Fixes 7a3ef208e662 ("mm: prevent endless growth of anon_vma hierarchy")
Cc Daniel Forrest <[email protected]>
Cc Michal Hocko <[email protected]>
Cc Rik van Riel <[email protected]>
---
 mm/mmap.c |    6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
mm/mmap.c +4 -2
index 7b36aa7..12616c5 100644
@@ -778,10 +778,12 @@ again:			remove_next = 1 + (end > next->vm_end);
 		if (exporter && exporter->anon_vma && !importer->anon_vma) {
 			int error;
 
+			importer->anon_vma = exporter->anon_vma;
 			error = anon_vma_clone(importer, exporter);
-			if (error)
+			if (error) {
+				importer->anon_vma = NULL;
 				return error;
-			importer->anon_vma = exporter->anon_vma;
+			}
 		}
 	}
 

--
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>

Acked-by on v1 1/1
#1 lore raw

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 15 lines · Konstantin Khlebnikov

Fix for BUG_ON(anon_vma->degree) splashes in unlink_anon_vmas() ("kernel BUG at mm/rmap.c:399!").

Anon_vma_clone() is usually called for a copy of source vma in destination argument. If source vma has anon_vma it should be already in dst->anon_vma. NULL in dst->anon_vma is used as a sign that it's called from anon_vma_fork(). In this case anon_vma_clone() finds anon_vma for reusing.

Vma_adjust() calls it differently and this breaks anon_vma reusing
logic: anon_vma_clone() links vma to old anon_vma and updates degree counters but vma_adjust() overrides vma->anon_vma right after that. As a result final unlink_anon_vmas() decrements degree for wrong anon_vma.

Quoted 8 lines

This patch assigns ->anon_vma before calling anon_vma_clone().

7a3ef208e662 ("mm: prevent endless growth of anon_vma hierarchy")

Gabbay <[email protected]> Cc: Daniel Forrest <[email protected]> Cc: Michal Hocko <[email protected]> Cc:
Rik van Riel <[email protected]>

- --
All rights reversed
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQEcBAEBAgAGBQJUsoe+AAoJEM553pKExN6D4x0H/RpBJella2+JhOBPyCBtLY7Z 9w8n14TlqEq7cK/WRmjhYZfVMNGIG3MDe+nAH0hTF0teh/MvJuAkraYnPxtIZYqX R7IpNOUS3HJBLqsRjNdVNsoMnWOGBC6j/RV70pLj1VklZnq/VDsUPybm0XWk1oh6 nC1QhdLfcnuaFS4M1lzsSyURwQYxi+2vv/kFdtYscArTYmjI7I4gCP3fD7lQKCwK za0z/oZb5Z5cOHXyQfe/HUROCCNUZUQfcX1XvW+TWvuwcatOvKeVCmJAy5/aPkfH THtwAP6EyZpu5XwsYXCNfbyalqYpH5lKxd5C+vG86YKEYZyeqRLKLeYAVY3yTho= =v95A
-----END PGP SIGNATURE-----

--
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>

Acked-by on v1 1/1
#2 lore raw
In reply to Konstantin Khlebnikov
Quoted 15 lines · Konstantin Khlebnikov

Fix for BUG_ON(anon_vma->degree) splashes in unlink_anon_vmas() ("kernel BUG at mm/rmap.c:399!").

Anon_vma_clone() is usually called for a copy of source vma in destination argument. If source vma has anon_vma it should be already in dst->anon_vma. NULL in dst->anon_vma is used as a sign that it's called from anon_vma_fork(). In this case anon_vma_clone() finds anon_vma for reusing.

Vma_adjust() calls it differently and this breaks anon_vma reusing logic:
anon_vma_clone() links vma to old anon_vma and updates degree counters but vma_adjust() overrides vma->anon_vma right after that. As a result final unlink_anon_vmas() decrements degree for wrong anon_vma.

This patch assigns ->anon_vma before calling anon_vma_clone().

Quoted 7 lines
Fixes 7a3ef208e662 ("mm: prevent endless growth of anon_vma hierarchy")
Cc Daniel Forrest <[email protected]>
Cc Michal Hocko <[email protected]>
Cc Rik van Riel <[email protected]>
Quoted 25 lines
---
 mm/mmap.c |    6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
mm/mmap.c +4 -3
index 7b36aa7..12616c5 100644
@@ -778,10 +778,12 @@ again:			remove_next = 1 + (end > next->vm_end);
 		if (exporter && exporter->anon_vma && !importer->anon_vma) {
 			int error;
 
+			importer->anon_vma = exporter->anon_vma;
 			error = anon_vma_clone(importer, exporter);
-			if (error)
+			if (error) {
+				importer->anon_vma = NULL;
 				return error;
-			importer->anon_vma = exporter->anon_vma;
+			}
 		}
 	}
 
 
--
Quoted 5 lines

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>

--
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>

Reviewed-by on v1 1/1
#3 lore raw
In reply to Konstantin Khlebnikov
Quoted 15 lines · Konstantin Khlebnikov

Fix for BUG_ON(anon_vma->degree) splashes in unlink_anon_vmas() ("kernel BUG at mm/rmap.c:399!").

Anon_vma_clone() is usually called for a copy of source vma in destination argument. If source vma has anon_vma it should be already in dst->anon_vma. NULL in dst->anon_vma is used as a sign that it's called from anon_vma_fork(). In this case anon_vma_clone() finds anon_vma for reusing.

Vma_adjust() calls it differently and this breaks anon_vma reusing logic:
anon_vma_clone() links vma to old anon_vma and updates degree counters but vma_adjust() overrides vma->anon_vma right after that. As a result final unlink_anon_vmas() decrements degree for wrong anon_vma.

This patch assigns ->anon_vma before calling anon_vma_clone().

Quoted 7 lines
Fixes 7a3ef208e662 ("mm: prevent endless growth of anon_vma hierarchy")
Cc Daniel Forrest <[email protected]>
Cc Michal Hocko <[email protected]>
Cc Rik van Riel <[email protected]>
Quoted 24 lines
---
 mm/mmap.c |    6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
mm/mmap.c +4 -2
index 7b36aa7..12616c5 100644
@@ -778,10 +778,12 @@ again:			remove_next = 1 + (end > next->vm_end);
 		if (exporter && exporter->anon_vma && !importer->anon_vma) {
 			int error;
 
+			importer->anon_vma = exporter->anon_vma;
 			error = anon_vma_clone(importer, exporter);
-			if (error)
+			if (error) {
+				importer->anon_vma = NULL;
 				return error;
-			importer->anon_vma = exporter->anon_vma;
+			}
 		}
 	}
 
Signature · 8 lines
Michal Hocko
SUSE Labs

--
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
#4 lore raw
In reply to Konstantin Khlebnikov
Quoted 13 lines · On Sun, 11 Jan 2015 16:54:06 +0300 Konstantin Khlebnikov <[email protected]>…

Fix for BUG_ON(anon_vma->degree) splashes in unlink_anon_vmas() ("kernel BUG at mm/rmap.c:399!").

Anon_vma_clone() is usually called for a copy of source vma in destination argument. If source vma has anon_vma it should be already in dst->anon_vma. NULL in dst->anon_vma is used as a sign that it's called from anon_vma_fork(). In this case anon_vma_clone() finds anon_vma for reusing.

Vma_adjust() calls it differently and this breaks anon_vma reusing logic:
anon_vma_clone() links vma to old anon_vma and updates degree counters but vma_adjust() overrides vma->anon_vma right after that. As a result final unlink_anon_vmas() decrements degree for wrong anon_vma.

Quoted 4 lines

This patch assigns ->anon_vma before calling anon_vma_clone().

Fixes 7a3ef208e662 ("mm: prevent endless growth of anon_vma hierarchy")

I've asked Greg not to take 7a3ef208e662 into -stable because of this problem. So if you still think we should fix this in -stable, could you please prepare an updated patch and send it to Greg?

Quoted 5 lines
#5 lore raw
Quoted 15 lines · Andrew Morton
Quoted 13 lines · On Sun, 11 Jan 2015 16:54:06 +0300 Konstantin Khlebnikov <[email protected]>…

Fix for BUG_ON(anon_vma->degree) splashes in unlink_anon_vmas() ("kernel BUG at mm/rmap.c:399!").

Anon_vma_clone() is usually called for a copy of source vma in destination argument. If source vma has anon_vma it should be already in dst->anon_vma. NULL in dst->anon_vma is used as a sign that it's called from anon_vma_fork(). In this case anon_vma_clone() finds anon_vma for reusing.

Vma_adjust() calls it differently and this breaks anon_vma reusing logic:
anon_vma_clone() links vma to old anon_vma and updates degree counters but vma_adjust() overrides vma->anon_vma right after that. As a result final unlink_anon_vmas() decrements degree for wrong anon_vma.

Quoted 8 lines
Quoted 4 lines

This patch assigns ->anon_vma before calling anon_vma_clone().

Fixes 7a3ef208e662 ("mm: prevent endless growth of anon_vma hierarchy")

I've asked Greg not to take 7a3ef208e662 into -stable because of this problem. So if you still think we should fix this in -stable, could you please prepare an updated patch and send it to Greg?

Will do. But let's wait for some just to be sure that is the last bug here.

Quoted 6 lines
Quoted 6 lines

--
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>