aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDirk Brandewie <dirk.j.brandewie@intel.com>2013-05-07 11:20:27 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-05-12 08:04:16 -0400
commitca182aee389f8026401510f4c63841cb02c820e8 (patch)
treef14f3dff13656112ea2034dd1978e2787e1711bc
parentd8f469e9cff3bc4a6317d923e9506be046aa7bdc (diff)
cpufreq / intel_pstate: fix ffmpeg regression
The ffmpeg benchmark in the phoronix test suite has threads on multiple cores that rely on the progress on of threads on other cores and ping pong back and forth fast enough to make the core appear less busy than it "should" be. If the core has been at minimum p-state for a while bump the pstate up to kick the core to see if it is in this ping pong state. If the core is truly idle the p-state will be reduced at the next sample time. If the core makes more progress it will send more work to the thread bringing both threads out of the ping pong scenario and the p-state will be selected normally. This fixes a performance regression of approximately 30% Cc: 3.9+ <stable@vger.kernel.org> Signed-off-by: Dirk Brandewie <dirk.j.brandewie@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r--drivers/cpufreq/intel_pstate.c10
1 files changed, 2 insertions, 8 deletions
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
index 4a437ffc5186..a7f1946b3452 100644
--- a/drivers/cpufreq/intel_pstate.c
+++ b/drivers/cpufreq/intel_pstate.c
@@ -551,22 +551,16 @@ static void intel_pstate_timer_func(unsigned long __data)
551 struct cpudata *cpu = (struct cpudata *) __data; 551 struct cpudata *cpu = (struct cpudata *) __data;
552 552
553 intel_pstate_sample(cpu); 553 intel_pstate_sample(cpu);
554 intel_pstate_adjust_busy_pstate(cpu);
554 555
555 if (!cpu->idle_mode)
556 intel_pstate_adjust_busy_pstate(cpu);
557 else
558 intel_pstate_adjust_idle_pstate(cpu);
559
560#if defined(XPERF_FIX)
561 if (cpu->pstate.current_pstate == cpu->pstate.min_pstate) { 556 if (cpu->pstate.current_pstate == cpu->pstate.min_pstate) {
562 cpu->min_pstate_count++; 557 cpu->min_pstate_count++;
563 if (!(cpu->min_pstate_count % 5)) { 558 if (!(cpu->min_pstate_count % 5)) {
564 intel_pstate_set_pstate(cpu, cpu->pstate.max_pstate); 559 intel_pstate_set_pstate(cpu, cpu->pstate.max_pstate);
565 intel_pstate_idle_mode(cpu);
566 } 560 }
567 } else 561 } else
568 cpu->min_pstate_count = 0; 562 cpu->min_pstate_count = 0;
569#endif 563
570 intel_pstate_set_sample_time(cpu); 564 intel_pstate_set_sample_time(cpu);
571} 565}
572 566