自旋锁初始化功能

时间:2018-09-28 08:48:38

标签: c linux-kernel mutex

要在内核v4.19-rc5中初始化自旋锁,必须使用如下定义的spin_lock_init宏:

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

函数spinlock_check(_lock)仅返回&lock->rlockThis文章解释说:

spinlock_check的实现非常简单,此函数仅返回给定旋转锁的raw_spinlock_t,以确保我们获得了完全正常的原始旋转锁
我不明白此功能如何执行检查。我期望在ckeck函数中有一些if语句。抱歉,我是内核编程的新手。

1 个答案:

答案 0 :(得分:4)

它不需要任何if语句,因为它用于编译时检查。

您可以看到here,大多数自旋锁操作都定义为宏,因此它们无法限制其参数类型。

考虑以下示例:

struct not_a_spinlock {
    raw_spinlock_t rlock;
};

如果没有spinlock_check,我可以使用spin_lock_init对其进行初始化:

struct not_a_spinlock spin;
spin_lock_init(&spin);

但是,感谢spinlock_check,这无法正常工作。这使这些宏具有类型限制,因此它们的行为更像函数。

它返回&lock->rlock的原因是出于方便-它的返回值可以传递给下一个函数。

因此可能值得将示例中的宏重写为:

#define spin_lock_init(_lock)                         \
do {                                                  \
       raw_spin_lock_init(spinlock_check(_lock));     \
} while (0)

类似的技术可以与宏一起使用,以在某种程度上限制其参数类型,如here所示:

#define min(x, y) ({                \
    typeof(x) _min1 = (x);          \
    typeof(y) _min2 = (y);          \
    (void) (&_min1 == &_min2);      \
    _min1 < _min2 ? _min1 : _min2; })