Add an optimization where we check hte PS_ASTPENDING and PS_NEEDRESCHED

flags with interrupts disabled to see if we should call ast() during
doreti.  This was mostly submitted by Bruce, but his original patch did
the looping in ast() in assembly rather than in the ast() function itself.
Once we've actually called into the ast() function, it's cheaper to just
loop inside the function rather than returning from the function,
performing the check, and then calling the function again.  However, we
can optimize the first check to avoid calling the function at all.
Other architectures may choose to implement this optimization if they
wish but it is not required for correct operation.

Submitted by:	bde
This commit is contained in:
John Baldwin 2001-08-10 23:00:07 +00:00
parent 688ebe120c
commit 0f345c4054
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=81494

View File

@ -66,6 +66,16 @@ doreti_next:
je doreti_exit /* no, defer */
doreti_ast:
/*
* Check for ASTs atomically with returning. Disabling CPU
* interrupts provides sufficient locking evein the SMP case,
* since we will be informed of any new ASTs by an IPI.
*/
cli
movl PCPU(CURPROC),%eax
testl $PS_ASTPENDING | PS_NEEDRESCHED,P_SFLAG(%eax)
je doreti_exit
sti
pushl %esp /* pass a pointer to the trapframe */
call ast
add $4,%esp