lkml.org 
[lkml]   [2020]   [Aug]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.8 163/464] drm/panfrost: Fix inbalance of devfreq record_busy/idle()
    Date
    From: Steven Price <steven.price@arm.com>

    [ Upstream commit b99773ef258e628bd53cab22d450a755b73b4d55 ]

    The calls to panfrost_devfreq_record_busy() and
    panfrost_devfreq_record_idle() must be balanced to ensure that the
    devfreq utilisation is correctly reported. But there are two cases where
    this doesn't work correctly.

    In panfrost_job_hw_submit() if pm_runtime_get_sync() fails or the
    WARN_ON() fires then no call to panfrost_devfreq_record_busy() is made,
    but when the job times out the corresponding _record_idle() call is
    still made in panfrost_job_timedout(). Move the call up to ensure that
    it always happens.

    Secondly panfrost_job_timedout() only makes a single call to
    panfrost_devfreq_record_idle() even if it is cleaning up multiple jobs.
    Move the call inside the loop to ensure that the number of
    _record_idle() calls matches the number of _record_busy() calls.

    Fixes: 9e62b885f715 ("drm/panfrost: Simplify devfreq utilisation tracking")
    Acked-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
    Signed-off-by: Steven Price <steven.price@arm.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20200522153653.40754-1-steven.price@arm.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpu/drm/panfrost/panfrost_job.c | 5 +++--
    1 file changed, 3 insertions(+), 2 deletions(-)

    diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c
    index 7914b15708412..f9519afca29d9 100644
    --- a/drivers/gpu/drm/panfrost/panfrost_job.c
    +++ b/drivers/gpu/drm/panfrost/panfrost_job.c
    @@ -145,6 +145,8 @@ static void panfrost_job_hw_submit(struct panfrost_job *job, int js)
    u64 jc_head = job->jc;
    int ret;

    + panfrost_devfreq_record_busy(pfdev);
    +
    ret = pm_runtime_get_sync(pfdev->dev);
    if (ret < 0)
    return;
    @@ -155,7 +157,6 @@ static void panfrost_job_hw_submit(struct panfrost_job *job, int js)
    }

    cfg = panfrost_mmu_as_get(pfdev, &job->file_priv->mmu);
    - panfrost_devfreq_record_busy(pfdev);

    job_write(pfdev, JS_HEAD_NEXT_LO(js), jc_head & 0xFFFFFFFF);
    job_write(pfdev, JS_HEAD_NEXT_HI(js), jc_head >> 32);
    @@ -410,12 +411,12 @@ static void panfrost_job_timedout(struct drm_sched_job *sched_job)
    for (i = 0; i < NUM_JOB_SLOTS; i++) {
    if (pfdev->jobs[i]) {
    pm_runtime_put_noidle(pfdev->dev);
    + panfrost_devfreq_record_idle(pfdev);
    pfdev->jobs[i] = NULL;
    }
    }
    spin_unlock_irqrestore(&pfdev->js->job_lock, flags);

    - panfrost_devfreq_record_idle(pfdev);
    panfrost_device_reset(pfdev);

    for (i = 0; i < NUM_JOB_SLOTS; i++)
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-08-17 21:41    [W:3.255 / U:0.720 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site