X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=drivers%2Fperf%2Farm_pmu.c;h=f70090897fdf19c9777c332401dd01de7b1efc52;hb=cbcc72e037b8a3eb1fad3c1ae22021df21c97a51;hp=32346b5a8a119789c1857c90ec13902616ace318;hpb=e531cdf50a8a0fb7a4d51c06e52097bd01e9bf7c;p=deliverable%2Flinux.git diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c index 32346b5a8a11..f70090897fdf 100644 --- a/drivers/perf/arm_pmu.c +++ b/drivers/perf/arm_pmu.c @@ -737,8 +737,19 @@ static void cpu_pm_pmu_setup(struct arm_pmu *armpmu, unsigned long cmd) break; case CPU_PM_EXIT: 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; default: break;