diff options
Diffstat (limited to 'drivers/base/cpu.c')
| -rw-r--r-- | drivers/base/cpu.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c index 081c927b1ed8..a95844790f7b 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 | { |
