Commit 2d2843e6 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'pm-3.11-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull power management fix from Rafael Wysocki:
 "The removal of delayed_work_pending() checks from kernel/power/qos.c
  done in 3.9 introduced a deadlock in pm_qos_work_fn().

  Fix from Stephen Boyd"

* tag 'pm-3.11-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  PM / QoS: Fix workqueue deadlock when using pm_qos_update_request_timeout()
parents f43c6064 40fea92f
...@@ -296,6 +296,17 @@ int pm_qos_request_active(struct pm_qos_request *req) ...@@ -296,6 +296,17 @@ int pm_qos_request_active(struct pm_qos_request *req)
} }
EXPORT_SYMBOL_GPL(pm_qos_request_active); EXPORT_SYMBOL_GPL(pm_qos_request_active);
static void __pm_qos_update_request(struct pm_qos_request *req,
s32 new_value)
{
trace_pm_qos_update_request(req->pm_qos_class, new_value);
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_work_fn - the timeout handler of pm_qos_update_request_timeout * pm_qos_work_fn - the timeout handler of pm_qos_update_request_timeout
* @work: work struct for the delayed work (timeout) * @work: work struct for the delayed work (timeout)
...@@ -308,7 +319,7 @@ static void pm_qos_work_fn(struct work_struct *work) ...@@ -308,7 +319,7 @@ static void pm_qos_work_fn(struct work_struct *work)
struct pm_qos_request, struct pm_qos_request,
work); work);
pm_qos_update_request(req, PM_QOS_DEFAULT_VALUE); __pm_qos_update_request(req, PM_QOS_DEFAULT_VALUE);
} }
/** /**
...@@ -364,12 +375,7 @@ void pm_qos_update_request(struct pm_qos_request *req, ...@@ -364,12 +375,7 @@ void pm_qos_update_request(struct pm_qos_request *req,
} }
cancel_delayed_work_sync(&req->work); cancel_delayed_work_sync(&req->work);
__pm_qos_update_request(req, new_value);
trace_pm_qos_update_request(req->pm_qos_class, new_value);
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);
} }
EXPORT_SYMBOL_GPL(pm_qos_update_request); EXPORT_SYMBOL_GPL(pm_qos_update_request);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment