| From 59749e6ce53735d8b696763742225f126e94603f Mon Sep 17 00:00:00 2001 |
| From: Johannes Weiner <hannes@cmpxchg.org> |
| Date: Mon, 12 Dec 2016 16:43:35 -0800 |
| Subject: mm: khugepaged: fix radix tree node leak in shmem collapse error path |
| |
| From: Johannes Weiner <hannes@cmpxchg.org> |
| |
| commit 59749e6ce53735d8b696763742225f126e94603f upstream. |
| |
| The radix tree counts valid entries in each tree node. Entries stored |
| in the tree cannot be removed by simpling storing NULL in the slot or |
| the internal counters will be off and the node never gets freed again. |
| |
| When collapsing a shmem page fails, restore the holes that were filled |
| with radix_tree_insert() with a proper radix tree deletion. |
| |
| Fixes: f3f0e1d2150b ("khugepaged: add support of collapse for tmpfs/shmem pages") |
| Link: http://lkml.kernel.org/r/20161117191138.22769-3-hannes@cmpxchg.org |
| Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> |
| Reported-by: Jan Kara <jack@suse.cz> |
| Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> |
| Reviewed-by: Jan Kara <jack@suse.cz> |
| Cc: Hugh Dickins <hughd@google.com> |
| Cc: Matthew Wilcox <mawilcox@linuxonhyperv.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| mm/khugepaged.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/mm/khugepaged.c |
| +++ b/mm/khugepaged.c |
| @@ -1525,9 +1525,11 @@ tree_unlocked: |
| if (!page || iter.index < page->index) { |
| if (!nr_none) |
| break; |
| - /* Put holes back where they were */ |
| - radix_tree_replace_slot(slot, NULL); |
| nr_none--; |
| + /* Put holes back where they were */ |
| + radix_tree_delete(&mapping->page_tree, |
| + iter.index); |
| + slot = radix_tree_iter_next(&iter); |
| continue; |
| } |
| |