全部博文(32)
分类: LINUX
2011-07-21 18:25:49
wangjianchangdx2011-07-25 14:07:35
正面强攻了几天,效果十分不明显。
其实上面的任务也已经完成了一大半了,只需要再研究一下smp初始化过程中,对cpumask,core map, sibling map的初始化,建立cpu架构体系,就可以了。但是这是另外一个主题了,我也不想做过多纠缠。在这个问题上已经花费了太多的时间和精力,牛角尖也钻的太深,思维已经严重阻塞,继续下去,事倍功半。
还是回到主体任务,提纲挈领。
wangjianchangdx2011-07-24 02:37:29
刘勃那张图的画法是错误的
from sched_domain.txt:
Groups may be shared among CPUs as they contain read only data after they have been set up.
从代码的情况下,smt/mc的sd/sg是percpu的,也就是说,无论每个cpu有多少core,那core所对应的sd/sg也都只有一个。
这里percpu的用法与一贯的用法,有相当大的区别。
按照一贯用法的解释,这个percpu的sd/sg就要代表所有cpu中的cores/smts;而这里的用法,某cpu的core/smt的sd只覆盖该cpu本身的core/smt,与其他cpu的core/smt无关,而groups是coremask或siblingmask中的cpu共用的。这种做法是不可靠的。
wangjianchangdx2011-07-23 01:14:45
cpu_core_map/cpu_sibling_map没完没了了,也在情理之中,这样才正常~
After all, I love it~
wangjianchangdx2011-07-23 01:01:59
可以这样假定,从配置NUMA系统芯片选择的要求上,以及各个NUMA的结构图上来看,NUMA的每个节点上CPU的个数都是相同的。
那是不是所有的node的nodemask都是相同的,nodemask只需计算一次,并且这个是否需要allnodes的判断也只需要进行一次呢?
答案是否定的,因为cpu可以hotplug,sched_init_smp调用arch_init_sched_domains的时候,传入的参数就是‘cpu_active_mask’。为什么不能只计算一次呢?因为不知道第一个CPU所在的node是不是所有node中online的cpu最多的;为什么不设置一个变量,记录是否有cpumask_weight(cpu_map) <= (SD_NODES_PER_DOMAIN * cpumask_weight(d->nodemask))的情况呢?这是不是有点复杂了?如果真的发现了,前面的怎么办?
OK,虽然不准确,也只能将就了:(
BTW, it's the most ugly code i'v