context_tracking_init()

 

context_tracking_init()

kernel/context_tracking.c

1#ifdef CONFIG_CONTEXT_TRACKING_FORCE
2void __init context_tracking_init(void)
3{
4        int cpu;
5 
6        for_each_possible_cpu(cpu)
7                context_tracking_cpu_set(cpu);
8}
9#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 상태로 바꾼다.
    • CONFIG_VIRT_CPU_ACCOUNTING_GEN
      • full dynticks 시스템에서 task와 cpu 타임을 재기위해 동작시키낟.

 

context_tracking_cpu_set()

1void context_tracking_cpu_set(int cpu)
2{
3        if (!per_cpu(context_tracking.active, cpu)) {
4                per_cpu(context_tracking.active, cpu) = true;
5                static_key_slow_inc(&context_tracking_enabled);
6        }
7}

요청 cpu에 대한 context_tracking.active가 false인 경우 true로 변경하고 context_tracking_enabled static key 변수를 증가시킨다.

 

댓글 남기기