【问题标题】:Why is BUG called in the tasklet_action() function?为什么tasklet_action()函数中会调用BUG?
【发布时间】:2021-04-24 18:51:05
【问题描述】:
static void tasklet_action(struct softirq_action *a)
{
    // ...

    while (list) {
        struct tasklet_struct *t = list;

        list = list->next;

        if (tasklet_trylock(t)) {
            if (!atomic_read(&t->count)) {
                if (!test_and_clear_bit(TASKLET_STATE_SCHED,
                            &t->state))
                    BUG();

                // ...
    }
}

我的理解是,如果一个 tasklet 已经安排好了,那么这段代码会抛出一个BUG()。 这是否意味着同一个tasklet不能同时运行,也不能调度?

【问题讨论】:

    标签: c linux-kernel


    【解决方案1】:

    这只是对 tasklet 的保证属性的健全性检查。你可以看到a comment in include/linux/interrupt.h中列出的tasklet的属性:

       Properties:
       * If tasklet_schedule() is called, then tasklet is guaranteed
         to be executed on some cpu at least once after this.
       * If the tasklet is already scheduled, but its execution is still not
         started, it will be executed only once.
       * If this tasklet is already running on another CPU (or schedule is called
         from tasklet itself), it is rescheduled for later.
       * Tasklet is strictly serialized wrt itself, but not
         wrt another tasklets. If client needs some intertask synchronization,
         he makes it with spinlocks.
    

    根据定义,tasklet 保证在调度后运行至少一次。这段代码:

        if (!atomic_read(&t->count)) {
            if (!test_and_clear_bit(TASKLET_STATE_SCHED,
                        &t->state))
                BUG();
    

    确保此属性成立,否则有错误,BUG() 用于停止执行并导致运行时恐慌。

    这是上面代码的注释版本,以使其更清晰:

        // If the tasklet never ran (t->count == 0)
        if (!atomic_read(&t->count)) {
            // And the tasklet is not scheduled for running (bit TASKLET_STATE_SCHED of t->state is 0)
            if (!test_and_clear_bit(TASKLET_STATE_SCHED,
                        &t->state))
                // There's something wrong, this should never happen!
                BUG();
    

    换句话说,你不能有一个带有t->count == 0t->state & (1<<TASKLET_STATE_SCHED) == 0 的tasklet。如果发生这种情况,则存在错误。

    【讨论】:

      猜你喜欢
      • 2019-02-11
      • 1970-01-01
      • 2011-05-13
      • 2017-05-29
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      相关资源
      最近更新 更多