diff options
Diffstat (limited to 'arch/powerpc/kernel/sysfs.c')
-rw-r--r-- | arch/powerpc/kernel/sysfs.c | 76 |
1 files changed, 70 insertions, 6 deletions
diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c index d45a168bdaca..22123a0d5416 100644 --- a/arch/powerpc/kernel/sysfs.c +++ b/arch/powerpc/kernel/sysfs.c | |||
@@ -200,10 +200,9 @@ static void register_cpu_online(unsigned int cpu) | |||
200 | struct cpu *c = &per_cpu(cpu_devices, cpu); | 200 | struct cpu *c = &per_cpu(cpu_devices, cpu); |
201 | struct sys_device *s = &c->sysdev; | 201 | struct sys_device *s = &c->sysdev; |
202 | 202 | ||
203 | #ifndef CONFIG_PPC_ISERIES | 203 | if (!firmware_has_feature(FW_FEATURE_ISERIES) && |
204 | if (cpu_has_feature(CPU_FTR_SMT)) | 204 | cpu_has_feature(CPU_FTR_SMT)) |
205 | sysdev_create_file(s, &attr_smt_snooze_delay); | 205 | sysdev_create_file(s, &attr_smt_snooze_delay); |
206 | #endif | ||
207 | 206 | ||
208 | /* PMC stuff */ | 207 | /* PMC stuff */ |
209 | 208 | ||
@@ -242,10 +241,9 @@ static void unregister_cpu_online(unsigned int cpu) | |||
242 | 241 | ||
243 | BUG_ON(c->no_control); | 242 | BUG_ON(c->no_control); |
244 | 243 | ||
245 | #ifndef CONFIG_PPC_ISERIES | 244 | if (!firmware_has_feature(FW_FEATURE_ISERIES) && |
246 | if (cpu_has_feature(CPU_FTR_SMT)) | 245 | cpu_has_feature(CPU_FTR_SMT)) |
247 | sysdev_remove_file(s, &attr_smt_snooze_delay); | 246 | sysdev_remove_file(s, &attr_smt_snooze_delay); |
248 | #endif | ||
249 | 247 | ||
250 | /* PMC stuff */ | 248 | /* PMC stuff */ |
251 | 249 | ||
@@ -299,6 +297,72 @@ static struct notifier_block __cpuinitdata sysfs_cpu_nb = { | |||
299 | .notifier_call = sysfs_cpu_notify, | 297 | .notifier_call = sysfs_cpu_notify, |
300 | }; | 298 | }; |
301 | 299 | ||
300 | static DEFINE_MUTEX(cpu_mutex); | ||
301 | |||
302 | int cpu_add_sysdev_attr(struct sysdev_attribute *attr) | ||
303 | { | ||
304 | int cpu; | ||
305 | |||
306 | mutex_lock(&cpu_mutex); | ||
307 | |||
308 | for_each_possible_cpu(cpu) { | ||
309 | sysdev_create_file(get_cpu_sysdev(cpu), attr); | ||
310 | } | ||
311 | |||
312 | mutex_unlock(&cpu_mutex); | ||
313 | return 0; | ||
314 | } | ||
315 | EXPORT_SYMBOL_GPL(cpu_add_sysdev_attr); | ||
316 | |||
317 | int cpu_add_sysdev_attr_group(struct attribute_group *attrs) | ||
318 | { | ||
319 | int cpu; | ||
320 | struct sys_device *sysdev; | ||
321 | |||
322 | mutex_lock(&cpu_mutex); | ||
323 | |||
324 | for_each_possible_cpu(cpu) { | ||
325 | sysdev = get_cpu_sysdev(cpu); | ||
326 | sysfs_create_group(&sysdev->kobj, attrs); | ||
327 | } | ||
328 | |||
329 | mutex_unlock(&cpu_mutex); | ||
330 | return 0; | ||
331 | } | ||
332 | EXPORT_SYMBOL_GPL(cpu_add_sysdev_attr_group); | ||
333 | |||
334 | |||
335 | void cpu_remove_sysdev_attr(struct sysdev_attribute *attr) | ||
336 | { | ||
337 | int cpu; | ||
338 | |||
339 | mutex_lock(&cpu_mutex); | ||
340 | |||
341 | for_each_possible_cpu(cpu) { | ||
342 | sysdev_remove_file(get_cpu_sysdev(cpu), attr); | ||
343 | } | ||
344 | |||
345 | mutex_unlock(&cpu_mutex); | ||
346 | } | ||
347 | EXPORT_SYMBOL_GPL(cpu_remove_sysdev_attr); | ||
348 | |||
349 | void cpu_remove_sysdev_attr_group(struct attribute_group *attrs) | ||
350 | { | ||
351 | int cpu; | ||
352 | struct sys_device *sysdev; | ||
353 | |||
354 | mutex_lock(&cpu_mutex); | ||
355 | |||
356 | for_each_possible_cpu(cpu) { | ||
357 | sysdev = get_cpu_sysdev(cpu); | ||
358 | sysfs_remove_group(&sysdev->kobj, attrs); | ||
359 | } | ||
360 | |||
361 | mutex_unlock(&cpu_mutex); | ||
362 | } | ||
363 | EXPORT_SYMBOL_GPL(cpu_remove_sysdev_attr_group); | ||
364 | |||
365 | |||
302 | /* NUMA stuff */ | 366 | /* NUMA stuff */ |
303 | 367 | ||
304 | #ifdef CONFIG_NUMA | 368 | #ifdef CONFIG_NUMA |