context_tracking_init()
kernel/context_tracking.c
#ifdef CONFIG_CONTEXT_TRACKING_FORCE void __init context_tracking_init(void) { int cpu; for_each_possible_cpu(cpu) context_tracking_cpu_set(cpu); } #endif
CONFIG_CONTEXT_TRACKING_FORCE 커널 옵션을 사용한 경우 동작되며 각 cpu에 대해 context 트래킹을 enable한다.
- 성능상의 이유로 production 커널을 빌드시에는 이 옵션을 사용하면 안된다.
- CONFIG_CONTEXT_TRACKING_FORCE 옵션은 CONFIG_RCU_USER_QS 옵션 또는 CONFIG_VIRT_CPU_ACCOUNTING_GEN을 사용한 경우 지원된다.
- CONFIG_RCU_USER_QS
- userspace에서 확장된 quiescent 상태를 가진 RCU를 사용하게 한다.
- kernelspace에서 userspace로 넘어갈 때 이 cpu에 대해 GP 내부에 있는지 확인할 필요가 없으므로 이 상태를 quiescent 상태로 바꾼다.
- userspace에서 확장된 quiescent 상태를 가진 RCU를 사용하게 한다.
- CONFIG_VIRT_CPU_ACCOUNTING_GEN
- full dynticks 시스템에서 task와 cpu 타임을 재기위해 동작시키낟.
- CONFIG_RCU_USER_QS
context_tracking_cpu_set()
void context_tracking_cpu_set(int cpu) { if (!per_cpu(context_tracking.active, cpu)) { per_cpu(context_tracking.active, cpu) = true; static_key_slow_inc(&context_tracking_enabled); } }
요청 cpu에 대한 context_tracking.active가 false인 경우 true로 변경하고 context_tracking_enabled static key 변수를 증가시킨다.