cpuidle_register_driver() sets cpuidle_curr_driver cpuidle_unregister_driver() clears cpuidle_curr_driver We should't expose cpuidle_curr_driver to potential modification except via these interfaces. So make it static and create cpuidle_get_driver() to observe it.
Unified · Split
| @@ -156,7 +156,7 @@ int cpuidle_enable_device(struct cpuidle_device *dev) · 155 unmodified lines | ||
| 156 | 156 | |
| 157 | 157 | if (dev->enabled) |
| 158 | 158 | return 0; |
| 159 | − if (!cpuidle_curr_driver || !cpuidle_curr_governor) | |
| 159 | + if (!cpuidle_get_driver() || !cpuidle_curr_governor) | |
| 160 | 160 | return -EIO; |
| 161 | 161 | if (!dev->state_count) |
| 162 | 162 | return -EINVAL; |
| @@ -207,7 +207,7 @@ void cpuidle_disable_device(struct cpuidle_device *dev) · 44 unmodified lines | ||
| 207 | 207 | { |
| 208 | 208 | if (!dev->enabled) |
| 209 | 209 | return; |
| 210 | − if (!cpuidle_curr_driver || !cpuidle_curr_governor) | |
| 210 | + if (!cpuidle_get_driver() || !cpuidle_curr_governor) | |
| 211 | 211 | return; |
| 212 | 212 | |
| 213 | 213 | dev->enabled = 0; |
| @@ -271,10 +271,11 @@ static int __cpuidle_register_device(struct cpuidle_device *dev) · 57 unmodified lines | ||
| 271 | 271 | { |
| 272 | 272 | int ret; |
| 273 | 273 | struct sys_device *sys_dev = get_cpu_sysdev((unsigned long)dev->cpu); |
| 274 | + struct cpuidle_driver *cpuidle_driver = cpuidle_get_driver(); | |
| 274 | 275 | |
| 275 | 276 | if (!sys_dev) |
| 276 | 277 | return -EINVAL; |
| 277 | − if (!try_module_get(cpuidle_curr_driver->owner)) | |
| 278 | + if (!try_module_get(cpuidle_driver->owner)) | |
| 278 | 279 | return -EINVAL; |
| 279 | 280 | |
| 280 | 281 | init_completion(&dev->kobj_unregister); |
| @@ -284,7 +285,7 @@ static int __cpuidle_register_device(struct cpuidle_device *dev) · 3 unmodified lines | ||
| 284 | 285 | per_cpu(cpuidle_devices, dev->cpu) = dev; |
| 285 | 286 | list_add(&dev->device_list, &cpuidle_detected_devices); |
| 286 | 287 | if ((ret = cpuidle_add_sysfs(sys_dev))) { |
| 287 | − module_put(cpuidle_curr_driver->owner); | |
| 288 | + module_put(cpuidle_driver->owner); | |
| 288 | 289 | return ret; |
| 289 | 290 | } |
| 290 | 291 | |
| @@ -325,6 +326,7 @@ EXPORT_SYMBOL_GPL(cpuidle_register_device); · 34 unmodified lines | ||
| 325 | 326 | void cpuidle_unregister_device(struct cpuidle_device *dev) |
| 326 | 327 | { |
| 327 | 328 | struct sys_device *sys_dev = get_cpu_sysdev((unsigned long)dev->cpu); |
| 329 | + struct cpuidle_driver *cpuidle_driver = cpuidle_get_driver(); | |
| 328 | 330 | |
| 329 | 331 | if (dev->registered == 0) |
| 330 | 332 | return; |
| @@ -340,7 +342,7 @@ void cpuidle_unregister_device(struct cpuidle_device *dev) · 9 unmodified lines | ||
| 340 | 342 | |
| 341 | 343 | cpuidle_resume_and_unlock(); |
| 342 | 344 | |
| 343 | − module_put(cpuidle_curr_driver->owner); | |
| 345 | + module_put(cpuidle_driver->owner); | |
| 344 | 346 | } |
| 345 | 347 | |
| 346 | 348 | EXPORT_SYMBOL_GPL(cpuidle_unregister_device); |
| @@ -9,7 +9,6 @@ · 8 unmodified lines | ||
| 9 | 9 | |
| 10 | 10 | /* For internal use only */ |
| 11 | 11 | extern struct cpuidle_governor *cpuidle_curr_governor; |
| 12 | −extern struct cpuidle_driver *cpuidle_curr_driver; | |
| 13 | 12 | extern struct list_head cpuidle_governors; |
| 14 | 13 | extern struct list_head cpuidle_detected_devices; |
| 15 | 14 | extern struct mutex cpuidle_lock; |
| @@ -14,7 +14,7 @@ · 13 unmodified lines | ||
| 14 | 14 | |
| 15 | 15 | #include "cpuidle.h" |
| 16 | 16 | |
| 17 | −struct cpuidle_driver *cpuidle_curr_driver; | |
| 17 | +static struct cpuidle_driver *cpuidle_curr_driver; | |
| 18 | 18 | DEFINE_SPINLOCK(cpuidle_driver_lock); |
| 19 | 19 | |
| 20 | 20 | /** |
| @@ -39,6 +39,15 @@ int cpuidle_register_driver(struct cpuidle_driver *drv) · 18 unmodified lines | ||
| 39 | 39 | |
| 40 | 40 | EXPORT_SYMBOL_GPL(cpuidle_register_driver); |
| 41 | 41 | |
| 42 | +/** | |
| 43 | + * cpuidle_get_driver - return the current driver | |
| 44 | + */ | |
| 45 | +struct cpuidle_driver *cpuidle_get_driver(void) | |
| 46 | +{ | |
| 47 | + return cpuidle_curr_driver; | |
| 48 | +} | |
| 49 | +EXPORT_SYMBOL_GPL(cpuidle_get_driver); | |
| 50 | + | |
| 42 | 51 | /** |
| 43 | 52 | * cpuidle_unregister_driver - unregisters a driver |
| 44 | 53 | * @drv: the driver |
| @@ -47,10 +47,11 @@ static ssize_t show_current_driver(struct sysdev_class *class, · 46 unmodified lines | ||
| 47 | 47 | char *buf) |
| 48 | 48 | { |
| 49 | 49 | ssize_t ret; |
| 50 | + struct cpuidle_driver *cpuidle_driver = cpuidle_get_driver(); | |
| 50 | 51 | |
| 51 | 52 | spin_lock(&cpuidle_driver_lock); |
| 52 | − if (cpuidle_curr_driver) | |
| 53 | − ret = sprintf(buf, "%s\n", cpuidle_curr_driver->name); | |
| 53 | + if (cpuidle_driver) | |
| 54 | + ret = sprintf(buf, "%s\n", cpuidle_driver->name); | |
| 54 | 55 | else |
| 55 | 56 | ret = sprintf(buf, "none\n"); |
| 56 | 57 | spin_unlock(&cpuidle_driver_lock); |
| @@ -125,6 +125,7 @@ struct cpuidle_driver { · 124 unmodified lines | ||
| 125 | 125 | #ifdef CONFIG_CPU_IDLE |
| 126 | 126 | |
| 127 | 127 | extern int cpuidle_register_driver(struct cpuidle_driver *drv); |
| 128 | +struct cpuidle_driver *cpuidle_get_driver(void); | |
| 128 | 129 | extern void cpuidle_unregister_driver(struct cpuidle_driver *drv); |
| 129 | 130 | extern int cpuidle_register_device(struct cpuidle_device *dev); |
| 130 | 131 | extern void cpuidle_unregister_device(struct cpuidle_device *dev); |
| @@ -138,6 +139,7 @@ extern void cpuidle_disable_device(struct cpuidle_device *dev); · 7 unmodified lines | ||
| 138 | 139 | |
| 139 | 140 | static inline int cpuidle_register_driver(struct cpuidle_driver *drv) |
| 140 | 141 | {return -ENODEV; } |
| 142 | +static inline struct cpuidle_driver *cpuidle_get_driver(void) {return NULL; } | |
| 141 | 143 | static inline void cpuidle_unregister_driver(struct cpuidle_driver *drv) { } |
| 142 | 144 | static inline int cpuidle_register_device(struct cpuidle_device *dev) |
| 143 | 145 | {return -ENODEV; } |