lkml.org 
[lkml]   [2019]   [Dec]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 134/199] PM / devfreq: Lock devfreq in trans_stat_show
    Date
    From: Leonard Crestez <leonard.crestez@nxp.com>

    commit 2abb0d5268ae7b5ddf82099b1f8d5aa8414637d4 upstream.

    There is no locking in this sysfs show function so stats printing can
    race with a devfreq_update_status called as part of freq switching or
    with initialization.

    Also add an assert in devfreq_update_status to make it clear that lock
    must be held by caller.

    Fixes: 39688ce6facd ("PM / devfreq: account suspend/resume for stats")
    Cc: stable@vger.kernel.org
    Signed-off-by: Leonard Crestez <leonard.crestez@nxp.com>
    Reviewed-by: Matthias Kaehlcke <mka@chromium.org>
    Reviewed-by: Chanwoo Choi <cw00.choi@samsung.com>
    Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/devfreq/devfreq.c | 12 +++++++++---
    1 file changed, 9 insertions(+), 3 deletions(-)

    --- a/drivers/devfreq/devfreq.c
    +++ b/drivers/devfreq/devfreq.c
    @@ -135,6 +135,7 @@ int devfreq_update_status(struct devfreq
    int lev, prev_lev, ret = 0;
    unsigned long cur_time;

    + lockdep_assert_held(&devfreq->lock);
    cur_time = jiffies;

    /* Immediately exit if previous_freq is not initialized yet. */
    @@ -1170,12 +1171,17 @@ static ssize_t trans_stat_show(struct de
    int i, j;
    unsigned int max_state = devfreq->profile->max_state;

    - if (!devfreq->stop_polling &&
    - devfreq_update_status(devfreq, devfreq->previous_freq))
    - return 0;
    if (max_state == 0)
    return sprintf(buf, "Not Supported.\n");

    + mutex_lock(&devfreq->lock);
    + if (!devfreq->stop_polling &&
    + devfreq_update_status(devfreq, devfreq->previous_freq)) {
    + mutex_unlock(&devfreq->lock);
    + return 0;
    + }
    + mutex_unlock(&devfreq->lock);
    +
    len = sprintf(buf, " From : To\n");
    len += sprintf(buf + len, " :");
    for (i = 0; i < max_state; i++)

    \
     
     \ /
      Last update: 2019-12-19 19:48    [W:3.186 / U:0.232 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site