|
@@ -737,8 +737,19 @@ static void cpu_pm_pmu_setup(struct arm_pmu *armpmu, unsigned long cmd)
|
|
break;
|
|
break;
|
|
case CPU_PM_EXIT:
|
|
case CPU_PM_EXIT:
|
|
case CPU_PM_ENTER_FAILED:
|
|
case CPU_PM_ENTER_FAILED:
|
|
- /* Restore and enable the counter */
|
|
|
|
- armpmu_start(event, PERF_EF_RELOAD);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Restore and enable the counter.
|
|
|
|
+ * armpmu_start() indirectly calls
|
|
|
|
+ *
|
|
|
|
+ * perf_event_update_userpage()
|
|
|
|
+ *
|
|
|
|
+ * that requires RCU read locking to be functional,
|
|
|
|
+ * wrap the call within RCU_NONIDLE to make the
|
|
|
|
+ * RCU subsystem aware this cpu is not idle from
|
|
|
|
+ * an RCU perspective for the armpmu_start() call
|
|
|
|
+ * duration.
|
|
|
|
+ */
|
|
|
|
+ RCU_NONIDLE(armpmu_start(event, PERF_EF_RELOAD));
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|