From 6a46549a2b03e7976c5140e845da3d3c7ba3e30c Mon Sep 17 00:00:00 2001 From: Taekki Kim Date: Wed, 26 Feb 2014 00:50:42 +0900 Subject: [PATCH] [RAMEN9610-8149] PM QoS: add delayed_work_pending check 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 Signed-off-by: Sungjinn Chung Conflicts: kernel/power/qos.c Change-Id: I245504e1934e18480564a3df9c05058cf49383ce --- kernel/power/qos.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/kernel/power/qos.c b/kernel/power/qos.c index 0ff577d0fd13..697a8be7c562 100644 --- a/kernel/power/qos.c +++ b/kernel/power/qos.c @@ -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, -- 2.20.1