mm: mlock: remove lru_add_drain_all()
authorShakeel Butt <>
Thu, 16 Nov 2017 01:38:26 +0000 (17:38 -0800)
committerLinus Torvalds <>
Thu, 16 Nov 2017 02:21:07 +0000 (18:21 -0800)
lru_add_drain_all() is not required by mlock() and it will drain
everything that has been cached at the time mlock is called.  And that
is not really related to the memory which will be faulted in (and
cached) and mlocked by the syscall itself.

If anything lru_add_drain_all() should be called _after_ pages have been
mlocked and faulted in but even that is not strictly needed because
those pages would get to the appropriate LRUs lazily during the reclaim
path.  Moreover follow_page_pte (gup) will drain the local pcp LRU

On larger machines the overhead of lru_add_drain_all() in mlock() can be
significant when mlocking data already in memory.  We have observed high
latency in mlock() due to lru_add_drain_all() when the users were
mlocking in memory tmpfs files.

[ changelog fix]
Signed-off-by: Shakeel Butt <>
Acked-by: Michal Hocko <>
Acked-by: Balbir Singh <>
Acked-by: Vlastimil Babka <>
Cc: "Kirill A. Shutemov" <>
Cc: Joonsoo Kim <>
Cc: Minchan Kim <>
Cc: Yisheng Xie <>
Cc: Ingo Molnar <>
Cc: Greg Thelen <>
Cc: Hugh Dickins <>
Cc: Anshuman Khandual <>
Signed-off-by: Andrew Morton <>
Signed-off-by: Linus Torvalds <>

index ed37cb208d19a9b95a6216806fee0573ae4cacbb..30472d438794a16e7bf6bd366651a64aba174644 100644 (file)
@@ -670,8 +670,6 @@ static __must_check int do_mlock(unsigned long start, size_t len, vm_flags_t fla
        if (!can_do_mlock())
                return -EPERM;
-       lru_add_drain_all();    /* flush pagevec */
        len = PAGE_ALIGN(len + (offset_in_page(start)));
        start &= PAGE_MASK;
@@ -798,9 +796,6 @@ SYSCALL_DEFINE1(mlockall, int, flags)
        if (!can_do_mlock())
                return -EPERM;
-       if (flags & MCL_CURRENT)
-               lru_add_drain_all();    /* flush pagevec */
        lock_limit = rlimit(RLIMIT_MEMLOCK);
        lock_limit >>= PAGE_SHIFT;