• Christian Marangi's avatar
    PM / devfreq: Rework freq_table to be local to devfreq struct · b5d281f6
    Christian Marangi authored
    On a devfreq PROBE_DEFER, the freq_table in the driver profile struct,
    is never reset and may be leaved in an undefined state.
    
    This comes from the fact that we store the freq_table in the driver
    profile struct that is commonly defined as static and not reset on
    PROBE_DEFER.
    We currently skip the reinit of the freq_table if we found
    it's already defined since a driver may declare his own freq_table.
    
    This logic is flawed in the case devfreq core generate a freq_table, set
    it in the profile struct and then PROBE_DEFER, freeing the freq_table.
    In this case devfreq will found a NOT NULL freq_table that has been
    freed, skip the freq_table generation and probe the driver based on the
    wrong table.
    
    To fix this and correctly handle PROBE_DEFER, use a local freq_table and
    max_state in the devfreq struct and never modify the freq_table present
    in the profile struct if it does provide it.
    
    Fixes: 0ec09ac2 ("PM / devfreq: Set the freq_table of devfreq device")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarChristian Marangi <ansuelsmth@gmail.com>
    Signed-off-by: default avatarChanwoo Choi <cw00.choi@samsung.com>
    b5d281f6
devfreq.c 56.5 KB