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

时间:2016-10-30 21:15:35

标签: c linux linux-kernel scheduler

我正在查看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

有人可以向我解释preempt_count thread_info中的"INSERT INTO items (user_id, market_table_id, price, info )" ." SELECT '$id', table_id , $price, '$info' FROM markets WHERE city= '$city' AND market='$market' ;"; 是什么时候会遇到这种情况?

1 个答案:

答案 0 :(得分:0)

preempt_countpreempt_disable()preempt_enable()使用的计数器,可以使用它们进行嵌套。 preempt_count的高阶位用于hardirq和softirq计数器,NMI位和PREEMPT_ACTIVE位。这些在include/linux/preempt_mask.h中定义。在x86架构中,PREEMPT_NEED_RESCHED位也用于preempt_count,用于优化决定重新安排。

现在,我不清楚PREEMPT_ACTIVEpreempt_count位的确切需要。在我已经使用的内核版本3.17中,PREEMPT_ACTIVE在调用preempt_count之前准确设置__schedule()并在调用之后立即重置,在所有情况下,除非从{调用{ {1}}。这意味着,在schedule()__schedule()设置PREEMPT_ACTIVE,因为内核抢占而被调用preempt_count,即不会故意用于某些其他操作系统功能,使用__schedule()。这种“其他操作系统功能”会有什么不同,具体取决于您是使用schedule()CONFIG_PREEMPT还是CONFIG_PREEMPT_VOLUNTARY构建内核,但它包含对互斥锁的显式阻塞。