自旋锁初始化函数
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->rlock
。 This 文章解释说:
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; })
要在内核 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->rlock
。 This 文章解释说:
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; })