]> Pileus Git - ~andy/linux/blobdiff - mm/mlock.c
ip6tnl/sit: drop packet if ECN present with not-ECT
[~andy/linux] / mm / mlock.c
index ef726e8aa8e9ca56c0713abfa4b621f44a210d4c..f0b9ce572fc78ddbd0118db8aaa60d9b56086bf9 100644 (file)
@@ -51,15 +51,13 @@ EXPORT_SYMBOL(can_do_mlock);
 /*
  *  LRU accounting for clear_page_mlock()
  */
-void __clear_page_mlock(struct page *page)
+void clear_page_mlock(struct page *page)
 {
-       VM_BUG_ON(!PageLocked(page));
-
-       if (!page->mapping) {   /* truncated ? */
+       if (!TestClearPageMlocked(page))
                return;
-       }
 
-       dec_zone_page_state(page, NR_MLOCK);
+       mod_zone_page_state(page_zone(page), NR_MLOCK,
+                           -hpage_nr_pages(page));
        count_vm_event(UNEVICTABLE_PGCLEARED);
        if (!isolate_lru_page(page)) {
                putback_lru_page(page);
@@ -81,7 +79,8 @@ void mlock_vma_page(struct page *page)
        BUG_ON(!PageLocked(page));
 
        if (!TestSetPageMlocked(page)) {
-               inc_zone_page_state(page, NR_MLOCK);
+               mod_zone_page_state(page_zone(page), NR_MLOCK,
+                                   hpage_nr_pages(page));
                count_vm_event(UNEVICTABLE_PGMLOCKED);
                if (!isolate_lru_page(page))
                        putback_lru_page(page);
@@ -108,7 +107,8 @@ void munlock_vma_page(struct page *page)
        BUG_ON(!PageLocked(page));
 
        if (TestClearPageMlocked(page)) {
-               dec_zone_page_state(page, NR_MLOCK);
+               mod_zone_page_state(page_zone(page), NR_MLOCK,
+                                   -hpage_nr_pages(page));
                if (!isolate_lru_page(page)) {
                        int ret = SWAP_AGAIN;
 
@@ -227,7 +227,7 @@ long mlock_vma_pages_range(struct vm_area_struct *vma,
        if (vma->vm_flags & (VM_IO | VM_PFNMAP))
                goto no_mlock;
 
-       if (!((vma->vm_flags & (VM_DONTEXPAND | VM_RESERVED)) ||
+       if (!((vma->vm_flags & VM_DONTEXPAND) ||
                        is_vm_hugetlb_page(vma) ||
                        vma == get_gate_vma(current->mm))) {
 
@@ -290,14 +290,7 @@ void munlock_vma_pages_range(struct vm_area_struct *vma,
                page = follow_page(vma, addr, FOLL_GET | FOLL_DUMP);
                if (page && !IS_ERR(page)) {
                        lock_page(page);
-                       /*
-                        * Like in __mlock_vma_pages_range(),
-                        * because we lock page here and migration is
-                        * blocked by the elevated reference, we need
-                        * only check for file-cache page truncation.
-                        */
-                       if (page->mapping)
-                               munlock_vma_page(page);
+                       munlock_vma_page(page);
                        unlock_page(page);
                        put_page(page);
                }