首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spinlock_check()函数的使用

spinlock_check()函数的使用
EN

Stack Overflow用户
提问于 2018-10-02 23:40:48
回答 1查看 231关注 0票数 2

我有一个关于spin_lock_init()宏中使用的函数spinlock_check()的问题。

spinlock_check的代码写在下面,它返回rlock的地址

代码语言:javascript
复制
static __always_inline raw_spinlock_t *spinlock_check(spinlock_t *lock)
{
    return &lock->rlock;
}

它在宏spin_lock_init中使用。这个宏的代码如下:

代码语言:javascript
复制
#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)宏不同。

下面是I found的用法

代码语言:javascript
复制
#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()函数有什么用呢?应该有点意思,但我搞不懂。

EN

回答 1

Stack Overflow用户

发布于 2018-10-03 01:39:02

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52611817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档