spin_lock代码分析
spin_lock
代码位置:/kernel/include/linux/spinlock.h
static __always_inline void spin_lock(spinlock_t *lock)
{
raw_spin_lock(&lock->rlock);
}
可见,spin_lock的实现实际上是通过raw_spin_lock实现的。
看一下spinlock和raw_spinlock的结构体定义:/kernel/include/linux/spinlock_types.h
typedef struct spinlock {
union {
struct raw_spinlock rlock;//raw_spinlock是成员
#ifdef CONFIG_DEBUG_LOCK_ALLOC
# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map))
struct {
u8 __padding[LOCK_PADSIZE];
struct lockdep_map dep_map;
};
#endif
};
} spinlock_t;
......
typedef struct raw_spinlock {
arch_spinlock_t raw_lock;
#ifdef CONFIG_DEBUG_SPINLOCK
unsigned int magic, owner_cpu;
void *owner;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lockdep_map dep_map;
#endif
} raw_spinlock_t;
可见,spinlock里包含raw_spinlock的成员,这才使spinlock调用raw_spinlock的函数变得可实现起来。
raw_spin_lock系列函数
在/kernel/include/linux/spinlock.h中,
#define raw_spin_lock(lock) _raw_spin_lock(lock)
在/kernel/include/linux/spinlock_api_smp.h中,
#define _raw_spin_lock(lock) __raw_spin_lock(lock)
static inline void __raw_spin_lock(raw_spinlock_t *lock)
{
preempt_disable();
spin_acquire(&lock->dep_map, 0, 0

本文深入探讨了spin_lock和raw_spin_lock的工作原理及其实现细节,包括它们的内部结构定义、关键函数的调用流程及其在不同系统配置下的行为差异。
最低0.47元/天 解锁文章
1277





