From: Rik van Riel <riel@surriel.com>
To: linux-kernel@vger.kernel.org
Cc: 86@vger.kernel.org, luto@kernel.org, mingo@kernel.org,
tglx@linutronix.de, dave.hansen@linux.intel.com, efault@gmx.de,
songliubraving@fb.com, kernel-team@fb.com,
Rik van Riel <riel@surriel.com>
Subject: [PATCH 7/7] x86,idle: do not leave mm in idle state
Date: Wed, 20 Jun 2018 15:56:52 -0400 [thread overview]
Message-ID: <20180620195652.27251-8-riel@surriel.com> (raw)
In-Reply-To: <20180620195652.27251-1-riel@surriel.com>
Do not call leave_mm when going into a cstate. Now that mprotect and
madvise no longer send IPIs for TLB shootdowns to idle CPUs, there is
no real reason to disable lazy TLB mode in idle states.
This seems to help performance on Broadwell systems. Haswell performance
numbers are inconclusive.
Signed-off-by: Rik van Riel <riel@surriel.com>
Tested-by: Song Liu <songliubraving@fb.com>
---
arch/x86/include/asm/mmu.h | 2 --
arch/x86/mm/tlb.c | 26 +-------------------------
drivers/idle/intel_idle.c | 7 -------
3 files changed, 1 insertion(+), 34 deletions(-)
diff --git a/arch/x86/include/asm/mmu.h b/arch/x86/include/asm/mmu.h
index 5ff3e8af2c20..096ee9340685 100644
--- a/arch/x86/include/asm/mmu.h
+++ b/arch/x86/include/asm/mmu.h
@@ -61,6 +61,4 @@ typedef struct {
.ctx_id = 1, \
}
-void leave_mm(int cpu);
-
#endif /* _ASM_X86_MMU_H */
diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c
index 26b3aeef6266..b861084e59d1 100644
--- a/arch/x86/mm/tlb.c
+++ b/arch/x86/mm/tlb.c
@@ -121,28 +121,6 @@ static void load_new_mm_cr3(pgd_t *pgdir, u16 new_asid, bool need_flush)
write_cr3(new_mm_cr3);
}
-void leave_mm(int cpu)
-{
- struct mm_struct *loaded_mm = this_cpu_read(cpu_tlbstate.loaded_mm);
-
- /*
- * It's plausible that we're in lazy TLB mode while our mm is init_mm.
- * If so, our callers still expect us to flush the TLB, but there
- * aren't any user TLB entries in init_mm to worry about.
- *
- * This needs to happen before any other sanity checks due to
- * intel_idle's shenanigans.
- */
- if (loaded_mm == &init_mm)
- return;
-
- /* Warn if we're not lazy. */
- WARN_ON((this_cpu_read(cpu_tlbstate.state) == TLBSTATE_OK));
-
- switch_mm(NULL, &init_mm, NULL);
-}
-EXPORT_SYMBOL_GPL(leave_mm);
-
void switch_mm(struct mm_struct *prev, struct mm_struct *next,
struct task_struct *tsk)
{
@@ -194,8 +172,6 @@ void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next,
* from lazy TLB mode to normal mode if active_mm isn't changing.
* When this happens, we don't assume that CR3 (and hence
* cpu_tlbstate.loaded_mm) matches next.
- *
- * NB: leave_mm() calls us with prev == NULL and tsk == NULL.
*/
/* We don't want flush_tlb_func_* to run concurrently with us. */
@@ -205,7 +181,7 @@ void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next,
/*
* Verify that CR3 is what we think it is. This will catch
* hypothetical buggy code that directly switches to swapper_pg_dir
- * without going through leave_mm() / switch_mm_irqs_off() or that
+ * without going through switch_mm_irqs_off() or that
* does something like write_cr3(read_cr3_pa()).
*
* Only do this check if CONFIG_DEBUG_VM=y because __read_cr3()
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c
index b2ccce5fb071..d3727aa34836 100644
--- a/drivers/idle/intel_idle.c
+++ b/drivers/idle/intel_idle.c
@@ -916,13 +916,6 @@ static __cpuidle int intel_idle(struct cpuidle_device *dev,
bool uninitialized_var(tick);
int cpu = smp_processor_id();
- /*
- * leave_mm() to avoid costly and often unnecessary wakeups
- * for flushing the user TLB's associated with the active mm.
- */
- if (state->flags & CPUIDLE_FLAG_TLB_FLUSHED)
- leave_mm(cpu);
-
if (!static_cpu_has(X86_FEATURE_ARAT)) {
cstate = (((eax) >> MWAIT_SUBSTATE_SIZE) &
MWAIT_CSTATE_MASK) + 1;
--
2.14.4
next prev parent reply other threads:[~2018-06-20 19:57 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-20 19:56 [PATCH 0/7] x86,tlb,mm: make lazy TLB mode even lazier Rik van Riel
2018-06-20 19:56 ` [PATCH 1/7] mm: allocate mm_cpumask dynamically based on nr_cpu_ids Rik van Riel
2018-06-20 21:32 ` kbuild test robot
2018-06-21 20:18 ` Rik van Riel
2018-06-21 0:24 ` kbuild test robot
2018-06-22 15:10 ` Dave Hansen
2018-06-22 17:45 ` Rik van Riel
2018-06-20 19:56 ` [PATCH 2/7] x86,tlb: leave lazy TLB mode at page table free time Rik van Riel
2018-06-21 0:23 ` Rik van Riel
2018-06-22 14:58 ` Andy Lutomirski
2018-06-22 15:17 ` Rik van Riel
2018-06-20 19:56 ` [PATCH 3/7] x86,tlb: change tlbstate.is_lazy to tlbstate.state Rik van Riel
2018-06-22 17:01 ` Dave Hansen
2018-06-22 17:08 ` Rik van Riel
2018-06-20 19:56 ` [PATCH 4/7] x86,tlb: make lazy TLB mode lazier Rik van Riel
2018-06-22 15:04 ` Andy Lutomirski
2018-06-22 15:15 ` Rik van Riel
2018-06-22 15:34 ` Andy Lutomirski
2018-06-22 17:05 ` Dave Hansen
2018-06-22 17:16 ` Rik van Riel
2018-06-20 19:56 ` [PATCH 5/7] x86,tlb: only send page table free TLB flush to lazy TLB CPUs Rik van Riel
2018-06-22 17:23 ` Dave Hansen
2018-06-20 19:56 ` [PATCH 6/7] x86,mm: always use lazy TLB mode Rik van Riel
2018-06-20 19:56 ` Rik van Riel [this message]
2018-06-20 22:20 ` [PATCH 7/7] x86,idle: do not leave mm in idle state kbuild test robot
2018-06-21 0:25 ` Rik van Riel
2018-06-22 15:36 ` Andy Lutomirski
2018-06-22 15:53 ` Rik van Riel
2018-06-22 16:01 ` Andy Lutomirski
2018-06-22 20:18 ` Rik van Riel
2018-06-22 22:05 ` Andy Lutomirski
2018-06-23 0:55 ` Rik van Riel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180620195652.27251-8-riel@surriel.com \
--to=riel@surriel.com \
--cc=86@vger.kernel.org \
--cc=dave.hansen@linux.intel.com \
--cc=efault@gmx.de \
--cc=kernel-team@fb.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@kernel.org \
--cc=songliubraving@fb.com \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.