• Rafael J. Wysocki's avatar
    thermal: gov_step_wise: Restore passive polling management · b6846826
    Rafael J. Wysocki authored
    Consider a thermal zone with one passive trip point, a cooling device
    with 3 states (0, 1, 2) bound to it, passive polling enabled (nonzero
    passive_delay_jiffies) and no regular polling (polling_delay_jiffies
    equal to 0) that is managed by the Step-Wise governor.  Suppose that
    the initial state of the cooling device is 0 and the zone temperature
    is below the trip point to start with.
    
    When the trip point is crossed, tz->passive is incremented by the
    thermal core and the governor's .manage() callback is invoked.  It
    sets 'throttle' to 'true' for the trip in question and
    get_target_state() returns 1 for the instance corresponding to the
    cooling device (say that 'upper' and 'lower' are set to 2 and 0 for
    it, respectively), so its state changes to 1.
    
    Passive polling is still active for the zone, so next time the
    temperature is updated, the governor's .manage() callback will be
    invoked again.  If the temperature is still rising, it will change
    the state of the cooling device to 2.
    
    Now suppose that next time the zone temperature is updated, it falls
    below the trip point, so tz->passive is decremented for the zone (say
    it becomes 0 then) and the governor's .manage() callbacks runs.
    
    It finds that the temperature trend for the zone is 'falling' and
    'throttle' will be set to 'false' for the trip in question, so the
    cooling device's state will be changed to 1.  However, because
    tz->polling is 0 for the zone, the governor's .manage() callback
    may not be invoked again for a long time and the cooling device's
    state will not be reset back to 0.
    
    This can happen because commit 042a3d80 ("thermal: core: Move
    passive polling management to the core") removed passive polling
    management from the Step-Wise governor.
    
    Before that change, thermal_zone_trip_update() would bump up
    tz->passive when changing the target state for a thermal instance
    from "no target" to a specific value and it would drop tz->passive
    when changing it back to "no target" which would cause passive
    polling to be active for the zone until the governor has reset the
    states of all cooling devices.  In particular, in the example above
    tz->passive would be incremented when changing the state of the
    cooling device from 0 to 1 and then it would be still nonzero when
    the state of the cooling device was changed from 2 to 1.
    
    To prevent this problem from occurring, restore the passive polling
    management in the Step-Wise governor by partially reverting the
    commit in question and update the comment in the restored code
    to explain its role more clearly.
    
    Fixes: 042a3d80 ("thermal: core: Move passive polling management to the core")
    Closes: https://lore.kernel.org/linux-pm/ZmVfcEOxmjUHZTSX@hovoldconsulting.comReported-by: default avatarJohan Hovold <johan+linaro@kernel.org>
    Tested-by: default avatarJohan Hovold <johan+linaro@kernel.org>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    b6846826
gov_step_wise.c 4.57 KB