diff options
author | Hugh Dickins <hughd@google.com> | 2011-05-28 13:20:21 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-28 16:55:32 -0700 |
commit | eee0f252c6537da2e883f75d22cff1427515eaf3 (patch) | |
tree | 87ca6a49dd2d299b6cb4146ff3295bb625519b05 /mm/vmalloc.c | |
parent | 5dbe0af47f8a8f968bac2991c3ec974c6e3eaabc (diff) | |
download | linux-eee0f252c6537da2e883f75d22cff1427515eaf3.tar.gz linux-eee0f252c6537da2e883f75d22cff1427515eaf3.tar.bz2 linux-eee0f252c6537da2e883f75d22cff1427515eaf3.zip |
mm: fix page_lock_anon_vma leaving mutex locked
On one machine I've been getting hangs, a page fault's anon_vma_prepare()
waiting in anon_vma_lock(), other processes waiting for that page's lock.
This is a replay of last year's f18194275c39 "mm: fix hang on
anon_vma->root->lock".
The new page_lock_anon_vma() places too much faith in its refcount: when
it has acquired the mutex_trylock(), it's possible that a racing task in
anon_vma_alloc() has just reallocated the struct anon_vma, set refcount
to 1, and is about to reset its anon_vma->root.
Fix this by saving anon_vma->root, and relying on the usual page_mapped()
check instead of a refcount check: if page is still mapped, the anon_vma
is still ours; if page is not still mapped, we're no longer interested.
Signed-off-by: Hugh Dickins <hughd@google.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/vmalloc.c')
0 files changed, 0 insertions, 0 deletions