全部博文(32)
分类: LINUX
2011-07-21 18:25:49
wangjianchangdx2011-07-22 23:39:17
还是先更新一下进度吧
现在的主要任务还是要画出平衡流中数据结构的框架图;
采用的方法是研究初始化流程,虽然有难度,暂不考虑通过平衡过程去了解这些数据结构的索引方式。是的,我钻上牛角尖了。
初始化过程从arch_init_sched_domains,到build_sched_domains,__build_sched_domains,该函数大致分为三部分:build sched_domain,build_sched_group,calculate power;
现在卡在build sched_domain中SMT/MC/SMP/NUMA所对应的sd的关系及mask的初始化上。
昨天已经研究了cpumask和topology,
现在已经知道node_domains是要覆盖尽可能多的node,在NUMA node之间进行平衡;如果node不能覆盖所有的cpu,则使用上层的allnodes,直接将cpu_map复制给他,已达到平衡时可以回溯到能够mask allcpu的sd的目的。现在问题也就在这里,是否使用a
wangjianchangdx2011-07-22 00:07:25
OK, 又扫了一遍平衡流(sched_domain)初始化的过程,其中的cpumask部分,基本上都可以看懂了,明天再细致的看一下,应该说是今天了,呵呵
wangjianchangdx2011-07-22 00:00:08
topology:
主要目的是要向/sys目录下导出相关信息(Document/cputopology.txt)。
topology.h中也定义了
①初始化SMT/MC/SMP/NUMA对应sched_domain的初始化宏,
② numa_node相关函数,以及
③
#define topology_physical_package_id(cpu)
#define topology_core_id(cpu)
#define topology_thread_cpumask(cpu)
#define topology_core_cpumask(cpu)等四个宏;
numa_node在cpu_init中使用set_numa_node初始化;
虽然一个CPU可以有多个core,而一个core又可以有多个thread,但cpumask毕竟是cpu的mask,所以同一个cpu的所有core和thread都共享同一个cpumas
wangjianchangdx2011-07-21 21:56:47
倒着来
typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;
#define DECLARE_BITMAP(name,bits) \
unsigned long name[BITS_TO_LONGS(bits)]
#define BITS_PER_BYTE 8
#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
为了解决BITS_PER_BYTE * s
wangjianchangdx2011-07-21 19:48:26
init/main.c:
/* Setup number of possible processor ids */
int nr_cpu_ids __read_mostly = NR_CPUS;
EXPORT_SYMBOL(nr_cpu_ids);