]> Pileus Git - ~andy/linux/blobdiff - mm/mlock.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394...
[~andy/linux] / mm / mlock.c
index 048260c4e02ea7ced2692cc05fba67c9798c9145..bd34b3a10852c3d3ac3b1808653721a6114549c2 100644 (file)
@@ -110,7 +110,15 @@ void munlock_vma_page(struct page *page)
        if (TestClearPageMlocked(page)) {
                dec_zone_page_state(page, NR_MLOCK);
                if (!isolate_lru_page(page)) {
-                       int ret = try_to_munlock(page);
+                       int ret = SWAP_AGAIN;
+
+                       /*
+                        * Optimization: if the page was mapped just once,
+                        * that's our mapping and we don't need to check all the
+                        * other vmas.
+                        */
+                       if (page_mapcount(page) > 1)
+                               ret = try_to_munlock(page);
                        /*
                         * did try_to_unlock() succeed or punt?
                         */
@@ -549,7 +557,8 @@ SYSCALL_DEFINE1(mlockall, int, flags)
        if (!can_do_mlock())
                goto out;
 
-       lru_add_drain_all();    /* flush pagevec */
+       if (flags & MCL_CURRENT)
+               lru_add_drain_all();    /* flush pagevec */
 
        down_write(&current->mm->mmap_sem);