summaryrefslogtreecommitdiff
path: root/mm/migrate.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2019-03-04 13:26:15 -0800
committerDavid S. Miller <davem@davemloft.net>2019-03-04 13:26:15 -0800
commit18a4d8bf250a33c015955f0dec27259780ef6448 (patch)
tree3e380812ac047fef70c0da52ba74705ee62b7130 /mm/migrate.c
parent096461de96a94c856190ba892ebf62dfba5a38f1 (diff)
parent822e44b45eb991c63487c5e2ce7d636411870a8d (diff)
downloadlinux-18a4d8bf250a33c015955f0dec27259780ef6448.tar.gz
linux-18a4d8bf250a33c015955f0dec27259780ef6448.tar.bz2
linux-18a4d8bf250a33c015955f0dec27259780ef6448.zip
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'mm/migrate.c')
-rw-r--r--mm/migrate.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/mm/migrate.c b/mm/migrate.c
index d4fd680be3b0..181f5d2718a9 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -1315,6 +1315,16 @@ static int unmap_and_move_huge_page(new_page_t get_new_page,
lock_page(hpage);
}
+ /*
+ * Check for pages which are in the process of being freed. Without
+ * page_mapping() set, hugetlbfs specific move page routine will not
+ * be called and we could leak usage counts for subpools.
+ */
+ if (page_private(hpage) && !page_mapping(hpage)) {
+ rc = -EBUSY;
+ goto out_unlock;
+ }
+
if (PageAnon(hpage))
anon_vma = page_get_anon_vma(hpage);
@@ -1345,6 +1355,7 @@ put_anon:
put_new_page = NULL;
}
+out_unlock:
unlock_page(hpage);
out:
if (rc != -EAGAIN)