mm: fix corner case in anon_vma endless growing prevention
Subsystems (2)
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().
--- mm/mmap.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
mm/mmap.c +4 -2
@@ -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>
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Quoted 15 lines · Konstantin Khlebnikov
Fix for
BUG_ON(anon_vma->degree)splashes inunlink_anon_vmas()("kernel BUG atmm/rmap.c:399!").
Anon_vma_clone()is usually called for a copy of source vma in destination argument. If source vma hasanon_vmait should be already indst->anon_vma. NULL indst->anon_vmais used as a sign that it's called fromanon_vma_fork(). In this caseanon_vma_clone()findsanon_vmafor reusing.
Vma_adjust()calls it differently and this breaksanon_vmareusing
logic:anon_vma_clone()links vma to oldanon_vmaand updates degree counters butvma_adjust()overridesvma->anon_vmaright after that. As a result finalunlink_anon_vmas()decrements degree for wronganon_vma.
Quoted 8 lines
This patch assigns ->anon_vma before calling
anon_vma_clone().Signed-off-by Konstantin Khlebnikov <[email protected]> Fixes:
7a3ef208e662("mm: prevent endless growth ofanon_vmahierarchy")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>
Quoted 15 lines · Konstantin Khlebnikov
Fix for
BUG_ON(anon_vma->degree)splashes inunlink_anon_vmas()("kernel BUG atmm/rmap.c:399!").
Anon_vma_clone()is usually called for a copy of source vma in destination argument. If source vma hasanon_vmait should be already indst->anon_vma. NULL indst->anon_vmais used as a sign that it's called fromanon_vma_fork(). In this caseanon_vma_clone()findsanon_vmafor reusing.
Vma_adjust()calls it differently and this breaksanon_vmareusing logic:anon_vma_clone()links vma to oldanon_vmaand updates degree counters butvma_adjust()overridesvma->anon_vmaright after that. As a result finalunlink_anon_vmas()decrements degree for wronganon_vma.This patch assigns ->anon_vma before calling
anon_vma_clone().
Quoted 7 lines
Signed-off-by Konstantin Khlebnikov <[email protected]>Fixes 7a3ef208e662 ("mm: prevent endless growth of anon_vma hierarchy")Tested-by Chris Clayton <[email protected]>Tested-by Oded Gabbay <[email protected]>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@@ -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>
Quoted 15 lines · Konstantin Khlebnikov
Fix for
BUG_ON(anon_vma->degree)splashes inunlink_anon_vmas()("kernel BUG atmm/rmap.c:399!").
Anon_vma_clone()is usually called for a copy of source vma in destination argument. If source vma hasanon_vmait should be already indst->anon_vma. NULL indst->anon_vmais used as a sign that it's called fromanon_vma_fork(). In this caseanon_vma_clone()findsanon_vmafor reusing.
Vma_adjust()calls it differently and this breaksanon_vmareusing logic:anon_vma_clone()links vma to oldanon_vmaand updates degree counters butvma_adjust()overridesvma->anon_vmaright after that. As a result finalunlink_anon_vmas()decrements degree for wronganon_vma.This patch assigns ->anon_vma before calling
anon_vma_clone().
Quoted 7 lines
Signed-off-by Konstantin Khlebnikov <[email protected]>Fixes 7a3ef208e662 ("mm: prevent endless growth of anon_vma hierarchy")Tested-by Chris Clayton <[email protected]>Tested-by Oded Gabbay <[email protected]>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@@ -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>
Andrew Morton
maintainerQuoted 13 lines · On Sun, 11 Jan 2015 16:54:06 +0300 Konstantin Khlebnikov <[email protected]>…
Fix for
BUG_ON(anon_vma->degree)splashes inunlink_anon_vmas()("kernel BUG atmm/rmap.c:399!").
Anon_vma_clone()is usually called for a copy of source vma in destination argument. If source vma hasanon_vmait should be already indst->anon_vma. NULL indst->anon_vmais used as a sign that it's called fromanon_vma_fork(). In this caseanon_vma_clone()findsanon_vmafor reusing.
Vma_adjust()calls it differently and this breaksanon_vmareusing logic:anon_vma_clone()links vma to oldanon_vmaand updates degree counters butvma_adjust()overridesvma->anon_vmaright after that. As a result finalunlink_anon_vmas()decrements degree for wronganon_vma.
Quoted 4 lines
This patch assigns ->anon_vma before calling
anon_vma_clone().Signed-off-by Konstantin Khlebnikov <[email protected]>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
Tested-by Chris Clayton <[email protected]>Tested-by Oded Gabbay <[email protected]>Cc Daniel Forrest <[email protected]>Cc Michal Hocko <[email protected]>Cc Rik van Riel <[email protected]>
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 inunlink_anon_vmas()("kernel BUG atmm/rmap.c:399!").
Anon_vma_clone()is usually called for a copy of source vma in destination argument. If source vma hasanon_vmait should be already indst->anon_vma. NULL indst->anon_vmais used as a sign that it's called fromanon_vma_fork(). In this caseanon_vma_clone()findsanon_vmafor reusing.
Vma_adjust()calls it differently and this breaksanon_vmareusing logic:anon_vma_clone()links vma to oldanon_vmaand updates degree counters butvma_adjust()overridesvma->anon_vmaright after that. As a result finalunlink_anon_vmas()decrements degree for wronganon_vma.
Quoted 8 lines
Quoted 4 lines
This patch assigns ->anon_vma before calling
anon_vma_clone().Signed-off-by Konstantin Khlebnikov <[email protected]>Fixes 7a3ef208e662 ("mm: prevent endless growth of anon_vma hierarchy")I've asked Greg not to take
7a3ef208e662into -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
Tested-by Chris Clayton <[email protected]>Tested-by Oded Gabbay <[email protected]>Cc Daniel Forrest <[email protected]>Cc Michal Hocko <[email protected]>Cc Rik van Riel <[email protected]>
--
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>