diff options
Diffstat (limited to 'kernel/pm_qos_params.c')
| -rw-r--r-- | kernel/pm_qos_params.c | 25 |
1 files changed, 9 insertions, 16 deletions
diff --git a/kernel/pm_qos_params.c b/kernel/pm_qos_params.c index da9c2dda6a4e..dfdec524d1b7 100644 --- a/kernel/pm_qos_params.c +++ b/kernel/pm_qos_params.c | |||
| @@ -43,7 +43,7 @@ | |||
| 43 | #include <linux/uaccess.h> | 43 | #include <linux/uaccess.h> |
| 44 | 44 | ||
| 45 | /* | 45 | /* |
| 46 | * locking rule: all changes to target_value or requirements or notifiers lists | 46 | * locking rule: all changes to requirements or notifiers lists |
| 47 | * or pm_qos_object list and pm_qos_objects need to happen with pm_qos_lock | 47 | * or pm_qos_object list and pm_qos_objects need to happen with pm_qos_lock |
| 48 | * held, taken with _irqsave. One lock to rule them all | 48 | * held, taken with _irqsave. One lock to rule them all |
| 49 | */ | 49 | */ |
| @@ -66,7 +66,7 @@ struct pm_qos_object { | |||
| 66 | struct miscdevice pm_qos_power_miscdev; | 66 | struct miscdevice pm_qos_power_miscdev; |
| 67 | char *name; | 67 | char *name; |
| 68 | s32 default_value; | 68 | s32 default_value; |
| 69 | s32 target_value; | 69 | atomic_t target_value; |
| 70 | s32 (*comparitor)(s32, s32); | 70 | s32 (*comparitor)(s32, s32); |
| 71 | }; | 71 | }; |
| 72 | 72 | ||
| @@ -77,7 +77,7 @@ static struct pm_qos_object cpu_dma_pm_qos = { | |||
| 77 | .notifiers = &cpu_dma_lat_notifier, | 77 | .notifiers = &cpu_dma_lat_notifier, |
| 78 | .name = "cpu_dma_latency", | 78 | .name = "cpu_dma_latency", |
| 79 | .default_value = 2000 * USEC_PER_SEC, | 79 | .default_value = 2000 * USEC_PER_SEC, |
| 80 | .target_value = 2000 * USEC_PER_SEC, | 80 | .target_value = ATOMIC_INIT(2000 * USEC_PER_SEC), |
| 81 | .comparitor = min_compare | 81 | .comparitor = min_compare |
| 82 | }; | 82 | }; |
| 83 | 83 | ||
| @@ -87,7 +87,7 @@ static struct pm_qos_object network_lat_pm_qos = { | |||
| 87 | .notifiers = &network_lat_notifier, | 87 | .notifiers = &network_lat_notifier, |
| 88 | .name = "network_latency", | 88 | .name = "network_latency", |
| 89 | .default_value = 2000 * USEC_PER_SEC, | 89 | .default_value = 2000 * USEC_PER_SEC, |
| 90 | .target_value = 2000 * USEC_PER_SEC, | 90 | .target_value = ATOMIC_INIT(2000 * USEC_PER_SEC), |
| 91 | .comparitor = min_compare | 91 | .comparitor = min_compare |
| 92 | }; | 92 | }; |
| 93 | 93 | ||
| @@ -99,7 +99,7 @@ static struct pm_qos_object network_throughput_pm_qos = { | |||
| 99 | .notifiers = &network_throughput_notifier, | 99 | .notifiers = &network_throughput_notifier, |
| 100 | .name = "network_throughput", | 100 | .name = "network_throughput", |
| 101 | .default_value = 0, | 101 | .default_value = 0, |
| 102 | .target_value = 0, | 102 | .target_value = ATOMIC_INIT(0), |
| 103 | .comparitor = max_compare | 103 | .comparitor = max_compare |
| 104 | }; | 104 | }; |
| 105 | 105 | ||
| @@ -150,11 +150,11 @@ static void update_target(int target) | |||
| 150 | extreme_value = pm_qos_array[target]->comparitor( | 150 | extreme_value = pm_qos_array[target]->comparitor( |
| 151 | extreme_value, node->value); | 151 | extreme_value, node->value); |
| 152 | } | 152 | } |
| 153 | if (pm_qos_array[target]->target_value != extreme_value) { | 153 | if (atomic_read(&pm_qos_array[target]->target_value) != extreme_value) { |
| 154 | call_notifier = 1; | 154 | call_notifier = 1; |
| 155 | pm_qos_array[target]->target_value = extreme_value; | 155 | atomic_set(&pm_qos_array[target]->target_value, extreme_value); |
| 156 | pr_debug(KERN_ERR "new target for qos %d is %d\n", target, | 156 | pr_debug(KERN_ERR "new target for qos %d is %d\n", target, |
| 157 | pm_qos_array[target]->target_value); | 157 | atomic_read(&pm_qos_array[target]->target_value)); |
| 158 | } | 158 | } |
| 159 | spin_unlock_irqrestore(&pm_qos_lock, flags); | 159 | spin_unlock_irqrestore(&pm_qos_lock, flags); |
| 160 | 160 | ||
| @@ -193,14 +193,7 @@ static int find_pm_qos_object_by_minor(int minor) | |||
| 193 | */ | 193 | */ |
| 194 | int pm_qos_requirement(int pm_qos_class) | 194 | int pm_qos_requirement(int pm_qos_class) |
| 195 | { | 195 | { |
| 196 | int ret_val; | 196 | return atomic_read(&pm_qos_array[pm_qos_class]->target_value); |
| 197 | unsigned long flags; | ||
| 198 | |||
| 199 | spin_lock_irqsave(&pm_qos_lock, flags); | ||
| 200 | ret_val = pm_qos_array[pm_qos_class]->target_value; | ||
| 201 | spin_unlock_irqrestore(&pm_qos_lock, flags); | ||
| 202 | |||
| 203 | return ret_val; | ||
| 204 | } | 197 | } |
| 205 | EXPORT_SYMBOL_GPL(pm_qos_requirement); | 198 | EXPORT_SYMBOL_GPL(pm_qos_requirement); |
| 206 | 199 | ||
