lockdep状态相关定义如LOCK_ENABLED_HARDIRQ
文章目录
- 1. LOCK_ENABLED_HARDIRQ定义在哪?
- 2. HARDIRQ和SOFTIRQ
- 2.1 基础枚举型 enum lock_usage_bit
- 2.2 Usage-state bitmasks
1. LOCK_ENABLED_HARDIRQ定义在哪?
诸多上下文状态如LOCK_ENABLED_HARDIRQ等直接搜索没看到定义。它的定义在头文件lockdep_internals.h中,而lockdep_internals.h引用的头文件是lockdep_states.h。
- lockdep_internals.h
- lockdep_states.h
2. HARDIRQ和SOFTIRQ
lockdep_internals.h文件中定义了很多型如下面宏定义的数据结构:
#define LOCKDEP_STATE(__STATE) //定义
....
#include "lockdep_states.h" //包含
#undef LOCKDEP_STATE //取消定义
都是“定义 > 包含 > 取消定义” 》“定义 > 包含 > 取消定义” 》…
2.1 基础枚举型 enum lock_usage_bit
看第一个例子:enum lock_usage_bit
enum lock_usage_bit {
#define LOCKDEP_STATE(__STATE) \LOCK_USED_IN_##__STATE, \LOCK_USED_IN_##__STATE##_READ, \LOCK_ENABLED_##__STATE, \LOCK_ENABLED_##__STATE##_READ,
#include "lockdep_states.h"
#undef LOCKDEP_STATELOCK_USED,LOCK_USAGE_STATES
};
将lockdep_states.h两行包含进来:
LOCKDEP_STATE(HARDIRQ)
LOCKDEP_STATE(SOFTIRQ)
变成:
enum lock_usage_bit {
#define LOCKDEP_STATE(__STATE) \LOCK_USED_IN_##__STATE, \LOCK_USED_IN_##__STATE##_READ, \LOCK_ENABLED_##__STATE, \LOCK_ENABLED_##__STATE##_READ,LOCKDEP_STATE(HARDIRQ) //(1)LOCKDEP_STATE(SOFTIRQ) //(2)
#undef LOCKDEP_STATELOCK_USED,LOCK_USAGE_STATES
};
(1) 和 (2)分别展开也即__STATE分别替换成HARDIRQ和SOFTIRQ:
/** Lock-class usage-state bits:*/
enum lock_usage_bit {LOCK_USED_IN_HARDIRQ, LOCK_USED_IN_HARDIRQ_READ, LOCK_ENABLED_HARDIRQ,LOCK_ENABLED_HARDIRQ_READ,LOCK_USED_IN_SOFTIRQ, LOCK_USED_IN_SOFTIRQ_READ, LOCK_ENABLED_SOFTIRQ,LOCK_ENABLED_SOFTIRQ_READ,LOCK_USED,LOCK_USAGE_STATES
};
这个是基础,其他枚举或宏均基于这个枚举。
2.2 Usage-state bitmasks
/** Usage-state bitmasks:*/
enum {LOCKF_USED_IN_HARDIRQ = (1 << LOCK_USED_IN_HARDIRQ),LOCKF_USED_IN_HARDIRQ_READ = (1 << LOCK_USED_IN_HARDIRQ_READ),LOCKF_ENABLED_HARDIRQ = (1 << LOCK_ENABLED_HARDIRQ),LOCKF_ENABLED_HARDIRQ_READ = (1 << LOCK_ENABLED_HARDIRQ_READ),LOCKF_USED_IN_SOFTIRQ = (1 << LOCK_USED_IN_SOFTIRQ),LOCKF_USED_IN_SOFTIRQ_READ = (1 << LOCK_USED_IN_SOFTIRQ_READ),LOCKF_ENABLED_SOFTIRQ = (1 << LOCK_ENABLED_SOFTIRQ),LOCKF_ENABLED_SOFTIRQ_READ = (1 << LOCK_ENABLED_SOFTIRQ_READ),LOCKF_USED = (1 << LOCK_USAGE_STATES),
};static const unsigned long LOCKF_ENABLED_IRQ = LOCKF_ENABLED_HARDIRQ | LOCKF_ENABLED_SOFTIRQ | 0;
static const unsigned long LOCKF_USED_IN_IRQ = LOCKF_USED_IN_HARDIRQ | LOCKF_USED_IN_SOFTIRQ | 0;
static const unsigned long LOCKF_ENABLED_IRQ_READ = LOCKF_ENABLED_HARDIRQ_READ | LOCKF_ENABLED_SOFTIRQ_READ | 0;
static const unsigned long LOCKF_USED_IN_IRQ_READ = LOCKF_USED_IN_HARDIRQ_READ | LOCKF_USED_IN_SOFTIRQ_READ | 0;
