lkml.org 
[lkml]   [2018]   [Jul]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.17 07/67] drm/etnaviv: bring back progress check in job timeout handler
    Date
    4.17-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Lucas Stach <l.stach@pengutronix.de>

    commit 2c83a726d6fbb5d130d8f2edd82a258adb675ac3 upstream.

    When the hangcheck handler was replaced by the DRM scheduler timeout
    handling we dropped the forward progress check, as this might allow
    clients to hog the GPU for a long time with a big job.

    It turns out that even reasonably well behaved clients like the
    Armada Xorg driver occasionally trip over the 500ms timeout. Bring
    back the forward progress check to get rid of the userspace regression.

    We would still like to fix userspace to submit smaller batches
    if possible, but that is for another day.

    Cc: <stable@vger.kernel.org>
    Fixes: 6d7a20c07760 (drm/etnaviv: replace hangcheck with scheduler timeout)
    Reported-by: Russell King <linux@armlinux.org.uk>
    Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
    Reviewed-by: Eric Anholt <eric@anholt.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/gpu/drm/etnaviv/etnaviv_gpu.h | 3 +++
    drivers/gpu/drm/etnaviv/etnaviv_sched.c | 24 ++++++++++++++++++++++++
    2 files changed, 27 insertions(+)

    --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.h
    +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.h
    @@ -142,6 +142,9 @@ struct etnaviv_gpu {
    struct work_struct sync_point_work;
    int sync_point_event;

    + /* hang detection */
    + u32 hangcheck_dma_addr;
    +
    void __iomem *mmio;
    int irq;

    --- a/drivers/gpu/drm/etnaviv/etnaviv_sched.c
    +++ b/drivers/gpu/drm/etnaviv/etnaviv_sched.c
    @@ -21,6 +21,7 @@
    #include "etnaviv_gem.h"
    #include "etnaviv_gpu.h"
    #include "etnaviv_sched.h"
    +#include "state.xml.h"

    static int etnaviv_job_hang_limit = 0;
    module_param_named(job_hang_limit, etnaviv_job_hang_limit, int , 0444);
    @@ -96,6 +97,29 @@ static void etnaviv_sched_timedout_job(s
    {
    struct etnaviv_gem_submit *submit = to_etnaviv_submit(sched_job);
    struct etnaviv_gpu *gpu = submit->gpu;
    + u32 dma_addr;
    + int change;
    +
    + /*
    + * If the GPU managed to complete this jobs fence, the timout is
    + * spurious. Bail out.
    + */
    + if (fence_completed(gpu, submit->out_fence->seqno))
    + return;
    +
    + /*
    + * If the GPU is still making forward progress on the front-end (which
    + * should never loop) we shift out the timeout to give it a chance to
    + * finish the job.
    + */
    + dma_addr = gpu_read(gpu, VIVS_FE_DMA_ADDRESS);
    + change = dma_addr - gpu->hangcheck_dma_addr;
    + if (change < 0 || change > 16) {
    + gpu->hangcheck_dma_addr = dma_addr;
    + schedule_delayed_work(&sched_job->work_tdr,
    + sched_job->sched->timeout);
    + return;
    + }

    /* block scheduler */
    kthread_park(gpu->sched.thread);

    \
     
     \ /
      Last update: 2018-07-16 09:37    [W:4.478 / U:0.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site