Patch "mm: delete unnecessary and unsafe init_tlb_ubc()" has been added to the 4.7-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
mm: delete unnecessary and unsafe init_tlb_ubc()
to the 4.7-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mm-delete-unnecessary-and-unsafe-init_tlb_ubc.patch
and it can be found in the queue-4.7 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
b385d21f27d86426472f6ae92a231095f7de2a8dMon Sep 17 00:00:00 2001
From: Hugh Dickins <[email protected]>
Date: Fri, 23 Sep 2016 20:27:04 -0700
Subject: mm: delete unnecessary and unsafe init_tlb_ubc()
From: Hugh Dickins <[email protected]>
commit b385d21f27d86426472f6ae92a231095f7de2a8d upstream.
init_tlb_ubc() looked unnecessary to me: tlb_ubc is statically initialized with zeroes in the init_task, and copied from parent to child while it is quiescent in arch_dup_task_struct(); so I went to delete it.
But inserted temporary debug WARN_ONs in place of init_tlb_ubc() to check that it was always empty at that point, and found them firing:
because memcg reclaim can recurse into global reclaim (when allocating biosets for swapout in my case), and arrive back at the init_tlb_ubc() in shrink_node_memcg().
Resetting tlb_ubc.flush_required at that point is wrong: if the upper level needs a deferred TLB flush, but the lower level turns out not to, we miss a TLB flush. But fortunately, that's the only part of the protocol that does not nest: with the initialization removed, cpumask collects bits from upper and lower levels, and flushes TLB when needed.
--- mm/vmscan.c | 19 ------------------- 1 file changed, 19 deletions(-)
mm/vmscan.c +0 -19
@@ -2150,23 +2150,6 @@ out: } } -#ifdef CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH -static void init_tlb_ubc (void ) -{ -/* -* This deliberately does not clear the cpumask as it's expensive -* and unnecessary. If there happens to be data in there then the -* first SWAP_CLUSTER_MAX pages will send an unnecessary IPI and -* then will be cleared. -*/ - current->tlb_ubc.flush_required = false; -} -#else -static inline void init_tlb_ubc (void ) -{ -} -#endif /* CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH */ -/* * This is a basic per-zone page freer. Used by both kswapd and direct reclaim. */
@@ -2202,8 +2185,6 @@ static void shrink_zone_memcg(struct zon scan_adjusted = (global_reclaim (sc) && !current_is_kswapd () && sc->priority ==DEF_PRIORITY ); -init_tlb_ubc (); -blk_start_plug (&plug);while (nr[LRU_INACTIVE_ANON ] || nr[LRU_ACTIVE_FILE ] || nr[LRU_INACTIVE_FILE ]) {
Patches currently in stable-queue which might be from [email protected] are
queue-4.7/mm-fix-the-page_swap_info-bug_on-check.patch queue-4.7/ipc-shm-fix-crash-if-config_shmem-is-not-set.patch queue-4.7/mm-delete-unnecessary-and-unsafe-init_tlb_ubc.patch