diff options
-rw-r--r-- | drivers/base/cpu.c | 16 | ||||
-rw-r--r-- | include/linux/cpu.h | 1 |
2 files changed, 15 insertions, 2 deletions
diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c index 081c927b1ed..a95844790f7 100644 --- a/drivers/base/cpu.c +++ b/drivers/base/cpu.c | |||
@@ -16,6 +16,8 @@ struct sysdev_class cpu_sysdev_class = { | |||
16 | }; | 16 | }; |
17 | EXPORT_SYMBOL(cpu_sysdev_class); | 17 | EXPORT_SYMBOL(cpu_sysdev_class); |
18 | 18 | ||
19 | static struct sys_device *cpu_sys_devices[NR_CPUS]; | ||
20 | |||
19 | #ifdef CONFIG_HOTPLUG_CPU | 21 | #ifdef CONFIG_HOTPLUG_CPU |
20 | int __attribute__((weak)) smp_prepare_cpu (int cpu) | 22 | int __attribute__((weak)) smp_prepare_cpu (int cpu) |
21 | { | 23 | { |
@@ -64,6 +66,7 @@ static void __devinit register_cpu_control(struct cpu *cpu) | |||
64 | } | 66 | } |
65 | void unregister_cpu(struct cpu *cpu, struct node *root) | 67 | void unregister_cpu(struct cpu *cpu, struct node *root) |
66 | { | 68 | { |
69 | int logical_cpu = cpu->sysdev.id; | ||
67 | 70 | ||
68 | if (root) | 71 | if (root) |
69 | sysfs_remove_link(&root->sysdev.kobj, | 72 | sysfs_remove_link(&root->sysdev.kobj, |
@@ -71,7 +74,7 @@ void unregister_cpu(struct cpu *cpu, struct node *root) | |||
71 | sysdev_remove_file(&cpu->sysdev, &attr_online); | 74 | sysdev_remove_file(&cpu->sysdev, &attr_online); |
72 | 75 | ||
73 | sysdev_unregister(&cpu->sysdev); | 76 | sysdev_unregister(&cpu->sysdev); |
74 | 77 | cpu_sys_devices[logical_cpu] = NULL; | |
75 | return; | 78 | return; |
76 | } | 79 | } |
77 | #else /* ... !CONFIG_HOTPLUG_CPU */ | 80 | #else /* ... !CONFIG_HOTPLUG_CPU */ |
@@ -103,10 +106,19 @@ int __devinit register_cpu(struct cpu *cpu, int num, struct node *root) | |||
103 | kobject_name(&cpu->sysdev.kobj)); | 106 | kobject_name(&cpu->sysdev.kobj)); |
104 | if (!error && !cpu->no_control) | 107 | if (!error && !cpu->no_control) |
105 | register_cpu_control(cpu); | 108 | register_cpu_control(cpu); |
109 | if (!error) | ||
110 | cpu_sys_devices[num] = &cpu->sysdev; | ||
106 | return error; | 111 | return error; |
107 | } | 112 | } |
108 | 113 | ||
109 | 114 | struct sys_device *get_cpu_sysdev(int cpu) | |
115 | { | ||
116 | if (cpu < NR_CPUS) | ||
117 | return cpu_sys_devices[cpu]; | ||
118 | else | ||
119 | return NULL; | ||
120 | } | ||
121 | EXPORT_SYMBOL_GPL(get_cpu_sysdev); | ||
110 | 122 | ||
111 | int __init cpu_dev_init(void) | 123 | int __init cpu_dev_init(void) |
112 | { | 124 | { |
diff --git a/include/linux/cpu.h b/include/linux/cpu.h index 86980c68234..1f7b2c09750 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h | |||
@@ -32,6 +32,7 @@ struct cpu { | |||
32 | }; | 32 | }; |
33 | 33 | ||
34 | extern int register_cpu(struct cpu *, int, struct node *); | 34 | extern int register_cpu(struct cpu *, int, struct node *); |
35 | extern struct sys_device *get_cpu_sysdev(int cpu); | ||
35 | #ifdef CONFIG_HOTPLUG_CPU | 36 | #ifdef CONFIG_HOTPLUG_CPU |
36 | extern void unregister_cpu(struct cpu *, struct node *); | 37 | extern void unregister_cpu(struct cpu *, struct node *); |
37 | #endif | 38 | #endif |