Patch "mm: fix invalidate_complete_page2() lock ordering" has been added to the 3.0-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
mm: fix invalidate_complete_page2() lock ordering
to the 3.0-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mm-fix-invalidate_complete_page2-lock-ordering.patch
and it can be found in the queue-3.0 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
ec4d9f626d5908b6052c2973f37992f1db52e967Mon Sep 17 00:00:00 2001
From: Hugh Dickins <[email protected]>
Date: Mon, 8 Oct 2012 16:33:14 -0700
Subject: mm: fix invalidate_complete_page2() lock ordering
From: Hugh Dickins <[email protected]>
commit ec4d9f626d5908b6052c2973f37992f1db52e967 upstream.
In fuzzing with trinity, lockdep protested "possible irq lock inversion dependency detected" when isolate_lru_page() reenabled interrupts while still holding the supposedly irq-safe tree_lock:
invalidate_inode_pages2
invalidate_complete_page2
spin_lock_irq(&mapping->tree_lock)
clear_page_mlock
isolate_lru_page
spin_unlock_irq(&zone->lru_lock)isolate_lru_page() is correct to enable interrupts unconditionally:invalidate_complete_page2() is incorrect to call clear_page_mlock() while holding tree_lock, which is supposed to nest inside lru_lock.
Both truncate_complete_page() and invalidate_complete_page() call clear_page_mlock() before taking tree_lock to remove page from radix_tree.
I guess invalidate_complete_page2() preferred to test PageDirty (again)
under tree_lock before committing to the munlock; but since the page has already been unmapped, its state is already somewhat inconsistent, and no worse if clear_page_mlock() moved up.
--- mm/truncate.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
mm/truncate.c +2 -1
@@ -398,11 +398,12 @@ invalidate_complete_page2(struct addressif (page_has_private (page) && !try_to_release_page (page,GFP_KERNEL ))return 0 ; +clear_page_mlock (page); +spin_lock_irq (&mapping->tree_lock);if (PageDirty (page)) goto failed; -clear_page_mlock (page);BUG_ON (page_has_private (page));__delete_from_page_cache (page);spin_unlock_irq (&mapping->tree_lock);
Patches currently in stable-queue which might be from [email protected] are
queue-3.0/mm-fix-invalidate_complete_page2-lock-ordering.patch queue-3.0/mm-thp-fix-pmd_present-for-split_huge_page-and-prot_none-with-thp.patch