On Sat, 2016-06-25 at 02:14 +0200, Rafael J. Wysocki wrote: > On Friday, June 17, 2016 04:09:33 PM Jisheng Zhang wrote: > > Dear all, > > > > If using acpi-cpufreq instead, v4.6, v4.6-rc3, v4.7-rc3 can't > > reproduce the issue. It seems > > only intel_pstate is impacted. > > Which is quite obvious, since the commit your bisection led to was > intel_pstate-specific. :-) > We should also check why the set_policy callback is getting called quite often. May be some thermal zone is tripping quite often.
echo 'file thermal_core.c +p' > /sys/kernel/debug/dynamic_debug/control may give us some clue. Thanks, Srinivas > If the issue is what I'm thinking it is, the patch below should help, > so > can you please test it? > > Thanks, > Rafael > > --- > From: Rafael J. Wysocki <rafael.j.wyso...@intel.com> > Subject: [PATCH] intel_pstate: Do not clear utilization update hooks > on policy changes > > intel_pstate_set_policy() is invoked by the cpufreq core during > driver initialization, on changes of policy attributes (minimim and > maximum frequency, for example) via sysfs and via CPU notifications > from the platform firmware. On some platforms the latter may occur > relatively often. > > Commit bb6ab52f2bef (intel_pstate: Do not set utilization update hook > too early) made intel_pstate_set_policy() clear the CPU's utilization > update hook before updating the policy attributes for it (and set the > hook again after doind that), but that involves invoking > synchronize_sched() and adds overhead to the CPU notifications > mentioned above and to the sched-RCU handling in general. > > That extra overhead is arguably not necessary, because updating > policy attributes when the CPU's utilization update hook is active > should not lead to any adverse effects, so drop the clearing of > the hook from intel_pstate_set_policy() and make it check if > the hook has been set already when attempting to set it. > > Fixes: bb6ab52f2bef (intel_pstate: Do not set utilization update hook > too early) > Reported-by: Jisheng Zhang <jszh...@marvell.com> > Signed-off-by: Rafael J. Wysocki <rafael.j.wyso...@intel.com> > --- > drivers/cpufreq/intel_pstate.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > Index: linux-pm/drivers/cpufreq/intel_pstate.c > =================================================================== > --- linux-pm.orig/drivers/cpufreq/intel_pstate.c > +++ linux-pm/drivers/cpufreq/intel_pstate.c > @@ -1440,6 +1440,9 @@ static void intel_pstate_set_update_util > { > struct cpudata *cpu = all_cpu_data[cpu_num]; > > + if (cpu->update_util_set) > + return; > + > /* Prevent intel_pstate_update_util() from using stale data. > */ > cpu->sample.time = 0; > cpufreq_add_update_util_hook(cpu_num, &cpu->update_util, > @@ -1480,8 +1483,6 @@ static int intel_pstate_set_policy(struc > if (!policy->cpuinfo.max_freq) > return -ENODEV; > > - intel_pstate_clear_update_util_hook(policy->cpu); > - > pr_debug("set_policy cpuinfo.max %u policy->max %u\n", > policy->cpuinfo.max_freq, policy->max); > >