自旋锁初始化函数

要在内核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 。 本文解释说:

spinlock_check的实现非常简单,这个函数只返回给定自旋锁的raw_spinlock_t,以确保我们得到完全正常的原始自旋锁

我不明白这个函数是如何执行检查的 。 我期待ckeck函数中的一些if语句。 对不起,我是内核编程的新手。

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

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

请考虑以下示例:

 struct not_a_spinlock { raw_spinlock_t rlock; }; 

没有spinlock_check我可以使用spin_lock_init来初始化它:

 struct not_a_spinlock spin; spin_lock_init(&spin); 

但是由于spinlock_check ,这不起作用。 这使得这些宏受到类型限制,因此它们更像function。

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

因此,从您的示例中重写宏可能值得:

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

类似的技术可以与宏一起用来限制它们的参数类型,如下所示:

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