In arch/i386/kernel/entry.S
...
ENTRY(resume_kernel)
cmpl $0,TI_preempt_count(%ebp) # non-zero preempt_count ?
jnz restore_all
need_resched:
movl TI_flags(%ebp), %ecx # need_resched set ?
testb $_TIF_NEED_RESCHED, %cl
jz restore_all
testl $IF_MASK,EFLAGS(%esp) # interrupts off (exception path) ?
jz restore_all
movl $PREEMPT_ACTIVE,TI_preempt_count(%ebp)
sti
call schedule
movl $0,TI_preempt_count(%ebp)
cli
jmp need_resched
#endif
...
Why, after return from schedule(), first 0 is written to TI_preempt_count(%ebp), and only then interrupts are disabled?
Wht not the reverse order?