Patch "mm: fix false-positive WARN_ON() in truncate/invalidate for hugetlb" has been added to the 4.8-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
mm: fix false-positive WARN_ON() in truncate/invalidate for hugetlb
to the 4.8-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-false-positive-warn_on-in-truncate-invalidate-for-hugetlb.patch
and it can be found in the queue-4.8 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
5cbc198ae08d84bd416b672ad8bd1222acd0855cMon Sep 17 00:00:00 2001
From: "Kirill A. Shutemov" <[email protected]>
Date: Wed, 30 Nov 2016 15:54:19 -0800
Subject: mm: fix false-positive WARN_ON() in truncate/invalidate for hugetlb
From: Kirill A. Shutemov <[email protected]>
commit 5cbc198ae08d84bd416b672ad8bd1222acd0855c upstream.
Hugetlb pages have ->index in size of the huge pages (PMD_SIZE or PUD_SIZE), not in PAGE_SIZE as other types of pages. This means we cannot user page_to_pgoff() to check whether we've got the right page for the radix-tree index.
Let's introduce page_to_index() which would return radix-tree index for given page.
We will be able to get rid of this once hugetlb will be switched to multi-order entries.
--- include/linux/pagemap.h | 21 +++++++++++++++------ mm/truncate.c | 8 ++++---- 2 files changed, 19 insertions(+), 10 deletions(-)
include/linux/pagemap.h +15 -6
@@ -364,16 +364,13 @@ static inline struct page *read_mapping_ }/* -* Get the offset in PAGE_SIZE. -* (TODO: hugepage should have ->index in PAGE_SIZE) +* Get index of the page with in radix-tree +* (TODO: remove once hugetlb pages will have ->index in PAGE_SIZE) */ -static inline pgoff_t page_to_pgoff (struct page *page) +static inline pgoff_t page_to_index (struct page *page) {pgoff_t pgoff; -if (unlikely (PageHeadHuge (page))) -return page->index <<compound_order (page); -if (likely (!PageTransTail (page)))return page->index;
@@ -387,6 +384,18 @@ static inline pgoff_t page_to_pgoff(stru }/* +* Get the offset in PAGE_SIZE. +* (TODO: hugepage should have ->index in PAGE_SIZE) +*/ +static inline pgoff_t page_to_pgoff (struct page *page) +{ +if (unlikely (PageHeadHuge (page))) +return page->index <<compound_order (page); + +return page_to_index (page); +} + +/* * Return byte-offset into filesystem object for page. */ static inline loff_t page_offset (struct page *page)
mm/truncate.c +4 -4
@@ -283,7 +283,7 @@ void truncate_inode_pages_range(struct aif (!trylock_page (page))continue ; -WARN_ON (page_to_pgoff (page) != index); +WARN_ON (page_to_index (page) != index);if (PageWriteback (page)) {unlock_page (page);continue ;
@@ -371,7 +371,7 @@ void truncate_inode_pages_range(struct a }lock_page (page); -WARN_ON (page_to_pgoff (page) != index); +WARN_ON (page_to_index (page) != index);wait_on_page_writeback (page);truncate_inode_page (mapping, page);unlock_page (page);
@@ -492,7 +492,7 @@ unsigned long invalidate_mapping_pages(sif (!trylock_page (page))continue ; -WARN_ON (page_to_pgoff (page) != index); +WARN_ON (page_to_index (page) != index);/* Middle of THP: skip */ if (PageTransTail (page)) {
@@ -612,7 +612,7 @@ int invalidate_inode_pages2_range(struct }lock_page (page); -WARN_ON (page_to_pgoff (page) != index); +WARN_ON (page_to_index (page) != index);if (page->mapping != mapping) {unlock_page (page);continue ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.8/mm-thp-propagation-of-conditional-compilation-in-khugepaged.c.patch queue-4.8/mm-fix-false-positive-warn_on-in-truncate-invalidate-for-hugetlb.patch queue-4.8/thp-fix-corner-case-of-munlock-of-pte-mapped-thps.patch