| From: "Liam R. Howlett" <Liam.Howlett@Oracle.com> |
| Subject: vma: detect infinite loop in vma tree |
| Date: Thu, 31 Oct 2024 15:36:08 -0400 |
| |
| There have been no reported infinite loops in the tree, but checking the |
| detection of an infinite loop during validation is simple enough. Add the |
| detection to the validate_mm() function so that error reports are clear |
| and don't just report stalls. |
| |
| This does not protect against internal maple tree issues, but it does |
| detect too many vmas being returned from the tree. |
| |
| The variance of +10 is to allow for the debugging output to be more useful |
| for nearly correct counts. In the event of more than 10 over the |
| map_count, the count will be set to -1 for easier identification of a |
| potential infinite loop. |
| |
| Note that the mmap lock is held to ensure a consistent tree state during |
| the validation process. |
| |
| [akpm@linux-foundation.org: add comment] |
| Link: https://lkml.kernel.org/r/20241031193608.1965366-1-Liam.Howlett@oracle.com |
| Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com> |
| Reviewed-by: David Hildenbrand <david@redhat.com> |
| Reviewed-by: Vlastimil Babka <vbabka@suse.cz> |
| Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> |
| Cc: Jann Horn <jannh@google.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| mm/vma.c | 6 +++++- |
| 1 file changed, 5 insertions(+), 1 deletion(-) |
| |
| --- a/mm/vma.c~vma-detect-infinite-loop-in-vma-tree |
| +++ a/mm/vma.c |
| @@ -615,7 +615,11 @@ void validate_mm(struct mm_struct *mm) |
| anon_vma_unlock_read(anon_vma); |
| } |
| #endif |
| - i++; |
| + /* Check for a infinite loop */ |
| + if (++i > mm->map_count + 10) { |
| + i = -1; |
| + break; |
| + } |
| } |
| if (i != mm->map_count) { |
| pr_emerg("map_count %d vma iterator %d\n", mm->map_count, i); |
| _ |