aboutsummaryrefslogtreecommitdiff
path: root/mm
diff options
context:
space:
mode:
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>2014-05-12 19:32:49 -0400
committerSteven Rostedt <rostedt@goodmis.org>2014-05-12 19:32:49 -0400
commit7e287d76f378340f603e1e5e6df9f6cd4e016094 (patch)
tree30ee98eddf4cb6804df82b931931dcb0f5c5620d /mm
parenteb5ab470c0cd93513c2b40fe6262c7fe6306cfbd (diff)
parent5d897eedc505bb8af1f4865ae381eadbfd3bc8c1 (diff)
Merge tag 'v3.10.39' into v3.10-rt
This is the 3.10.39 stable release
Diffstat (limited to 'mm')
-rw-r--r--mm/hugetlb.c1
-rw-r--r--mm/mlock.c2
-rw-r--r--mm/rmap.c14
3 files changed, 15 insertions, 2 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index aa3b9a63394b..8a7f27b42131 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -1487,6 +1487,7 @@ static unsigned long set_max_huge_pages(struct hstate *h, unsigned long count,
while (min_count < persistent_huge_pages(h)) {
if (!free_pool_huge_page(h, nodes_allowed, 0))
break;
+ cond_resched_lock(&hugetlb_lock);
}
while (count < persistent_huge_pages(h)) {
if (!adjust_pool_surplus(h, nodes_allowed, 1))
diff --git a/mm/mlock.c b/mm/mlock.c
index 79b7cf7d1bca..713e462c0776 100644
--- a/mm/mlock.c
+++ b/mm/mlock.c
@@ -76,6 +76,7 @@ void clear_page_mlock(struct page *page)
*/
void mlock_vma_page(struct page *page)
{
+ /* Serialize with page migration */
BUG_ON(!PageLocked(page));
if (!TestSetPageMlocked(page)) {
@@ -106,6 +107,7 @@ unsigned int munlock_vma_page(struct page *page)
{
unsigned int page_mask = 0;
+ /* For try_to_munlock() and to serialize with page migration */
BUG_ON(!PageLocked(page));
if (TestClearPageMlocked(page)) {
diff --git a/mm/rmap.c b/mm/rmap.c
index 3f6077461aea..fbf0040a7342 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -1390,9 +1390,19 @@ static int try_to_unmap_cluster(unsigned long cursor, unsigned int *mapcount,
BUG_ON(!page || PageAnon(page));
if (locked_vma) {
- mlock_vma_page(page); /* no-op if already mlocked */
- if (page == check_page)
+ if (page == check_page) {
+ /* we know we have check_page locked */
+ mlock_vma_page(page);
ret = SWAP_MLOCK;
+ } else if (trylock_page(page)) {
+ /*
+ * If we can lock the page, perform mlock.
+ * Otherwise leave the page alone, it will be
+ * eventually encountered again later.
+ */
+ mlock_vma_page(page);
+ unlock_page(page);
+ }
continue; /* don't unmap */
}