git: 189ee41b6cc3 - main - arm64 vfp: eliminate nested critical sections

From: Alan Cox <alc_at_FreeBSD.org>
Date: Tue, 18 Aug 2026 06:57:23 UTC
The branch main has been updated by alc:

URL: https://cgit.FreeBSD.org/src/commit/?id=189ee41b6cc3b0d92c291cc854d9781afec23ad4

commit 189ee41b6cc3b0d92c291cc854d9781afec23ad4
Author:     Alan Cox <alc@FreeBSD.org>
AuthorDate: 2026-08-15 06:15:36 +0000
Commit:     Alan Cox <alc@FreeBSD.org>
CommitDate: 2026-08-18 06:55:39 +0000

    arm64 vfp: eliminate nested critical sections
    
    At two out of three call sites to vfp_restore_state_common(), the caller
    must use critical_{enter,exit}() to prevent preemption between its call
    to vfp_restore_state_common() and other actions, notably its call to
    sve_enable().  So, it is arguably better to make
    vfp_restore_state_common()'s caller responsible for performing
    critical_{enter,exit}() and simply perform CRITICAL_ASSERT() inside
    vfp_restore_state_common().
    
    Reviewed by:    kib, markj
    MFC after:      2 weeks
    Differential Revision:  https://reviews.freebsd.org/D58859
---
 sys/arm64/arm64/vfp.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/sys/arm64/arm64/vfp.c b/sys/arm64/arm64/vfp.c
index 11faa4cc21cd..afb6d9e02107 100644
--- a/sys/arm64/arm64/vfp.c
+++ b/sys/arm64/arm64/vfp.c
@@ -679,8 +679,7 @@ vfp_restore_state_common(struct thread *td, int flags)
 
 	KASSERT(td == curthread, ("%s: Called with non-current thread",
 	    __func__));
-
-	critical_enter();
+	CRITICAL_ASSERT(td);
 
 	cpu = PCPU_GET(cpuid);
 	curpcb = td->td_pcb;
@@ -728,8 +727,6 @@ vfp_restore_state_common(struct thread *td, int flags)
 		PCPU_SET(fpcurthread, td);
 		curpcb->pcb_vfpcpu = cpu;
 	}
-
-	critical_exit();
 }
 
 void
@@ -738,7 +735,9 @@ vfp_restore_state(void)
 	struct thread *td;
 
 	td = curthread;
+	critical_enter();
 	vfp_restore_state_common(td, td->td_pcb->pcb_fpflags);
+	critical_exit();
 }
 
 bool