Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 12 Jan 2021 08:54:06 GMT
From:      Mateusz Guzik <mjg@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 44121a0fbee0 - main - amd64: fix tlb shootdown when all cpus are passed in the bitmap
Message-ID:  <202101120854.10C8s6Gr075398@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by mjg:

URL: https://cgit.FreeBSD.org/src/commit/?id=44121a0fbee0272e23bfb90601d177ba9e9cda9b

commit 44121a0fbee0272e23bfb90601d177ba9e9cda9b
Author:     Mateusz Guzik <mjg@FreeBSD.org>
AuthorDate: 2021-01-12 08:47:32 +0000
Commit:     Mateusz Guzik <mjg@FreeBSD.org>
CommitDate: 2021-01-12 08:47:32 +0000

    amd64: fix tlb shootdown when all cpus are passed in the bitmap
    
    Right now the routine leaves the current CPU in the map, later tripping
    on an assert when filling in the scoreboard: panic: IPI scoreboard is
    zero, initiator 1 target 1
    
    Instead pre-check if all CPUs are present in the map and remember that
    outcome for later.
    
    Fixes:  7eaea04a5bb1dc86 ("amd64: compare TLB shootdown target to all_cpus")
    Reviewed by:    kib
    Differential Revision:  https://reviews.freebsd.org/D28111
---
 sys/amd64/amd64/mp_machdep.c | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c
index 794a11bf1276..aa62c2086fa4 100644
--- a/sys/amd64/amd64/mp_machdep.c
+++ b/sys/amd64/amd64/mp_machdep.c
@@ -660,6 +660,7 @@ smp_targeted_tlb_shootdown(cpuset_t mask, pmap_t pmap, vm_offset_t addr1,
 	cpuset_t other_cpus, mask1;
 	uint32_t generation, *p_cpudone;
 	int cpu;
+	bool is_all;
 
 	/*
 	 * It is not necessary to signal other CPUs while booting or
@@ -673,14 +674,10 @@ smp_targeted_tlb_shootdown(cpuset_t mask, pmap_t pmap, vm_offset_t addr1,
 	/*
 	 * Check for other cpus.  Return if none.
 	 */
-	if (!CPU_CMP(&mask, &all_cpus)) {
-		if (mp_ncpus <= 1)
-			goto local_cb;
-	} else {
-		CPU_CLR(PCPU_GET(cpuid), &mask);
-		if (CPU_EMPTY(&mask))
-			goto local_cb;
-	}
+	is_all = !CPU_CMP(&mask, &all_cpus);
+	CPU_CLR(PCPU_GET(cpuid), &mask);
+	if (CPU_EMPTY(&mask))
+		goto local_cb;
 
 	/*
 	 * Initiator must have interrupts enabled, which prevents
@@ -719,7 +716,7 @@ smp_targeted_tlb_shootdown(cpuset_t mask, pmap_t pmap, vm_offset_t addr1,
 	 * (zeroing slot) and reading from it below (wait for
 	 * acknowledgment).
 	 */
-	if (!CPU_CMP(&mask, &all_cpus)) {
+	if (is_all) {
 		ipi_all_but_self(IPI_INVLOP);
 		other_cpus = all_cpus;
 		CPU_CLR(PCPU_GET(cpuid), &other_cpus);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202101120854.10C8s6Gr075398>