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;
}
참고