Skip to content

Commit 2d2843e

Browse files
committed
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()
2 parents f43c606 + 40fea92 commit 2d2843e

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

kernel/power/qos.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,17 @@ int pm_qos_request_active(struct pm_qos_request *req)
296296
}
297297
EXPORT_SYMBOL_GPL(pm_qos_request_active);
298298

299+
static void __pm_qos_update_request(struct pm_qos_request *req,
300+
s32 new_value)
301+
{
302+
trace_pm_qos_update_request(req->pm_qos_class, new_value);
303+
304+
if (new_value != req->node.prio)
305+
pm_qos_update_target(
306+
pm_qos_array[req->pm_qos_class]->constraints,
307+
&req->node, PM_QOS_UPDATE_REQ, new_value);
308+
}
309+
299310
/**
300311
* pm_qos_work_fn - the timeout handler of pm_qos_update_request_timeout
301312
* @work: work struct for the delayed work (timeout)
@@ -308,7 +319,7 @@ static void pm_qos_work_fn(struct work_struct *work)
308319
struct pm_qos_request,
309320
work);
310321

311-
pm_qos_update_request(req, PM_QOS_DEFAULT_VALUE);
322+
__pm_qos_update_request(req, PM_QOS_DEFAULT_VALUE);
312323
}
313324

314325
/**
@@ -364,12 +375,7 @@ void pm_qos_update_request(struct pm_qos_request *req,
364375
}
365376

366377
cancel_delayed_work_sync(&req->work);
367-
368-
trace_pm_qos_update_request(req->pm_qos_class, new_value);
369-
if (new_value != req->node.prio)
370-
pm_qos_update_target(
371-
pm_qos_array[req->pm_qos_class]->constraints,
372-
&req->node, PM_QOS_UPDATE_REQ, new_value);
378+
__pm_qos_update_request(req, new_value);
373379
}
374380
EXPORT_SYMBOL_GPL(pm_qos_update_request);
375381

0 commit comments

Comments
 (0)