X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=mm%2Fmlock.c;h=bd34b3a10852c3d3ac3b1808653721a6114549c2;hb=c18ae42aa5b3473c00f51b6937d0c00bdb6ce2d2;hp=048260c4e02ea7ced2692cc05fba67c9798c9145;hpb=121782a248f11c63c7c0fc78d4a68a54e99ee37d;p=~andy%2Flinux diff --git a/mm/mlock.c b/mm/mlock.c index 048260c4e02..bd34b3a1085 100644 --- a/mm/mlock.c +++ b/mm/mlock.c @@ -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(¤t->mm->mmap_sem);