git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git]
/
arch
/
powerpc
/
kernel
/
sysfs.c
diff --git
a/arch/powerpc/kernel/sysfs.c
b/arch/powerpc/kernel/sysfs.c
index
fec228c
..
0f0c3a9
100644
(file)
--- a/
arch/powerpc/kernel/sysfs.c
+++ b/
arch/powerpc/kernel/sysfs.c
@@
-1,3
+1,4
@@
+#include <linux/config.h>
#include <linux/sysdev.h>
#include <linux/cpu.h>
#include <linux/smp.h>
#include <linux/sysdev.h>
#include <linux/cpu.h>
#include <linux/smp.h>
@@
-64,20
+65,20
@@
static int __init smt_setup(void)
unsigned int cpu;
if (!cpu_has_feature(CPU_FTR_SMT))
unsigned int cpu;
if (!cpu_has_feature(CPU_FTR_SMT))
- return
-ENODEV
;
+ return
1
;
options = find_path_device("/options");
if (!options)
options = find_path_device("/options");
if (!options)
- return
-ENODEV
;
+ return
1
;
val = (unsigned int *)get_property(options, "ibm,smt-snooze-delay",
NULL);
if (!smt_snooze_cmdline && val) {
val = (unsigned int *)get_property(options, "ibm,smt-snooze-delay",
NULL);
if (!smt_snooze_cmdline && val) {
- for_each_
possible_
cpu(cpu)
+ for_each_cpu(cpu)
per_cpu(smt_snooze_delay, cpu) = *val;
}
per_cpu(smt_snooze_delay, cpu) = *val;
}
- return
0
;
+ return
1
;
}
__initcall(smt_setup);
}
__initcall(smt_setup);
@@
-92,7
+93,7
@@
static int __init setup_smt_snooze_delay(char *str)
smt_snooze_cmdline = 1;
if (get_option(&str, &snooze)) {
smt_snooze_cmdline = 1;
if (get_option(&str, &snooze)) {
- for_each_
possible_
cpu(cpu)
+ for_each_cpu(cpu)
per_cpu(smt_snooze_delay, cpu) = snooze;
}
per_cpu(smt_snooze_delay, cpu) = snooze;
}
@@
-278,7
+279,7
@@
static void unregister_cpu_online(unsigned int cpu)
}
#endif /* CONFIG_HOTPLUG_CPU */
}
#endif /* CONFIG_HOTPLUG_CPU */
-static int __
cpu
init sysfs_cpu_notify(struct notifier_block *self,
+static int __
dev
init sysfs_cpu_notify(struct notifier_block *self,
unsigned long action, void *hcpu)
{
unsigned int cpu = (unsigned int)(long)hcpu;
unsigned long action, void *hcpu)
{
unsigned int cpu = (unsigned int)(long)hcpu;
@@
-296,45
+297,38
@@
static int __cpuinit sysfs_cpu_notify(struct notifier_block *self,
return NOTIFY_OK;
}
return NOTIFY_OK;
}
-static struct notifier_block __
cpu
initdata sysfs_cpu_nb = {
+static struct notifier_block __
dev
initdata sysfs_cpu_nb = {
.notifier_call = sysfs_cpu_notify,
};
/* NUMA stuff */
#ifdef CONFIG_NUMA
.notifier_call = sysfs_cpu_notify,
};
/* NUMA stuff */
#ifdef CONFIG_NUMA
+static struct node node_devices[MAX_NUMNODES];
+
static void register_nodes(void)
{
int i;
static void register_nodes(void)
{
int i;
- for (i = 0; i < MAX_NUMNODES; i++)
- register_one_node(i);
-}
+ for (i = 0; i < MAX_NUMNODES; i++) {
+ if (node_online(i)) {
+ int p_node = parent_node(i);
+ struct node *parent = NULL;
-int sysfs_add_device_to_node(struct sys_device *dev, int nid)
-{
- struct node *node = &node_devices[nid];
- return sysfs_create_link(&node->sysdev.kobj, &dev->kobj,
- kobject_name(&dev->kobj));
-}
+ if (p_node != i)
+ parent = &node_devices[p_node];
-void sysfs_remove_device_from_node(struct sys_device *dev, int nid)
-{
- struct node *node = &node_devices[nid];
- sysfs_remove_link(&node->sysdev.kobj, kobject_name(&dev->kobj));
+ register_node(&node_devices[i], i, parent);
+ }
+ }
}
}
-
#else
static void register_nodes(void)
{
return;
}
#else
static void register_nodes(void)
{
return;
}
-
#endif
#endif
-EXPORT_SYMBOL_GPL(sysfs_add_device_to_node);
-EXPORT_SYMBOL_GPL(sysfs_remove_device_from_node);
-
/* Only valid if CPU is present. */
static ssize_t show_physical_id(struct sys_device *dev, char *buf)
{
/* Only valid if CPU is present. */
static ssize_t show_physical_id(struct sys_device *dev, char *buf)
{
@@
-347,13
+341,23
@@
static SYSDEV_ATTR(physical_id, 0444, show_physical_id, NULL);
static int __init topology_init(void)
{
int cpu;
static int __init topology_init(void)
{
int cpu;
+ struct node *parent = NULL;
register_nodes();
register_nodes();
+
register_cpu_notifier(&sysfs_cpu_nb);
register_cpu_notifier(&sysfs_cpu_nb);
- for_each_
possible_
cpu(cpu) {
+ for_each_cpu(cpu) {
struct cpu *c = &per_cpu(cpu_devices, cpu);
struct cpu *c = &per_cpu(cpu_devices, cpu);
+#ifdef CONFIG_NUMA
+ /* The node to which a cpu belongs can't be known
+ * until the cpu is made present.
+ */
+ parent = NULL;
+ if (cpu_present(cpu))
+ parent = &node_devices[cpu_to_node(cpu)];
+#endif
/*
* For now, we just see if the system supports making
* the RTAS calls for CPU hotplug. But, there may be a
/*
* For now, we just see if the system supports making
* the RTAS calls for CPU hotplug. But, there may be a
@@
-365,7
+369,7
@@
static int __init topology_init(void)
c->no_control = 1;
if (cpu_online(cpu) || (c->no_control == 0)) {
c->no_control = 1;
if (cpu_online(cpu) || (c->no_control == 0)) {
- register_cpu(c, cpu);
+ register_cpu(c, cpu
, parent
);
sysdev_create_file(&c->sysdev, &attr_physical_id);
}
sysdev_create_file(&c->sysdev, &attr_physical_id);
}