> Author: jeff > Date: Mon Dec 16 20:15:04 2019 > New Revision: 355819 > URL: > https://svnweb.freebsd.org/changeset/base/355819 > > > Log: > Repeat the spinlock_enter/exit pattern from amd64 on other architectures to > fix an assert violation introduced in r355784. Without this spinlock_exit() > may see owepreempt and switch before reducing the spinlock count. amd64 > had been optimized to do a single critical enter/exit regardless of the > number of spinlocks which avoided the problem and this optimization had > not been applied elsewhere. > > Reported by: emaste > Suggested by: rlibby > Discussed with: jhb, rlibby > Tested by: manu (arm64) > > Modified: > head/sys/arm/arm/machdep.c > head/sys/arm64/arm64/machdep.c > head/sys/i386/i386/machdep.c > head/sys/mips/mips/machdep.c > head/sys/powerpc/powerpc/machdep.c > head/sys/riscv/riscv/machdep.c
It looks like sparc64 still has the old code structure: >From /usr/src/sys/sparc64/sparc64/machdep.c . . . void spinlock_enter(void) { struct thread *td; register_t pil; td = curthread; if (td->td_md.md_spinlock_count == 0) { pil = rdpr(pil); wrpr(pil, 0, PIL_TICK); td->td_md.md_spinlock_count = 1; td->td_md.md_saved_pil = pil; } else td->td_md.md_spinlock_count++; critical_enter(); } void spinlock_exit(void) { struct thread *td; register_t pil; td = curthread; critical_exit(); pil = td->td_md.md_saved_pil; td->td_md.md_spinlock_count--; if (td->td_md.md_spinlock_count == 0) wrpr(pil, pil, 0); } (Not that I ever do anything with sparc64 machines.) === Mark Millard marklmi at yahoo.com ( dsl-only.net went away in early 2018-Mar) _______________________________________________ svn-src-head@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"