강좌 & 팁
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 는 발견할수가 없기 때문입니다