- 论坛徽章:
- 3
|
我发现一个严重的问题, 就是IRQF_DISABLED被拿掉之后,会影响内核抢占, 从此以后内核从中断返回时再也不会发生抢占了:), 意外啊
看代码:
ret_from_exception:
preempt_stop(CLBR_ANY)
ret_from_intr:
.....省略....
jb resume_kernel # not returning to v8086 or userspace
ENTRY(resume_kernel)
DISABLE_INTERRUPTS(CLBR_ANY)
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 $X86_EFLAGS_IF,PT_EFLAGS(%esp) # interrupts off (exception path) ?
jz restore_all
call preempt_schedule_irq
jmp need_resched
END(resume_kernel)
在resume_kernel中,中断肯定是关掉的, 所以testl $X86_EFLAGS_IF,PT_EFLAGS(%esp)肯定是置位的,所以每次都走jz restore_all分支哈
但是在以前老的内核中,也就是IRQF_DISABLED存在的时候,一般注册中断的时候不会设置IRQF_DISABLED, 所以默认是开中断的,每次都会掉preempt_schedule_irq而发生抢占调度。
看来拿掉IRQF_DISABLED虽然能避免堆栈溢出,但是导致内核抢占的机会少了很多啊。也许得不偿失啊
|
|