context_tracking_init()

 

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 상태로 바꾼다.
    • CONFIG_VIRT_CPU_ACCOUNTING_GEN
      • full dynticks 시스템에서 task와 cpu 타임을 재기위해 동작시키낟.

 

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 변수를 증가시킨다.

 

댓글 남기기