28 Jan, 2016

1 commit


15 Jan, 2016

39 commits

  • Remove the unused value assignment reported by
    coverity check(CID 17279).

    Signed-off-by: Bai Ping

    Bai Ping
     
  • In timer, cpu_load is calcuated on target_freq.
    cpu_load = loadadjfreq / pcpu->target_freq;
    But cpu is actually running on current freq i.e. pcpu->policy->cur. So cpu_load
    should be calculated on current frequency.
    cpu_load = loadadjfreq / pcpu->policy->cur;

    Change-Id: I89db6b68e9f82aa52077f6bf7d819dab74265790
    Signed-off-by: rahul.khandelwal

    rahul.khandelwal
     
  • strict_strtoul() is obsolete. Use kstrtoul() instead.
    Otherwise we run into following build error:

    CC drivers/cpufreq/cpufreq_interactive.o
    drivers/cpufreq/cpufreq_interactive.c: In function ‘store_hispeed_freq’:
    drivers/cpufreq/cpufreq_interactive.c:784:2: error: implicit declaration of function ‘strict_strtoul’ [-Werror=implicit-function-declaration]
    cc1: some warnings being treated as errors
    make[2]: *** [drivers/cpufreq/cpufreq_interactive.o] Error 1

    Change-Id: Ib91b9df3af5fe2a244861c2f598bd20ec8115e6c
    Signed-off-by: Amit Pundir

    Amit Pundir
     
  • Interactive governor doesn't rearm per-cpu timer if target_freq is
    equal to policy->max. However, this does not have clear performance
    benefits. Profiling doesn't show any difference in benchmarks, games
    or other workloads, if timers are always rearmed.

    At same time, there are a few issues caused by not rearming timer
    at policy->max.

    1) min_sample_time enforcement is inconsistent

    For target frequency that is lower than policy->max, it will not
    drop until min_sample_time has passed since last frequency evaluation
    selected current frequency. However, for policy->max, it will
    always drop immediately as long as CPU has been run for longer than
    min_sample_time. This is because timer is not running and thus
    floor_freq and floor_validate_time is not updated.

    Example: assume min_sample_time is 59ms and timer_rate is 20ms.
    Frequency X < Y. Let's say CPU would pick the following frequencies
    before accounting for min_sample_time in each 20ms sampling window.
    Y, Y, Y, Y, X, X, X, X, X
    If Y is not policy->max, the final target_freq after considering
    min_sample_time will be Y, Y, Y, Y, *Y, *Y, X, X, X
    * marks the windows where frequency is prevented from dropping.
    If Y is policy->max, the final target_freq will be
    Y, Y, Y, Y, X, X, X, X, X

    2) Rearm timer in IDLE_START does not work as intended

    IDLE_START/END is sent in arch_cpu_idle_enter/exit(). However, next
    wake up is decided in tick_nohz_idle_enter(), which traverses the
    timer list before idle notification is sent out. Therefore, rearming
    timer in idle notification won't take effect until CPU wakes up at
    least once. In rare scenarios when a CPU goes to idle and sleeps for a
    long time immediately after a heavy load stops, it may not wake up
    to drop its frequency vote for a long time, defeating the purpose of
    having a slack_timer.

    3) Need to rearm timer for policy->max change

    commit 535a553fc1c4b4c3627c73214ade6326615a7463
    (cpufreq: interactive: restructure CPUFREQ_GOV_LIMITS) mentions the
    problem of timer getting indefinitely pushed back due to frequency
    changes in policy->min/max. However, it still cancels and rearms timer
    if policy->max is increased, and same problem could still happen if
    policy->max is frequently changing after the fix. The best solution is
    to always rearm timer for each CPU even if it's running at
    policy->max.

    Rearming timers even if target_freq is policy->max solves these
    problems cleanly. It also simplifies the design and code of interactive
    governor.

    Change-Id: I973853d2375ea6f697fa4cee04a89efe6b8bf735
    Reviewed-by: Saravana Kannan
    Signed-off-by: Junjie Wu
    Signed-off-by: Rohit Gupta

    Rohit Gupta
     
  • min_sample_time needs to be cluster-based to match
    above_hispeed_delay. If each CPU keeps making local decisions, it's
    possible min_sample_time is not correctly enforced at cluster level,
    which results in undesired frequency drops.

    Change-Id: Ia2ec2ad9b7a8d715d4408c924d6762b7e532e4b4
    Reviewed-by: Saravana Kannan
    Signed-off-by: Junjie Wu

    Junjie Wu
     
  • If a heavy task migrates between otherwise idle CPUs in a policy during
    every sample window, the above hispeed delay window for the CPUs would get
    restarted for every sample window. Due to the continuous restart of above
    hispeed delay window, none of the CPUs would ever pick a target frequency
    higher than hispeed frequency. This causes the policy's frequency to be
    stuck at hispeed freq even if the load justifies a higher frequency.

    To fix this, the above high speed delay window is restarted only when the
    policy frequency changes. This ensures that tasks migrating between CPUs in
    a policy are handled correctly.

    Also, the hispeed load/frequency heuristic is only necessary when the
    information is insufficient to determine if the load on the CPU needs at
    least hispeed frequency. When the policy frequency is already at or above
    hispeed frequency, if the CPU load% based on policy frequency is not above
    hispeed load, then the information is clearly sufficient to determine that
    the load on the CPU does not need hispeed frequency.

    Therefore, compute CPU load% (which is used only to compare against hispeed
    load) based on policy frequency instead of CPU target frequency.

    Change-Id: I8b5dfe6c50bee567a6719f0980e3f7757876ce4b
    Signed-off-by: Saravana Kannan
    Signed-off-by: Junjie Wu

    Saravana Kannan
     
  • Timers are scheduled in unit of jiffies. Round up timer_rate so that
    it matches the actual sampling period.

    Change-Id: I88386a5a448e40333f9a9b9f0cf72af58cb54656
    Signed-off-by: Junjie Wu

    Junjie Wu
     
  • Frequency selection algorithm guarantees its chosen frequency
    is not lower than hispeed_freq as long as boost is enabled.

    Setting floor_freq and floor_validate_time during boost could block
    CPU frequency from going below hispeed_freq even after
    boostpulse_duration expires, if min_sample_time is higher than
    boostpulse_duration. This conflicts with the intention of commit
    de091367ead15b6e95dd1d0743a18f0da5a07ee5
    (cpufreq: interactive: specify duration of CPU speed boost pulse)
    to allow CPU to ramp down immediately after boost expires. It also
    makes boost behavior inconsistent since it depends on min_sample_time.

    Avoid setting floor_freq and floor_validate_time when boost starts.

    Change-Id: I12852998af46cfbfaf8661eb5e8d5301b6f631e7
    Signed-off-by: Junjie Wu

    Junjie Wu
     
  • Fix failure recovery path in cpufreq_governor_interactive(). Call
    cpufreq_put_global_kobject() to release cpufreq global kobject upon
    governor init failure.

    Change-Id: I7a977070b7a3c75c90acccd2c117064ed1a10d0e
    Signed-off-by: Junjie Wu

    Junjie Wu
     
  • It is not correct to boost all the cpus when tunable boost
    parameters are changed. It also does not need to boost the
    cpus which is already boosted.

    Signed-off-by: Lianwei Wang

    Lianwei Wang
     
  • When __cpufreq_driver_target() in speedchange_task failed for some reason, the
    policy->cur could be lower than the target_freq. The governor misses to change
    the target_freq if the target_freq is equal to the next_freq at the next sample
    time.

    Added a check to prevent the CPU to stay at the speed that is lower than the
    target_freq for long duration.

    Change-Id: Ibfdcd193b8280390b8f8374a63218aa31267f310
    Signed-off-by: Minsung Kim

    Minsung Kim
     
  • common_tunables should be static.

    Change-Id: I502ee3062bece5082fea7861eff2f6237e25cede
    Signed-off-by: Todd Poynor

    Cylen Yao
     
  • …_freq from a lower frequency.

    When the load was below go_hispeed_load, there is a possibility that
    choose_freq() would return a frequency which would be higher than the
    hispeed_freq. According to the policy we should first jump to the
    hispeed_freq, stay there for above_hispeed_delay and then be allowed to
    raise higher than that.

    Added a check to prevent the frequency to be directly raised to
    something higher than the hispeed_freq.

    Change-Id: Icda5d848dd9beadcc18835082ddf269732c75bd0
    Signed-off-by: Ruchi Kandoi <kandoiruchi@google.com>

    Ruchi Kandoi
     
  • Change-Id: I068b18281d03ac879ef64d8ff36ed43367293767
    Signed-off-by: Ruchi Kandoi

    Ruchi Kandoi
     
  • Change-Id: I36fe217fa047d68ea90e78b12c7db4537ea8010b
    Signed-off-by: Ruchi Kandoi

    Ruchi Kandoi
     
  • The cpufreq_interactive_timer gets cancelled and rescheduled
    whenever the cpufreq_policy is changed. When the cpufreq policy is
    changed at a rate faster than the sampling_rate of the interactive
    governor, then the governor misses to change the target frequency
    for long duration. The patch removes the need of cancelling the
    timers when policy->min is changed.

    Signed-off-by: Badhri Jagan Sridharan
    Change-Id: Ibd98d151e1c73b8bd969484583ff98ee9f1135ef

    Badhri Jagan Sridharan
     
  • 2361be23666232dbb4851a527f466c4cbf5340fc changed cpufreq to add the
    global cpufreq kobject to sysfs on demand.

    To ensure this happens, cpufreq_interactive must hold a reference on
    this object on devices where it intends to use it (i.e., devices where
    have_governor_per_policy() returns false). Otherwise a parentless
    kobject will be passed to sysfs_create_group() which will subsequently
    BUG().

    Change-Id: I7dd03956e1d3c6c3c0cc17c799882c235804ae09
    Signed-off-by: Greg Hackmann

    Greg Hackmann
     
  • Now that a generic version of get_cpu_idle_time() is available, use that for the interactive governor.

    [toddpoynor@google.com: commit text changes]
    Change-Id: Ia38b57085aac99ec3d415fe44471d5dfde519c2c
    Signed-off-by: Viresh Kumar
    Signed-off-by: Jon Medhurst
    Signed-off-by: John Stultz

    Viresh Kumar
     
  • sysfs ops for target_loads and above_hispeed_delay can be called before
    initializing tunables at CPUFREQ_GOV_POLICY_INIT. Create sysfs entries after
    initialization.

    Change-Id: I50356198d7629731c0d32a3066d61fe8354e0001
    Signed-off-by: Minsung Kim

    Minsung Kim
     
  • The gcc warns like:

    cpufreq_interactive.c:745:6: warning: operation on 'ret' may be undefined [-Wsequence-point]

    It was introduced by commit cf0fad49d17cb8273ce555dd5b7afab67d7923bf.

    Since sprintf(...) just return 1 (one character) in this case, ret should not changed.
    Just discarding the result of sprintf(...) leads to the result that
    the committer of cf0fad49d17cb8273ce555dd5b7afab67d7923bf wants.

    Change-Id: Ifed1cef6d6a31c3ed23dad03a567b3b9eddf3a57
    Signed-off-by: Chih-Wei Huang

    Chih-Wei Huang
     
  • Make sure that timers cpu_timer and cpu_slack_timer
    deactivated before addition of new.

    Change-Id: If31c4049606871df6f00efdc24b1d713c86a6f69
    Signed-off-by: Shridhar Rasal
    Signed-off-by: Bharat Nihalani

    Shridhar Rasal
     
  • If we have a multi-package system, where we have multiple instances of struct
    policy (per package), currently we can't have multiple instances of same
    governor. i.e. We can't have multiple instances of Interactive governor for
    multiple packages.

    This is a bottleneck for multicluster system, where we want different packages
    to use Interactive governor, but with different tunables.

    This patch uses the infrastructure provided by earlier patches pushed in
    Mainline in v3.10-rc1/rc2 and implements per policy instances of Interactive
    governor.

    Change-Id: I70436d4a5a45c6cb6edf37f3e46d0b9fbc930982
    [toddpoynor@google.com: merge with later code, minor changes]
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     
  • This moves definition of cpufreq_gov_interactive towards the bottom of file, so
    that we don't have to add prototype of cpufreq_governor_interactive() in the
    beginning of file.

    Change-Id: I04bd1004954eb36502c5cd7e35d3d7274cddaf95
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     
  • Cpufreq no longer calls governor callback for offlined cpus. i.e. All
    policy->cpus are guaranteed to be online. Hence we don't need explicit check to
    see if cpu is online or not.

    Change-Id: I9ad85ea4addd5b4a40952e59ed730dd15e328690
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     
  • Remove a trailing whitespace from target_loads and above_hispeed_delay. Problem
    happens when user-space program tried to restore parameters that saved before
    changing parameters. In this case was returned error(EINVAL).

    Change-Id: I5a74e3824602cd6f2b74651adda5ec1b627e61e9
    Signed-off-by: Minsung Kim

    Minsung Kim
     
  • When the policy max freq is raised, and before the timer is
    rescheduled in idle callback, the cpu freq may stuck at a
    lower freq.

    The target_freq shall be updated too, else on a high load
    situation, the new_freq is always equal to target_freq and
    which will cause freq stuck at a lower freq too.

    Reschedule the timer on gov limits callback.

    Change-Id: I6c187001ab43e859731429b64f75a74eebc37a24
    Signed-off-by: Lianwei Wang

    Lianwei Wang
     
  • The cpufreq TRANSTION notifier callback does not check the
    governor_enabled state on affected CPUS, which will case
    kernel panic in update_load because the policy object maybe
    NULL or invalid when governor_enabled is false.

    Change-Id: Ie0f1718124f61e2f9b5da57abc6981ada5b83908
    Signed-off-by: Lianwei Wang

    Lianwei Wang
     
  • Check for idle time delta less than elapsed time delta, avoid
    underflow computing active time.

    Change-Id: I3e4c6ef1ad794eec49ed379c0c50fa727fd6ad28
    Signed-off-by: Minsung Kim

    Minsung Kim
     
  • Reschedule load sampling timer after timestamp of sample start taken,
    hold spinlock across entire sequence to avoid preemption. Avoid the
    WARN for zero time delta in the load sampling timer function.

    Change-Id: Idc10a756f09141decb6df92669521a1ebf0dbc10
    Signed-off-by: Todd Poynor

    Todd Poynor
     
  • Add checks for error return from cpufreq_frequency_table_target, and be
    less noisy on the existing call with an error check. CPU hotplug and
    system shutdown may cause this call to return -EINVAL.

    Bug: 8613560
    Change-Id: Id78d8829920462c0db1c7e14e717d91740d6cb44
    Signed-off-by: Todd Poynor

    Todd Poynor
     
  • Add missing spinlock init

    Backtrace:
    [] (dump_backtrace+0x0/0x10c) from [] (dump_stack+0x18/0x1c)
    r6:00000032 r5:c0bd09ec r4:e6848000 r3:00000000
    [] (dump_stack+0x0/0x1c) from [] (spin_dump+0x80/0x94)
    [] (spin_dump+0x0/0x94) from [] (spin_bug+0x2c/0x30)
    r5:c08f91fc r4:c0bd09ec
    [] (spin_bug+0x0/0x30) from [] (do_raw_spin_unlock+0x88/0xcc)
    r5:e547bac0 r4:c0bd09ec
    [] (do_raw_spin_unlock+0x0/0xcc) from [] (_raw_spin_unlock_irqrestore+0x14/0x40)
    r5:e547bac0 r4:60000013
    [] (_raw_spin_unlock_irqrestore+0x0/0x40) from [] (store_above_hispeed_delay+0x6c/0x80)
    r4:c0b4cf78 r3:00000007
    [] (store_above_hispeed_delay+0x0/0x80) from [] (kobj_attr_store+0x1c/0x28)
    r7:e68ff000 r6:00000032 r5:e58137c0 r4:e61cde80
    [] (kobj_attr_store+0x0/0x28) from [] (sysfs_write_file+0x104/0x184)
    [] (sysfs_write_file+0x0/0x184) from [] (vfs_write+0xb0/0x140)
    [] (vfs_write+0x0/0x140) from [] (sys_write+0x44/0x70)
    r8:00000000 r7:00000004 r6:00000032 r5:bee43c90 r4:e5600300
    [] (sys_write+0x0/0x70) from [] (ret_fast_syscall+0x0/0x30)
    r9:e6842000 r8:c000e584 r6:00000032 r5:bee43c90 r4:00000009

    Change-Id: I80a1e0b3fecb24adba501ff44f568479deeff7fa
    Signed-off-by: Minsung Kim

    Minsung Kim
     
  • Time to wait should be based on the intended target speed, not the
    actual speed (which may be held high by another CPU).

    Change-Id: Ifc5bb55d06adddb9a02af90af05398a78f282272
    Reported-by: Arve Hjønnevåg
    Signed-off-by: Todd Poynor

    Todd Poynor
     
  • Use separate variable for error code, free proper pointer.

    Change-Id: Ia83cccb195997789ac6afbf5b8761f7b278196d6
    Reported-by: Arve Hjønnevåg
    Signed-off-by: Todd Poynor

    Todd Poynor
     
  • Previously the idle time returned from get_cpu_idle_time_us included the
    iowait time. So the iowait time was always calculated as idle time.

    But now the idle time returned from get_cpu_idle_time_us does not include
    the iowait time anymore because of below commit which cause the iowait time
    always calculated as busy time:
    6beea0c nohz: Fix update_ts_time_stat idle accounting

    Add the io_is_busy interface, as does the ondemand governor, and let the user
    configure the iowait time as busy or idle through the io_is_busy sysfs
    interface.

    By default, io_is_busy is disabled.

    [toddpoynor@google.com: minor updates]
    Change-Id: If7d70ff864c43bc9c8d7fd7cfc66f930d339f9b4
    Signed-off-by: Lianwei Wang
    Signed-off-by: Todd Poynor

    Lianwei Wang
     
  • Accept a string of delays and speeds at which to apply the delay before
    raising each step above hispeed. For example, "80000 1300000:200000
    1500000:40000" means that the delay at or above 1GHz, until 1.3GHz is 80 msecs,
    the delay until 1.5GHz is 200 msecs and the delay at or above 1.5GHz is 40
    msecs when hispeed_freq is 1GHz.

    [toddpoynor@google.com: add documentation]
    Change-Id: Ifeebede8b1acbdd0a53e5c6916bccbf764dc854f
    Signed-off-by: Minsung Kim

    Minsung Kim
     
  • There is race condition when both two cpu do CPUFREQ_GOV_STOP and one cpu
    do CPUFREQ_GOV_START soon. The sysfs_remove_group is not done yet on one
    cpu, but sysfs_create_group is called on another cpu, which cause governor
    start failed and then kernel panic in timer callback because the policy and
    cpu mask are all kfree in cpufreq driver.

    Replace atomic with mutex to lock the whole START/STOP sequence.

    Change-Id: I3762b3d44315ae021b8275aca84f5ea9147cc540
    Signed-off-by: Lianwei Wang

    Lianwei Wang
     
  • Need to use irqsave/restore spinlock calls to avoid a deadlock in calls
    from the timer.

    Change-Id: I15b6b590045ba1447e34ca7b5ff342723e53a605
    Signed-off-by: Todd Poynor

    Todd Poynor
     
  • If multiple governors are in use then avoid processing frequency transition
    notifications for CPUs on which the interactive governor is not enabled.

    Change-Id: Ibd75255b921d887501a64774a8c4f62302f2d4e4
    Reported-by: Francisco Franco
    Signed-off-by: Todd Poynor

    Todd Poynor
     
  • Change-Id: Ia4966e949a6c24c34fdbd4a6e522cd7c37e4108e
    Signed-off-by: Todd Poynor

    Todd Poynor