cpu topology sys文件系统接口
2017-01-13 15:19
120 查看
在driver/base下面还有一个topology.c 这个文件只要是生成sys文件接口,方便用户同下面的接口查询cpu的拓扑结构.
[root@CentOS sda1]# cd /sys/devices/system/cpu/cpu0/
driver/ firmware_node/ hotplug/ node0/ power/ regs/ subsystem/ topology/
[root@CentOS sda1]# cd /sys/devices/system/cpu/cpu0/topology/
[root@CentOS topology]# ls
core_id core_siblings core_siblings_list physical_package_id thread_siblings thread_siblings_list
[root@CentOS topology]# cat core_id
0
[root@CentOS topology]# cat physical_package_id
256
下面详细看看topology.c 的代码。
device_initcall(topology_sysfs_init);
可见是kernel 会自动调用topology_sysfs_init
static int topology_sysfs_init(void)
{
int cpu;
int rc = 0;
cpu_notifier_register_begin();
for_each_online_cpu(cpu) {
rc = topology_add_dev(cpu);
if (rc)
goto out;
}
__hotcpu_notifier(topology_cpu_callback, 0);
out:
cpu_notifier_register_done();
return rc;
}
通过for_each_online_cpu 为内个online的调用topology_add_dev.随后注册一个notify。在cpu hotplug的时候更新/sys/devices/system/cpu/
static int topology_cpu_callback(struct notifier_block *nfb,
unsigned long action, void *hcpu)
{
unsigned int cpu = (unsigned long)hcpu;
int rc = 0;
switch (action) {
case CPU_UP_PREPARE:
case CPU_UP_PREPARE_FROZEN:
rc = topology_add_dev(cpu);
break;
case CPU_UP_CANCELED:
case CPU_UP_CANCELED_FROZEN:
case CPU_DEAD:
case CPU_DEAD_FROZEN:
topology_remove_dev(cpu);
break;
}
return notifier_from_errno(rc);
}
hotplug的notify函数包含了add cpu 和 remove cpu两种操作.
我们以add为例
/* Add/Remove cpu_topology interface for CPU device */
static int topology_add_dev(unsigned int cpu)
{
struct device *dev = get_cpu_device(cpu);
return sysfs_create_group(&dev->kobj, &topology_attr_group);
}
调用sysfs_create_group 增加接口,并绑定处理函数
static struct attribute *default_attrs[] = {
&dev_attr_physical_package_id.attr,
&dev_attr_core_id.attr,
&dev_attr_thread_siblings.attr,
&dev_attr_thread_siblings_list.attr,
&dev_attr_core_siblings.attr,
&dev_attr_core_siblings_list.attr,
#ifdef CONFIG_SCHED_BOOK
&dev_attr_book_id.attr,
&dev_attr_book_siblings.attr,
&dev_attr_book_siblings_list.attr,
#endif
#ifdef CONFIG_SCHED_DRAWER
&dev_attr_drawer_id.attr,
&dev_attr_drawer_siblings.attr,
&dev_attr_drawer_siblings_list.attr,
#endif
NULL
};
到这一步就很熟悉了。这个attribute会和/sys/devices/system/cpu/ 下面的接口一致
cd /sys/devices/system/cpu
[root@CentOS topology]# ls
core_id core_siblings_list thread_siblings
core_siblings physical_package_id thread_siblings_list
[root@CentOS sda1]# cd /sys/devices/system/cpu/cpu0/
driver/ firmware_node/ hotplug/ node0/ power/ regs/ subsystem/ topology/
[root@CentOS sda1]# cd /sys/devices/system/cpu/cpu0/topology/
[root@CentOS topology]# ls
core_id core_siblings core_siblings_list physical_package_id thread_siblings thread_siblings_list
[root@CentOS topology]# cat core_id
0
[root@CentOS topology]# cat physical_package_id
256
下面详细看看topology.c 的代码。
device_initcall(topology_sysfs_init);
可见是kernel 会自动调用topology_sysfs_init
static int topology_sysfs_init(void)
{
int cpu;
int rc = 0;
cpu_notifier_register_begin();
for_each_online_cpu(cpu) {
rc = topology_add_dev(cpu);
if (rc)
goto out;
}
__hotcpu_notifier(topology_cpu_callback, 0);
out:
cpu_notifier_register_done();
return rc;
}
通过for_each_online_cpu 为内个online的调用topology_add_dev.随后注册一个notify。在cpu hotplug的时候更新/sys/devices/system/cpu/
static int topology_cpu_callback(struct notifier_block *nfb,
unsigned long action, void *hcpu)
{
unsigned int cpu = (unsigned long)hcpu;
int rc = 0;
switch (action) {
case CPU_UP_PREPARE:
case CPU_UP_PREPARE_FROZEN:
rc = topology_add_dev(cpu);
break;
case CPU_UP_CANCELED:
case CPU_UP_CANCELED_FROZEN:
case CPU_DEAD:
case CPU_DEAD_FROZEN:
topology_remove_dev(cpu);
break;
}
return notifier_from_errno(rc);
}
hotplug的notify函数包含了add cpu 和 remove cpu两种操作.
我们以add为例
/* Add/Remove cpu_topology interface for CPU device */
static int topology_add_dev(unsigned int cpu)
{
struct device *dev = get_cpu_device(cpu);
return sysfs_create_group(&dev->kobj, &topology_attr_group);
}
调用sysfs_create_group 增加接口,并绑定处理函数
static struct attribute *default_attrs[] = {
&dev_attr_physical_package_id.attr,
&dev_attr_core_id.attr,
&dev_attr_thread_siblings.attr,
&dev_attr_thread_siblings_list.attr,
&dev_attr_core_siblings.attr,
&dev_attr_core_siblings_list.attr,
#ifdef CONFIG_SCHED_BOOK
&dev_attr_book_id.attr,
&dev_attr_book_siblings.attr,
&dev_attr_book_siblings_list.attr,
#endif
#ifdef CONFIG_SCHED_DRAWER
&dev_attr_drawer_id.attr,
&dev_attr_drawer_siblings.attr,
&dev_attr_drawer_siblings_list.attr,
#endif
NULL
};
到这一步就很熟悉了。这个attribute会和/sys/devices/system/cpu/ 下面的接口一致
cd /sys/devices/system/cpu
[root@CentOS topology]# ls
core_id core_siblings_list thread_siblings
core_siblings physical_package_id thread_siblings_list
相关文章推荐
- 应用程序访问内核的新接口/sys文件系统
- efi的sys文件系统接口
- linux驱动层到应用层的重要接口sys文件系统---/sys目录详解
- 调用 系统蓝牙接口 发送文件
- Linux 内核/sys 文件系统介绍
- 什么是sys文件系统
- Linux 内核/sys 文件系统介绍
- Linux网络管理员手册(5) 第五章 配置TCP/IP网络 proc文件系统 设置主机名 分配IP地址 IP的接口配置 以太网接口
- Linux 内核/sys 文件系统介绍
- Linux 内核/sys 文件系统之sysfs 属性文件
- 通过/sys/文件接口操作IO端口
- 使用Spring中的Resource接口隔离对文件系统的依赖
- Intel Flash的驱动实现及提供给文件系统Flash File System的一些接口
- 移植linux2.6.29内核及根文件系统到UP-CPU-2410(3)
- 操作系统总结之文件系统接口
- 文件系统,dev接口,文件压缩与解压
- sys文件系统总结,,
- 系统sys文件丢失的解决,请高手给个解释哦
- Linux下查看cpu类型、内存大小、硬盘大小类型和文件系统大小等
- PVFS2源代码分析之用户系统接口src/client/sysin/sys-get-eattr.sm状态机描述