要在内核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->rlock
。 This文章解释说:
spinlock_check的实现非常简单,此函数仅返回给定旋转锁的raw_spinlock_t,以确保我们获得了完全正常的原始旋转锁我不明白此功能如何执行检查。我期望在ckeck函数中有一些
if
语句。抱歉,我是内核编程的新手。
答案 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; })