[RAMEN9610-8149] PM QoS: add delayed_work_pending check
authorTaekki Kim <taekki.kim@samsung.com>
Tue, 25 Feb 2014 15:50:42 +0000 (00:50 +0900)
committerhskang <hs1218.kang@samsung.com>
Thu, 15 Nov 2018 04:58:18 +0000 (13:58 +0900)
This patch adds delayed_work_pending check before
cancel_delayed_work_sync(). If cancel_delayed_work_sync()
is called at same time, it can be occur race condition
about pending bit.

Signed-off-by: Taekki Kim <taekki.kim@samsung.com>
Signed-off-by: Sungjinn Chung <sungjinn.chung@samsung.com>
Conflicts:

kernel/power/qos.c

Change-Id: I245504e1934e18480564a3df9c05058cf49383ce

kernel/power/qos.c

index 0ff577d0fd13a2bc3db8532a761bac29bc9a87d1..697a8be7c562bfd79d23e3ad3a73b8e89be0039a 100644 (file)
@@ -895,7 +895,14 @@ void pm_qos_update_request(struct pm_qos_request *req,
                return;
        }
 
-       cancel_delayed_work_sync(&req->work);
+       if (delayed_work_pending(&req->work))
+               cancel_delayed_work_sync(&req->work);
+
+       if (new_value != req->node.prio)
+               pm_qos_update_target(
+                       pm_qos_array[req->pm_qos_class]->constraints,
+                       &req->node, PM_QOS_UPDATE_REQ, new_value);
+
        __pm_qos_update_request(req, new_value);
 }
 EXPORT_SYMBOL_GPL(pm_qos_update_request);
@@ -917,7 +924,8 @@ void pm_qos_update_request_timeout(struct pm_qos_request *req, s32 new_value,
                 "%s called for unknown object.", __func__))
                return;
 
-       cancel_delayed_work_sync(&req->work);
+       if (delayed_work_pending(&req->work))
+               cancel_delayed_work_sync(&req->work);
 
        trace_pm_qos_update_request_timeout(req->pm_qos_class,
                                            new_value, timeout_us);
@@ -948,7 +956,8 @@ void pm_qos_remove_request(struct pm_qos_request *req)
                return;
        }
 
-       cancel_delayed_work_sync(&req->work);
+       if (delayed_work_pending(&req->work))
+               cancel_delayed_work_sync(&req->work);
 
        trace_pm_qos_remove_request(req->pm_qos_class, PM_QOS_DEFAULT_VALUE);
        pm_qos_update_target(pm_qos_array[req->pm_qos_class]->constraints,