| From | "Kirill A. Shutemov" <> | Subject | [PATCHv5 24/28] thp, mm: split_huge_page(): caller need to lock page | Date | Fri, 24 Apr 2015 00:03:59 +0300 |
| |
We're going to use migration entries instead of compound_lock() to stabilize page refcounts. Setup and remove migration entries require page to be locked.
Some of split_huge_page() callers already have the page locked. Let's require everybody to lock the page before calling split_huge_page().
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Tested-by: Sasha Levin <sasha.levin@oracle.com> --- mm/memory-failure.c | 12 +++++++++--- mm/migrate.c | 8 ++++++-- 2 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 441eff52d099..d9b06727e480 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -996,7 +996,10 @@ static int hwpoison_user_mappings(struct page *p, unsigned long pfn, * enough * to be safe. */ if (!PageHuge(hpage) && PageAnon(hpage)) { - if (unlikely(split_huge_page(hpage))) { + lock_page(hpage); + ret = split_huge_page(hpage); + unlock_page(hpage); + if (unlikely(ret)) { /* * FIXME: if splitting THP is failed, it is * better to stop the following operation rather @@ -1750,10 +1753,13 @@ int soft_offline_page(struct page *page, int flags) return -EBUSY; } if (!PageHuge(page) && PageTransHuge(hpage)) { - if (PageAnon(hpage) && unlikely(split_huge_page(hpage))) { + lock_page(page); + ret = split_huge_page(hpage); + unlock_page(page); + if (unlikely(ret)) { pr_info("soft offline: %#lx: failed to split THP\n", pfn); - return -EBUSY; + return ret; } } diff --git a/mm/migrate.c b/mm/migrate.c index b51e88c9dba2..03b9c4ba56dc 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -932,9 +932,13 @@ static ICE_noinline int unmap_and_move(new_page_t get_new_page, goto out; } - if (unlikely(PageTransHuge(page))) - if (unlikely(split_huge_page(page))) + if (unlikely(PageTransHuge(page))) { + lock_page(page); + rc = split_huge_page(page); + unlock_page(page); + if (rc) goto out; + } rc = __unmap_and_move(page, newpage, force, mode); -- 2.1.4
|