This is experimental: we use l_cpu to mean a number of things and this involves changing it to a different value than curcpu() in a running LWP, which we have not done before. I'll see about making it more robust.
Andrew On Fri, Dec 06, 2019 at 09:36:11PM +0000, Andrew Doran wrote: > Module Name: src > Committed By: ad > Date: Fri Dec 6 21:36:11 UTC 2019 > > Modified Files: > src/sys/kern: kern_exec.c kern_exit.c kern_idle.c kern_lwp.c kern_sig.c > kern_sleepq.c kern_softint.c kern_synch.c > src/sys/sys: sched.h > > Log Message: > Make it possible to call mi_switch() and immediately switch to another CPU. > This seems to take about 3us on my Intel system. Two changes required: > > - Have the caller to mi_switch() be responsible for calling spc_lock(). > - Avoid using l->l_cpu in mi_switch(). > > While here: > > - Add a couple of calls to membar_enter() > - Have the idle LWP set itself to LSIDL, to match softint_thread(). > - Remove unused return value from mi_switch(). > > > To generate a diff of this commit: > cvs rdiff -u -r1.484 -r1.485 src/sys/kern/kern_exec.c > cvs rdiff -u -r1.277 -r1.278 src/sys/kern/kern_exit.c > cvs rdiff -u -r1.27 -r1.28 src/sys/kern/kern_idle.c > cvs rdiff -u -r1.216 -r1.217 src/sys/kern/kern_lwp.c > cvs rdiff -u -r1.380 -r1.381 src/sys/kern/kern_sig.c > cvs rdiff -u -r1.53 -r1.54 src/sys/kern/kern_sleepq.c > cvs rdiff -u -r1.54 -r1.55 src/sys/kern/kern_softint.c > cvs rdiff -u -r1.328 -r1.329 src/sys/kern/kern_synch.c > cvs rdiff -u -r1.79 -r1.80 src/sys/sys/sched.h > > Please note that diffs are not public domain; they are subject to the > copyright notices on the relevant files. >