PM: PM QOS update fix
authorMark Gross <markgross@thegnar.org>
Sun, 16 May 2010 22:21:03 +0000 (00:21 +0200)
committerRafael J. Wysocki <rjw@sisk.pl>
Sun, 16 May 2010 22:21:03 +0000 (00:21 +0200)
This update handles a use case where pm_qos update requests need to
silently fail if the update is being sent to a handle that is NULL.

The problem was that the original pm_qos silently fails when a request
update is passed to a parameter that has not been added to the list yet.
This update restores that behavior.

Signed-off-by: markgross <markgross@thegnar.org>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
kernel/pm_qos_params.c

index a1aea040eb5722810726da0fdc3c75c28a2f49b6..f42d3f737a3326a1a66751ba6589fb4d26b6c925 100644 (file)
@@ -252,19 +252,21 @@ void pm_qos_update_request(struct pm_qos_request_list *pm_qos_req,
        int pending_update = 0;
        s32 temp;
 
-       spin_lock_irqsave(&pm_qos_lock, flags);
-       if (new_value == PM_QOS_DEFAULT_VALUE)
-               temp = pm_qos_array[pm_qos_req->pm_qos_class]->default_value;
-       else
-               temp = new_value;
-
-       if (temp != pm_qos_req->value) {
-               pending_update = 1;
-               pm_qos_req->value = temp;
+       if (pm_qos_req) { /*guard against callers passing in null */
+               spin_lock_irqsave(&pm_qos_lock, flags);
+               if (new_value == PM_QOS_DEFAULT_VALUE)
+                       temp = pm_qos_array[pm_qos_req->pm_qos_class]->default_value;
+               else
+                       temp = new_value;
+
+               if (temp != pm_qos_req->value) {
+                       pending_update = 1;
+                       pm_qos_req->value = temp;
+               }
+               spin_unlock_irqrestore(&pm_qos_lock, flags);
+               if (pending_update)
+                       update_target(pm_qos_req->pm_qos_class);
        }
-       spin_unlock_irqrestore(&pm_qos_lock, flags);
-       if (pending_update)
-               update_target(pm_qos_req->pm_qos_class);
 }
 EXPORT_SYMBOL_GPL(pm_qos_update_request);