|
@@ -60,6 +60,8 @@ void __clear_page_mlock(struct page *page)
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ dec_zone_page_state(page, NR_MLOCK);
|
|
|
|
+ count_vm_event(UNEVICTABLE_PGCLEARED);
|
|
if (!isolate_lru_page(page)) {
|
|
if (!isolate_lru_page(page)) {
|
|
putback_lru_page(page);
|
|
putback_lru_page(page);
|
|
} else {
|
|
} else {
|
|
@@ -69,6 +71,9 @@ void __clear_page_mlock(struct page *page)
|
|
lru_add_drain_all();
|
|
lru_add_drain_all();
|
|
if (!isolate_lru_page(page))
|
|
if (!isolate_lru_page(page))
|
|
putback_lru_page(page);
|
|
putback_lru_page(page);
|
|
|
|
+ else if (PageUnevictable(page))
|
|
|
|
+ count_vm_event(UNEVICTABLE_PGSTRANDED);
|
|
|
|
+
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -80,8 +85,12 @@ void mlock_vma_page(struct page *page)
|
|
{
|
|
{
|
|
BUG_ON(!PageLocked(page));
|
|
BUG_ON(!PageLocked(page));
|
|
|
|
|
|
- if (!TestSetPageMlocked(page) && !isolate_lru_page(page))
|
|
|
|
- putback_lru_page(page);
|
|
|
|
|
|
+ if (!TestSetPageMlocked(page)) {
|
|
|
|
+ inc_zone_page_state(page, NR_MLOCK);
|
|
|
|
+ count_vm_event(UNEVICTABLE_PGMLOCKED);
|
|
|
|
+ if (!isolate_lru_page(page))
|
|
|
|
+ putback_lru_page(page);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -106,9 +115,31 @@ static void munlock_vma_page(struct page *page)
|
|
{
|
|
{
|
|
BUG_ON(!PageLocked(page));
|
|
BUG_ON(!PageLocked(page));
|
|
|
|
|
|
- if (TestClearPageMlocked(page) && !isolate_lru_page(page)) {
|
|
|
|
- try_to_munlock(page);
|
|
|
|
- putback_lru_page(page);
|
|
|
|
|
|
+ if (TestClearPageMlocked(page)) {
|
|
|
|
+ dec_zone_page_state(page, NR_MLOCK);
|
|
|
|
+ if (!isolate_lru_page(page)) {
|
|
|
|
+ int ret = try_to_munlock(page);
|
|
|
|
+ /*
|
|
|
|
+ * did try_to_unlock() succeed or punt?
|
|
|
|
+ */
|
|
|
|
+ if (ret == SWAP_SUCCESS || ret == SWAP_AGAIN)
|
|
|
|
+ count_vm_event(UNEVICTABLE_PGMUNLOCKED);
|
|
|
|
+
|
|
|
|
+ putback_lru_page(page);
|
|
|
|
+ } else {
|
|
|
|
+ /*
|
|
|
|
+ * We lost the race. let try_to_unmap() deal
|
|
|
|
+ * with it. At least we get the page state and
|
|
|
|
+ * mlock stats right. However, page is still on
|
|
|
|
+ * the noreclaim list. We'll fix that up when
|
|
|
|
+ * the page is eventually freed or we scan the
|
|
|
|
+ * noreclaim list.
|
|
|
|
+ */
|
|
|
|
+ if (PageUnevictable(page))
|
|
|
|
+ count_vm_event(UNEVICTABLE_PGSTRANDED);
|
|
|
|
+ else
|
|
|
|
+ count_vm_event(UNEVICTABLE_PGMUNLOCKED);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|