Commit 03ef83af528899aa339e42d8024b37e2f434fba4
Committed by
Linus Torvalds
1 parent
b62e408c05
Exists in
master
and in
39 other branches
mm: fix for infinite churning of mlocked pages
An mlocked page might lose the isolatation race. This causes the page to clear PG_mlocked while it remains in a VM_LOCKED vma. This means it can be put onto the [in]active list. We can rescue it by using try_to_unmap() in shrink_page_list(). But now, As Wu Fengguang pointed out, vmscan has a bug. If the page has PG_referenced, it can't reach try_to_unmap() in shrink_page_list() but is put into the active list. If the page is referenced repeatedly, it can remain on the [in]active list without being moving to the unevictable list. This patch fixes it. Reported-by: Wu Fengguang <fengguang.wu@intel.com> Signed-off-by: Minchan Kim <minchan.kim@gmail.com> Reviewed-by: KOSAKI Motohiro <<kosaki.motohiro@jp.fujitsu.com> Cc: Lee Schermerhorn <lee.schermerhorn@hp.com> Acked-by: Rik van Riel <riel@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 2 changed files with 8 additions and 2 deletions Side-by-side Diff
mm/rmap.c
mm/vmscan.c
... | ... | @@ -630,9 +630,14 @@ |
630 | 630 | |
631 | 631 | referenced = page_referenced(page, 1, |
632 | 632 | sc->mem_cgroup, &vm_flags); |
633 | - /* In active use or really unfreeable? Activate it. */ | |
633 | + /* | |
634 | + * In active use or really unfreeable? Activate it. | |
635 | + * If page which have PG_mlocked lost isoltation race, | |
636 | + * try_to_unmap moves it to unevictable list | |
637 | + */ | |
634 | 638 | if (sc->order <= PAGE_ALLOC_COSTLY_ORDER && |
635 | - referenced && page_mapping_inuse(page)) | |
639 | + referenced && page_mapping_inuse(page) | |
640 | + && !(vm_flags & VM_LOCKED)) | |
636 | 641 | goto activate_locked; |
637 | 642 | |
638 | 643 | /* |