lockdep_init()
- lockdep
- lock dependency의 약자로 커널이 lock을 모니터링하고 디버깅하기 위한 것으로 dead-lock 검출도 한다.
void lockdep_init(void) { int i; /* * Some architectures have their own start_kernel() * code which calls lockdep_init(), while we also * call lockdep_init() from the start_kernel() itself, * and we want to initialize the hashes only once: */ if (lockdep_initialized) return; for (i = 0; i < CLASSHASH_SIZE; i++) INIT_LIST_HEAD(classhash_table + i); for (i = 0; i < CHAINHASH_SIZE; i++) INIT_LIST_HEAD(chainhash_table + i); lockdep_initialized = 1; }
- if (lockdep_initialized)
- lockdep_initialized는 lockdep_init() 함수가 이미 초기화되었음을 의미한다. 따라서 lockdep_initialized가 true(1)일 경우에는 초기화 코드를 수행하지 않는다.
- INIT_LIST_HEAD(classhash_table + i);
- lockdep에 사용될 class마다 hash table을 만든다.
- lockdep에 사용되는 class는 4096개(CLASSHASH_SIZE)이다.
- classhash_table을 CLASSHASH_SIZE(4096)개 만큼 초기화한다.
- INIT_LIST_HEAD(chainhash_table + i);
- chainhash_table을 CHAINHASH_SIZE(32768)개 만큼 초기화한다.
classhash_table & chainhash_table
/* * The lockdep classes are in a hash-table as well, for fast lookup: */ static struct list_head classhash_table[CLASSHASH_SIZE]; /* * We put the lock dependency chains into a hash-table as well, to cache * their existence: */ static struct list_head chainhash_table[CHAINHASH_SIZE];
list_head의 구조
struct list_head { struct list_head *next, *prev; };
INIT_LIST_HEAD()
static inline void INIT_LIST_HEAD(struct list_head *list) { list->next = list; list->prev = list; }
참고
- Lockdep | 문c