From: Nicholas Piggin <npiggin@gmail.com>
To: linux-alpha@vger.kernel.org
Cc: Nicholas Piggin <npiggin@gmail.com>,
Richard Henderson <richard.henderson@linaro.org>,
Ivan Kokshaysky <ink@jurassic.park.msu.ru>,
Matt Turner <mattst88@gmail.com>,
Linus Torvalds <torvalds@linux-foundation.org>
Subject: [RFC PATCH 3/6] alpha: remove TLB flushing mm_users special case
Date: Thu, 25 May 2023 03:18:19 +1000 [thread overview]
Message-ID: <20230524171822.177133-4-npiggin@gmail.com> (raw)
In-Reply-To: <20230524171822.177133-1-npiggin@gmail.com>
With mm_cpumask, there is less reason to keep the mm_users special case
in the TLB flushing code, because IPIs will be filtered out by the mask.
These special cases are another complicated set of races e.g., vs
kthread_use_mm that make this code tricky to reason about.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arch/alpha/kernel/smp.c | 68 +++++++++--------------------------------
1 file changed, 15 insertions(+), 53 deletions(-)
diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c
index b702372fbaba..e436c056267d 100644
--- a/arch/alpha/kernel/smp.c
+++ b/arch/alpha/kernel/smp.c
@@ -639,23 +639,6 @@ ipi_flush_tlb_mm(void *x)
void
flush_tlb_mm(struct mm_struct *mm)
{
- preempt_disable();
-
- if (mm == current->active_mm) {
- flush_tlb_current(mm);
- if (atomic_read(&mm->mm_users) <= 1) {
- int cpu, this_cpu = smp_processor_id();
- for (cpu = 0; cpu < NR_CPUS; cpu++) {
- if (!cpu_online(cpu) || cpu == this_cpu)
- continue;
- if (mm->context[cpu])
- mm->context[cpu] = 0;
- }
- preempt_enable();
- return;
- }
- }
-
/*
* TLB flush IPIs will be sent to all CPUs with mm_cpumask set. The
* problem of ordering the load of mm_cpumask vs a CPU switching to
@@ -666,8 +649,12 @@ flush_tlb_mm(struct mm_struct *mm)
* The other side is switch_mm.
*/
smp_mb();
+ preempt_disable();
+ if (mm == current->active_mm)
+ flush_tlb_current(mm);
+ else
+ flush_tlb_other(mm);
smp_call_function_many(mm_cpumask(mm), ipi_flush_tlb_mm, mm, 1);
-
preempt_enable();
}
EXPORT_SYMBOL(flush_tlb_mm);
@@ -696,30 +683,17 @@ flush_tlb_page(struct vm_area_struct *vma, unsigned long addr)
struct flush_tlb_page_struct data;
struct mm_struct *mm = vma->vm_mm;
- preempt_disable();
-
- if (mm == current->active_mm) {
- flush_tlb_current_page(mm, vma, addr);
- if (atomic_read(&mm->mm_users) <= 1) {
- int cpu, this_cpu = smp_processor_id();
- for (cpu = 0; cpu < NR_CPUS; cpu++) {
- if (!cpu_online(cpu) || cpu == this_cpu)
- continue;
- if (mm->context[cpu])
- mm->context[cpu] = 0;
- }
- preempt_enable();
- return;
- }
- }
-
data.vma = vma;
data.mm = mm;
data.addr = addr;
smp_mb(); /* see flush_tlb_mm */
+ preempt_disable();
+ if (mm == current->active_mm)
+ flush_tlb_current_page(mm, vma, addr);
+ else
+ flush_tlb_other(mm);
smp_call_function_many(mm_cpumask(mm), ipi_flush_tlb_page, &data, 1);
-
preempt_enable();
}
EXPORT_SYMBOL(flush_tlb_page);
@@ -751,24 +725,12 @@ flush_icache_user_page(struct vm_area_struct *vma, struct page *page,
if ((vma->vm_flags & VM_EXEC) == 0)
return;
+ smp_mb(); /* see flush_tlb_mm */
preempt_disable();
-
- if (mm == current->active_mm) {
+ if (mm == current->active_mm)
__load_new_mm_context(mm);
- if (atomic_read(&mm->mm_users) <= 1) {
- int cpu, this_cpu = smp_processor_id();
- for (cpu = 0; cpu < NR_CPUS; cpu++) {
- if (!cpu_online(cpu) || cpu == this_cpu)
- continue;
- if (mm->context[cpu])
- mm->context[cpu] = 0;
- }
- preempt_enable();
- return;
- }
- }
-
- smp_call_function(ipi_flush_icache_page, mm, 1);
-
+ else
+ flush_tlb_other(mm);
+ smp_call_function_many(mm_cpumask(mm), ipi_flush_icache_page, mm, 1);
preempt_enable();
}
--
2.40.1
next prev parent reply other threads:[~2023-05-24 17:18 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-24 17:18 [RFC PATCH 0/6] Implement MMU_LAZY_TLB_SHOOTDOWN for alpha Nicholas Piggin
2023-05-24 17:18 ` [RFC PATCH 1/6] alpha: remove extern inline from mmu_context Nicholas Piggin
2023-05-24 17:18 ` [RFC PATCH 2/6] alpha: implement simple mm_cpumask TLB flush filter Nicholas Piggin
2023-05-24 17:18 ` Nicholas Piggin [this message]
2023-05-24 17:18 ` [RFC PATCH 4/6] alpha: clean mm_cpumask when flushing TLBs Nicholas Piggin
2023-06-02 22:33 ` Matt Turner
2023-09-06 1:39 ` Matt Turner
2023-05-24 17:18 ` [RFC PATCH 5/6] alpha: enable MMU_LAZY_TLB_SHOOTDOWN Nicholas Piggin
2023-05-24 17:18 ` [RFC PATCH 6/6] alpha: shoot the lazy tlb mm when flushing TLBs Nicholas Piggin
2023-05-24 17:27 ` [RFC PATCH 0/6] Implement MMU_LAZY_TLB_SHOOTDOWN for alpha Linus Torvalds
2023-05-24 17:52 ` Matt Turner
2023-05-29 1:45 ` Nicholas Piggin
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=20230524171822.177133-4-npiggin@gmail.com \
--to=npiggin@gmail.com \
--cc=ink@jurassic.park.msu.ru \
--cc=linux-alpha@vger.kernel.org \
--cc=mattst88@gmail.com \
--cc=richard.henderson@linaro.org \
--cc=torvalds@linux-foundation.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).