使用spinlock_check()函数

时间:2018-10-02 15:40:48

标签: c linux linux-device-driver spinlock

我对spin_lock_init()宏中使用的函数spinlock_check()有疑问。

spinlock_check的代码如下所示,它返回rlock的地址

static __always_inline raw_spinlock_t *spinlock_check(spinlock_t *lock)
{
    return &lock->rlock;
}

它在宏spin_lock_init中使用。该宏的代码:

#define spin_lock_init(_lock)               \
do {                            \
   spinlock_check(_lock);               \
   raw_spin_lock_init(&(_lock)->rlock);     \
} while (0)

我在here中看到了有关此主题的问题。 但是我不太了解,我想用我的方式表达怀疑。

spin_lock_init()是宏,而spinlock_check()不是宏。它是一个内联函数。因此,我认为这里不可能发生一些编译魔术,但是我希望在执行这些指令的过程中会有魔术。  spinlock_check()有什么作用? 因为没有任何东西正在使用spinlock_check()函数的返回值。 即使spinlock_check()返回某些内容,下一步还是要执行。 因为我在文件之一中看到了它的用法,所以我认为它与min(x,y)宏不同。

这是我found

的用法
#ifdef CONFIG_NUMA
static void do_numa_crng_init(struct work_struct *work)
{
    int i;
    struct crng_state *crng;
    struct crng_state **pool;

    pool = kcalloc(nr_node_ids, sizeof(*pool), GFP_KERNEL|__GFP_NOFAIL);
    for_each_online_node(i) {
        crng = kmalloc_node(sizeof(struct crng_state),
                    GFP_KERNEL | __GFP_NOFAIL, i);
        spin_lock_init(&crng->lock);
        crng_initialize(crng);
        pool[i] = crng;
    }
    mb();
    if (cmpxchg(&crng_node_pool, NULL, pool)) {
        for_each_node(i)
        kfree(pool[i]);
        kfree(pool);
    }
}

因此,crng在这里是动态分配的。说我错过了kmalloc代码,这意味着我没有为crng分配内存,但是我仍然使用了spin_lock_init(crng)宏。 现在spinlock_check()函数有什么用? 是不是在spinlock_check()函数raw_spin_lock_init之后自动执行了?

如果要执行,那么spinlock_check()函数的用途是什么?  应该有一些含义,但我不知道。

1 个答案:

答案 0 :(得分:3)

您缺少的是spinlock_check()在运行时不执行任何检查 。这就是为什么它的返回值被忽略的原因。该指令有望在优化器的编译过程中删除。

那么有什么用吗?是!目的是确保在编译时,其参数类型为spinlock_t *。如果不将指向spinlock_t的指针作为spin_lock_init()的参数,则会触发编译错误。

相关问题