smp 에서의 idle task 는 어디에 있을까?


3.4 버전 이전과 3.5 버전 부터 달라진 부분을 살펴봅니다.


3.4 버전 이전에는 idle task 가 만들어지는 곳이 arch speicific 하게 되어 있었습니다.


arm 의 예를 들어 살펴보자면...


arch/arm/kernel/setup.c

155 static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;                 

156 static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } };

157 #define ENDIANNESS ((char)endian_test.l)                                                         

158                                                                                                  

159 DEFINE_PER_CPU(struct cpuinfo_arm, cpu_data); 

159 라인에서처럼 선언되어 사용됩니다

사용예를 보면

arch/arm/kernel/smp.c

64 int __cpuinit __cpu_up(unsigned int cpu)

65 {   

66     struct cpuinfo_arm *ci = &per_cpu(cpu_data, cpu);

67     struct task_struct *idle = ci->idle;

68     int ret;


66 line 에서 보는 것과 같이 정적으로 선언된 자료형을 가져오는 형태였습니다 


결국 cpu 별로 idle task 를 구하려면 위와 같은 방법으로 했었죠.

이것이 3.5 버전부터는 달라졌네요?

모두 없어졌습니다.  대신 kernel 에서 직접 관리하고 arch specific 한 부분의 코드 구현으로 바뀝니다.

볼까요?


kernel/smpboot.c

12 #ifdef CONFIG_GENERIC_SMP_IDLE_THREAD

13 /*

14  * For the hotplug case we keep the task structs around and reuse

15  * them.

16  */

17 static DEFINE_PER_CPU(struct task_struct *, idle_threads);

18 

19 struct task_struct * __cpuinit idle_thread_get(unsigned int cpu)

20 {

21     struct task_struct *tsk = per_cpu(idle_threads, cpu);

22 

23     if (!tsk)

24         return ERR_PTR(-ENOMEM);

25     init_idle(tsk, cpu);

26     return tsk;

27 }

12 라인에서 보는 것처럼 idle_threads 라는 것을 생성하게 되고

task_struct 를 얻을수 있게 됩니다.



위치상으로 달라진 것이라면 이전에는

idle task 의 위치는 cpuinfo_arm 의 멤버로 idle task_struct pointer 가 있었다면

3.5 부터는 idle_threads 라는 task_struct 가 percpu 로 존재하고 있습니다.


혹시라도 idle 의 task_struct 가 필요하시다면 (그럴 경우가 있을진 모르겠지만....)

위에서 가져오시면 될것 같습니다.

당연히 task_struct 를 아무리 뒤져도 idle task 는 발견할수가 없기 때문입니다