|
@@ -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());
|