什么时候是preempt_count()&PREEMPT_ACTIVE == 0?

我正在看Linux中的调度器代码:

if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) { if (unlikely(signal_pending_state(prev->state, prev))) { prev->state = TASK_RUNNING; } else { deactivate_task(rq, prev, DEQUEUE_SLEEP); prev->on_rq = 0; 

据我所知,如果prev任务是不可中断的,这段代码将停用任务(并从runqueue中删除)

 preempt_count() & PREEMPT_ACTIVE == 0 

有人可以向我解释什么是在thread_info preempt_count什么时候这个条件满足或不?

preempt_countpreempt_disable()preempt_enable()使用的计数器,它使嵌套的使用成为可能。 preempt_count用于hardirq和softirq计数器,NMI位和PREEMPT_ACTIVE位。 这些在include/linux/preempt_mask.h中定义。 在x86体系结构中, PREEMPT_NEED_RESCHED位也用于preempt_count ,用于优化决定重新计划。

现在,我不清楚PREEMPT_ACTIVE位的确切需要 。 在内核3.17版本中, preempt_count正好在调用__schedule()之前设置在preempt_count在调用之后立即复位,除非从schedule()调用它。 这意味着,在__schedule()中,当由于内核抢占而调用__schedule()PREEMPT_ACTIVE被设置在preempt_count ,也就是说,不会故意使用一些使用schedule()其他OS功能。 这样的“其他操作系统功能”会有所不同,具体取决于您是使用CONFIG_PREEMPTCONFIG_PREEMPT_VOLUNTARY还是CONFIG_PREEMPT_NONE构建内核,但是它包含对互斥量的显式阻塞。