suspend-to-idle: Prevent RCU from complaining about tick_freeze()
Put tick_freeze() under RCU_NONIDLE() to prevent RCU from complaining about suspicious RCU usage in idle by trace_suspend_resume() called from there. While at it, fix a comment related to another usage of RCU_NONIDLE() in enter_freeze_proper(). Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
This commit is contained in:
parent
d770e558e2
commit
ae0afb4f5d
@ -112,7 +112,12 @@ int cpuidle_find_deepest_state(struct cpuidle_driver *drv,
|
|||||||
static void enter_freeze_proper(struct cpuidle_driver *drv,
|
static void enter_freeze_proper(struct cpuidle_driver *drv,
|
||||||
struct cpuidle_device *dev, int index)
|
struct cpuidle_device *dev, int index)
|
||||||
{
|
{
|
||||||
tick_freeze();
|
/*
|
||||||
|
* trace_suspend_resume() called by tick_freeze() for the last CPU
|
||||||
|
* executing it contains RCU usage regarded as invalid in the idle
|
||||||
|
* context, so tell RCU about that.
|
||||||
|
*/
|
||||||
|
RCU_NONIDLE(tick_freeze());
|
||||||
/*
|
/*
|
||||||
* The state used here cannot be a "coupled" one, because the "coupled"
|
* The state used here cannot be a "coupled" one, because the "coupled"
|
||||||
* cpuidle mechanism enables interrupts and doing that with timekeeping
|
* cpuidle mechanism enables interrupts and doing that with timekeeping
|
||||||
@ -122,7 +127,7 @@ static void enter_freeze_proper(struct cpuidle_driver *drv,
|
|||||||
WARN_ON(!irqs_disabled());
|
WARN_ON(!irqs_disabled());
|
||||||
/*
|
/*
|
||||||
* timekeeping_resume() that will be called by tick_unfreeze() for the
|
* timekeeping_resume() that will be called by tick_unfreeze() for the
|
||||||
* last CPU executing it calls functions containing RCU read-side
|
* first CPU executing it calls functions containing RCU read-side
|
||||||
* critical sections, so tell RCU about that.
|
* critical sections, so tell RCU about that.
|
||||||
*/
|
*/
|
||||||
RCU_NONIDLE(tick_unfreeze());
|
RCU_NONIDLE(tick_unfreeze());
|
||||||
|
Loading…
Reference in New Issue
Block a user