scutan 发表于 2007-04-25 21:21

请教关于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这个线程的返回值吗,还是什么的?即是说这个宏既可以返回一个数据结构又可以返回一个线程?
望高手不吝赐教. 谢谢.

scutan 发表于 2007-04-26 13:10

回复 #1 scutan 的帖子

我觉得这个宏既可以返回定义的数据结构的值也可以返回在那个CPU上面运行的函数的返回值. 不知大家有何高见!

raise_sail 发表于 2007-04-27 09:54

这里内核似乎不太严谨: 这个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;

jerryhua_cu 发表于 2016-04-14 17:00

其实这是一个坑人的地方,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]
查看完整版本: 请教关于DEFINE_PER_CPU()的一点问题