自旋锁初始化函数

spinlock initialization function

要在内核 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) 只是 return &lock->rlockThis 文章解释说:

The implementation of the spinlock_check is pretty easy, this function just returns the raw_spinlock_t of the given spinlock to be sure that we got exactly normal raw spinlock
我不明白这个函数如何执行 check。我期待 ckeck 函数中有一些 if 语句。对不起,我是内核编程的新手。

它不需要任何 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,这行不通了。这使得这些宏受到类型限制,因此它们的行为更像函数。

它 returns &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; })