我对宏中使用的函数spinlock_check()
有一个问题spin_lock_init()
。
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)
我在这里看到了一个关于这个话题的问题。 但我不太明白,我想用我的方式表达怀疑。
spin_lock_init()
是宏,但spinlock_check()
不是宏。它是一个内联函数。所以我认为这里不可能发生一些编译魔术,但我希望在执行这些指令时会出现一些魔术。spinlock_check()
有什么作用? 因为没有任何东西使用spinlock_check()
函数的返回值。 即使spinlock_check()
返回一些东西,下一步无论如何都会被执行。 因为我在其中一个文件中看到了它的用法,我认为它与 min(x, y( 宏不同。
这是我找到的用法
#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()
函数有什么用? 应该有一些意思,但我想不通。
您缺少的是spinlock_check()
在运行时不执行任何检查。这就是忽略其返回值的原因。优化程序应在编译期间删除此指令。
那么,它有什么用吗?是的!其目的是确保在编译时其参数的类型为spinlock_t *
。如果不将指向spinlock_t
的指针作为spin_lock_init()
的参数,则会触发编译错误。