diff options
author | Ashok Raj <ashok.raj@intel.com> | 2005-10-30 17:59:49 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-10-30 20:37:14 -0500 |
commit | ad74557a49d1dea428fb0ad60e75a5aa37610e1d (patch) | |
tree | 4240115b224d3b3a323da8aa9325fc3bf4b73b50 | |
parent | 5d35704028d09a183448daceab5dcb94f21a3645 (diff) |
[PATCH] introduce get_cpu_sysdev() to retrieve a sysfs entry for a cpu.
Some modules creating sysfs entries under /sys/devices/system/cpu/cpuX/
need to know the parent sysfs entry to make devices under them. This will
just return the sysfs entry for a given cpu.
sysfs entries showing under each cpu sysfs can be easily created if such
entries can be created by registering a sysfs driver for cpuclass. The
issue is when the entry is created the CPU may not be online, hence we
would need to defer the creation until the online notification comes.
Current users: cache entries for Intel CPU's and cpufreq subsystem.
Signed-off-by: Ashok Raj <ashok.raj@intel.com>
Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Cc: Dave Jones <davej@codemonkey.org.uk>
Cc: Zwane Mwaikambo <zwane@holomorphy.com>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-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 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 | { |
diff --git a/include/linux/cpu.h b/include/linux/cpu.h index 86980c68234a..1f7b2c097503 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 |