Loading Documentation/cputopology.txt +9 −17 Original line number Diff line number Diff line Loading @@ -14,9 +14,8 @@ represent the thread siblings to cpu X in the same physical package; To implement it in an architecture-neutral way, a new source file, drivers/base/topology.c, is to export the 4 attributes. If one architecture wants to support this feature, it just needs to implement 4 defines, typically in file include/asm-XXX/topology.h. The 4 defines are: For an architecture to support this feature, it must define some of these macros in include/asm-XXX/topology.h: #define topology_physical_package_id(cpu) #define topology_core_id(cpu) #define topology_thread_siblings(cpu) Loading @@ -25,17 +24,10 @@ The 4 defines are: The type of **_id is int. The type of siblings is cpumask_t. To be consistent on all architectures, the 4 attributes should have default values if their values are unavailable. Below is the rule. 1) physical_package_id: If cpu has no physical package id, -1 is the default value. 2) core_id: If cpu doesn't support multi-core, its core id is 0. 3) thread_siblings: Just include itself, if the cpu doesn't support HT/multi-thread. 4) core_siblings: Just include itself, if the cpu doesn't support multi-core and HT/Multi-thread. So be careful when declaring the 4 defines in include/asm-XXX/topology.h. If an attribute isn't defined on an architecture, it won't be exported. To be consistent on all architectures, include/linux/topology.h provides default definitions for any of the above macros that are not defined by include/asm-XXX/topology.h: 1) physical_package_id: -1 2) core_id: 0 3) thread_siblings: just the given CPU 4) core_siblings: just the given CPU drivers/base/topology.c +6 −26 Original line number Diff line number Diff line Loading @@ -93,47 +93,27 @@ static ssize_t show_##name##_list(struct sys_device *dev, char *buf) \ #define define_siblings_show_func(name) \ define_siblings_show_map(name); define_siblings_show_list(name) #ifdef topology_physical_package_id define_id_show_func(physical_package_id); define_one_ro(physical_package_id); #define ref_physical_package_id_attr &attr_physical_package_id.attr, #else #define ref_physical_package_id_attr #endif #ifdef topology_core_id define_id_show_func(core_id); define_one_ro(core_id); #define ref_core_id_attr &attr_core_id.attr, #else #define ref_core_id_attr #endif #ifdef topology_thread_siblings define_siblings_show_func(thread_siblings); define_one_ro(thread_siblings); define_one_ro(thread_siblings_list); #define ref_thread_siblings_attr \ &attr_thread_siblings.attr, &attr_thread_siblings_list.attr, #else #define ref_thread_siblings_attr #endif #ifdef topology_core_siblings define_siblings_show_func(core_siblings); define_one_ro(core_siblings); define_one_ro(core_siblings_list); #define ref_core_siblings_attr \ &attr_core_siblings.attr, &attr_core_siblings_list.attr, #else #define ref_core_siblings_attr #endif static struct attribute *default_attrs[] = { ref_physical_package_id_attr ref_core_id_attr ref_thread_siblings_attr ref_core_siblings_attr &attr_physical_package_id.attr, &attr_core_id.attr, &attr_thread_siblings.attr, &attr_thread_siblings_list.attr, &attr_core_siblings.attr, &attr_core_siblings_list.attr, NULL }; Loading include/linux/topology.h +13 −0 Original line number Diff line number Diff line Loading @@ -179,4 +179,17 @@ void arch_update_cpu_topology(void); #endif #endif /* CONFIG_NUMA */ #ifndef topology_physical_package_id #define topology_physical_package_id(cpu) ((void)(cpu), -1) #endif #ifndef topology_core_id #define topology_core_id(cpu) ((void)(cpu), 0) #endif #ifndef topology_thread_siblings #define topology_thread_siblings(cpu) cpumask_of_cpu(cpu) #endif #ifndef topology_core_siblings #define topology_core_siblings(cpu) cpumask_of_cpu(cpu) #endif #endif /* _LINUX_TOPOLOGY_H */ Loading
Documentation/cputopology.txt +9 −17 Original line number Diff line number Diff line Loading @@ -14,9 +14,8 @@ represent the thread siblings to cpu X in the same physical package; To implement it in an architecture-neutral way, a new source file, drivers/base/topology.c, is to export the 4 attributes. If one architecture wants to support this feature, it just needs to implement 4 defines, typically in file include/asm-XXX/topology.h. The 4 defines are: For an architecture to support this feature, it must define some of these macros in include/asm-XXX/topology.h: #define topology_physical_package_id(cpu) #define topology_core_id(cpu) #define topology_thread_siblings(cpu) Loading @@ -25,17 +24,10 @@ The 4 defines are: The type of **_id is int. The type of siblings is cpumask_t. To be consistent on all architectures, the 4 attributes should have default values if their values are unavailable. Below is the rule. 1) physical_package_id: If cpu has no physical package id, -1 is the default value. 2) core_id: If cpu doesn't support multi-core, its core id is 0. 3) thread_siblings: Just include itself, if the cpu doesn't support HT/multi-thread. 4) core_siblings: Just include itself, if the cpu doesn't support multi-core and HT/Multi-thread. So be careful when declaring the 4 defines in include/asm-XXX/topology.h. If an attribute isn't defined on an architecture, it won't be exported. To be consistent on all architectures, include/linux/topology.h provides default definitions for any of the above macros that are not defined by include/asm-XXX/topology.h: 1) physical_package_id: -1 2) core_id: 0 3) thread_siblings: just the given CPU 4) core_siblings: just the given CPU
drivers/base/topology.c +6 −26 Original line number Diff line number Diff line Loading @@ -93,47 +93,27 @@ static ssize_t show_##name##_list(struct sys_device *dev, char *buf) \ #define define_siblings_show_func(name) \ define_siblings_show_map(name); define_siblings_show_list(name) #ifdef topology_physical_package_id define_id_show_func(physical_package_id); define_one_ro(physical_package_id); #define ref_physical_package_id_attr &attr_physical_package_id.attr, #else #define ref_physical_package_id_attr #endif #ifdef topology_core_id define_id_show_func(core_id); define_one_ro(core_id); #define ref_core_id_attr &attr_core_id.attr, #else #define ref_core_id_attr #endif #ifdef topology_thread_siblings define_siblings_show_func(thread_siblings); define_one_ro(thread_siblings); define_one_ro(thread_siblings_list); #define ref_thread_siblings_attr \ &attr_thread_siblings.attr, &attr_thread_siblings_list.attr, #else #define ref_thread_siblings_attr #endif #ifdef topology_core_siblings define_siblings_show_func(core_siblings); define_one_ro(core_siblings); define_one_ro(core_siblings_list); #define ref_core_siblings_attr \ &attr_core_siblings.attr, &attr_core_siblings_list.attr, #else #define ref_core_siblings_attr #endif static struct attribute *default_attrs[] = { ref_physical_package_id_attr ref_core_id_attr ref_thread_siblings_attr ref_core_siblings_attr &attr_physical_package_id.attr, &attr_core_id.attr, &attr_thread_siblings.attr, &attr_thread_siblings_list.attr, &attr_core_siblings.attr, &attr_core_siblings_list.attr, NULL }; Loading
include/linux/topology.h +13 −0 Original line number Diff line number Diff line Loading @@ -179,4 +179,17 @@ void arch_update_cpu_topology(void); #endif #endif /* CONFIG_NUMA */ #ifndef topology_physical_package_id #define topology_physical_package_id(cpu) ((void)(cpu), -1) #endif #ifndef topology_core_id #define topology_core_id(cpu) ((void)(cpu), 0) #endif #ifndef topology_thread_siblings #define topology_thread_siblings(cpu) cpumask_of_cpu(cpu) #endif #ifndef topology_core_siblings #define topology_core_siblings(cpu) cpumask_of_cpu(cpu) #endif #endif /* _LINUX_TOPOLOGY_H */