请教关于DEFINE_PER_CPU()的一点问题
大家好, DEFINE_PER_CPU 这个宏就是为每个CPU分配一个数据结构, 比如在runqueue这种情况, 为每个CPU建立一个运行队列,这样就可以更好地管理每个CPU上面的进程.而DEFINE_PER_CPU 这个宏的第一个参数是一个数据类型, 第二个参数是自己定义的一个名字.
但是我在看软中断的时候, 发现了一个问题,就是说在调用了raise_softirq()这个函数之后, 会去启用ksoftirqd()这个内核线程,它的作用就是运行每个CPU上面的已经触发了的软中断. 但是它定义的方式有一点我搞不太明白.
static DEFINE_PER_CPU(struct task_struct *, ksoftirqd);
这就是它的定义方式, 为什么它的第二个参数是ksoftirqd呢? 因为内核中有ksoftirqd这样一个函数线程,它可以将这个参数直接定义成这个函数的名字吗? 我看了内核中所有的DEFINE_PER_CPU函数,都没有出现第二个参数是一个函数名称的用法,都是将第二个参数定义成自己自定义的一个名称而已.
那么这个用法是怎么回事呢?
谢谢.
我的想法是说,用这个的话就可以获得每个CPU上面的ksoftirqd这个线程的返回值吗,还是什么的?即是说这个宏既可以返回一个数据结构又可以返回一个线程?
望高手不吝赐教. 谢谢.
回复 #1 scutan 的帖子
我觉得这个宏既可以返回定义的数据结构的值也可以返回在那个CPU上面运行的函数的返回值. 不知大家有何高见! 这里内核似乎不太严谨: 这个PER_CPU变量里保存的是task_struct类型的东东,虽然其数据类型是函数指针,见cpu_callback():597 case CPU_UP_PREPARE:
598 p = kthread_create(ksoftirqd, hcpu, "ksoftirqd/%d", hotcpu);
599 if (IS_ERR(p)) {
600 printk("ksoftirqd for %i failed\n", hotcpu);
601 return NOTIFY_BAD;
602 }
603 kthread_bind(p, hotcpu);
604 per_cpu(ksoftirqd, hotcpu) = p; /* NOTE here */
605 break; 其实这是一个坑人的地方,per_cpu变量ksoftirqd和线程函数ksoftirqd取了同样的名字。而实际上我们看一下DEFINE_PER_CPU的定义可以看出来,ksoftirqd变量被重新命名为了per_cpu_ksoftirqd。
#define DEFINE_PER_CPU_SECTION(type, name, sec) \
__PCPU_ATTRS(sec) PER_CPU_DEF_ATTRIBUTES \
__typeof__(type) per_cpu__##name
#define DEFINE_PER_CPU(type, name) \
DEFINE_PER_CPU_SECTION(type, name, "")
页:
[1]