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:
parent
688ebe120c
commit
0f345c4054
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user