-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[PATCH] Export cpu topology in sysfs
The patch implements cpu topology exportation by sysfs. Items (attributes) are similar to /proc/cpuinfo. 1) /sys/devices/system/cpu/cpuX/topology/physical_package_id: represent the physical package id of cpu X; 2) /sys/devices/system/cpu/cpuX/topology/core_id: represent the cpu core id to cpu X; 3) /sys/devices/system/cpu/cpuX/topology/thread_siblings: represent the thread siblings to cpu X in the same core; 4) /sys/devices/system/cpu/cpuX/topology/core_siblings: represent the thread siblings to cpu X in the same physical package; To implement it in an architecture-neutral way, a new source file, driver/base/topology.c, is to export the 5 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: #define topology_physical_package_id(cpu) #define topology_core_id(cpu) #define topology_thread_siblings(cpu) #define topology_core_siblings(cpu) The type of **_id is int. The type of siblings is cpumask_t. To be consistent on all architectures, the 4 attributes should have deafult 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. Thank Nathan, Greg, Andi, Paul and Venki. The patch provides defines for i386/x86_64/ia64. Signed-off-by: Zhang, Yanmin <yanmin.zhang@intel.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Cc: Greg KH <greg@kroah.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
- Loading branch information
Zhang, Yanmin
authored and
Linus Torvalds
committed
Feb 3, 2006
1 parent
66ac5a2
commit 69dcc99
Showing
7 changed files
with
225 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
|
||
Export cpu topology info by sysfs. Items (attributes) are similar | ||
to /proc/cpuinfo. | ||
|
||
1) /sys/devices/system/cpu/cpuX/topology/physical_package_id: | ||
represent the physical package id of cpu X; | ||
2) /sys/devices/system/cpu/cpuX/topology/core_id: | ||
represent the cpu core id to cpu X; | ||
3) /sys/devices/system/cpu/cpuX/topology/thread_siblings: | ||
represent the thread siblings to cpu X in the same core; | ||
4) /sys/devices/system/cpu/cpuX/topology/core_siblings: | ||
represent the thread siblings to cpu X in the same physical package; | ||
|
||
To implement it in an architecture-neutral way, a new source file, | ||
driver/base/topology.c, is to export the 5 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: | ||
#define topology_physical_package_id(cpu) | ||
#define topology_core_id(cpu) | ||
#define topology_thread_siblings(cpu) | ||
#define topology_core_siblings(cpu) | ||
|
||
The type of **_id is int. | ||
The type of siblings is cpumask_t. | ||
|
||
To be consistent on all architectures, the 4 attributes should have | ||
deafult 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. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,148 @@ | ||
/* | ||
* driver/base/topology.c - Populate sysfs with cpu topology information | ||
* | ||
* Written by: Zhang Yanmin, Intel Corporation | ||
* | ||
* Copyright (C) 2006, Intel Corp. | ||
* | ||
* All rights reserved. | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, but | ||
* WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | ||
* NON INFRINGEMENT. See the GNU General Public License for more | ||
* details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
* | ||
*/ | ||
#include <linux/sysdev.h> | ||
#include <linux/init.h> | ||
#include <linux/mm.h> | ||
#include <linux/cpu.h> | ||
#include <linux/module.h> | ||
#include <linux/topology.h> | ||
|
||
#define define_one_ro(_name) \ | ||
static SYSDEV_ATTR(_name, 0444, show_##_name, NULL) | ||
|
||
#define define_id_show_func(name) \ | ||
static ssize_t show_##name(struct sys_device *dev, char *buf) \ | ||
{ \ | ||
unsigned int cpu = dev->id; \ | ||
return sprintf(buf, "%d\n", topology_##name(cpu)); \ | ||
} | ||
|
||
#define define_siblings_show_func(name) \ | ||
static ssize_t show_##name(struct sys_device *dev, char *buf) \ | ||
{ \ | ||
ssize_t len = -1; \ | ||
unsigned int cpu = dev->id; \ | ||
len = cpumask_scnprintf(buf, NR_CPUS+1, topology_##name(cpu)); \ | ||
return (len + sprintf(buf + len, "\n")); \ | ||
} | ||
|
||
#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 ref_thread_siblings_attr &attr_thread_siblings.attr, | ||
#else | ||
#define ref_thread_siblings_attr | ||
#endif | ||
|
||
#ifdef topology_core_siblings | ||
define_siblings_show_func(core_siblings); | ||
define_one_ro(core_siblings); | ||
#define ref_core_siblings_attr &attr_core_siblings.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 | ||
NULL | ||
}; | ||
|
||
static struct attribute_group topology_attr_group = { | ||
.attrs = default_attrs, | ||
.name = "topology" | ||
}; | ||
|
||
/* Add/Remove cpu_topology interface for CPU device */ | ||
static int __cpuinit topology_add_dev(struct sys_device * sys_dev) | ||
{ | ||
sysfs_create_group(&sys_dev->kobj, &topology_attr_group); | ||
return 0; | ||
} | ||
|
||
static int __cpuinit topology_remove_dev(struct sys_device * sys_dev) | ||
{ | ||
sysfs_remove_group(&sys_dev->kobj, &topology_attr_group); | ||
return 0; | ||
} | ||
|
||
static int __cpuinit topology_cpu_callback(struct notifier_block *nfb, | ||
unsigned long action, void *hcpu) | ||
{ | ||
unsigned int cpu = (unsigned long)hcpu; | ||
struct sys_device *sys_dev; | ||
|
||
sys_dev = get_cpu_sysdev(cpu); | ||
switch (action) { | ||
case CPU_ONLINE: | ||
topology_add_dev(sys_dev); | ||
break; | ||
case CPU_DEAD: | ||
topology_remove_dev(sys_dev); | ||
break; | ||
} | ||
return NOTIFY_OK; | ||
} | ||
|
||
static struct notifier_block topology_cpu_notifier = | ||
{ | ||
.notifier_call = topology_cpu_callback, | ||
}; | ||
|
||
static int __cpuinit topology_sysfs_init(void) | ||
{ | ||
int i; | ||
|
||
for_each_online_cpu(i) { | ||
topology_cpu_callback(&topology_cpu_notifier, CPU_ONLINE, | ||
(void *)(long)i); | ||
} | ||
|
||
register_cpu_notifier(&topology_cpu_notifier); | ||
|
||
return 0; | ||
} | ||
|
||
device_initcall(topology_sysfs_init); | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters