[Mesa-dev] [PATCH 2/2] winsys/amdgpu: fix infinite loop w/ RADEON_NOOP=1 caused by unsubmitted fences

Nicolai Hähnle nhaehnle at gmail.com
Wed Oct 12 11:05:41 UTC 2016


For the series:

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

On 11.10.2016 17:00, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
>  src/gallium/winsys/amdgpu/drm/amdgpu_cs.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
> index c0e810c..2b86827 100644
> --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
> +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
> @@ -30,20 +30,22 @@
>   *      Marek Olšák <maraeo at gmail.com>
>   */
>
>  #include "amdgpu_cs.h"
>  #include "os/os_time.h"
>  #include <stdio.h>
>  #include <amdgpu_drm.h>
>
>  #include "amd/common/sid.h"
>
> +DEBUG_GET_ONCE_BOOL_OPTION(noop, "RADEON_NOOP", false)
> +
>  /* FENCES */
>
>  static struct pipe_fence_handle *
>  amdgpu_fence_create(struct amdgpu_ctx *ctx, unsigned ip_type,
>                      unsigned ip_instance, unsigned ring)
>  {
>     struct amdgpu_fence *fence = CALLOC_STRUCT(amdgpu_fence);
>
>     fence->reference.count = 1;
>     fence->ctx = ctx;
> @@ -136,20 +138,23 @@ static bool amdgpu_fence_wait_rel_timeout(struct radeon_winsys *rws,
>  {
>     return amdgpu_fence_wait(fence, timeout, false);
>  }
>
>  static struct pipe_fence_handle *
>  amdgpu_cs_get_next_fence(struct radeon_winsys_cs *rcs)
>  {
>     struct amdgpu_cs *cs = amdgpu_cs(rcs);
>     struct pipe_fence_handle *fence = NULL;
>
> +   if (debug_get_option_noop())
> +      return NULL;
> +
>     if (cs->next_fence) {
>        amdgpu_fence_reference(&fence, cs->next_fence);
>        return fence;
>     }
>
>     fence = amdgpu_fence_create(cs->ctx,
>                                 cs->csc->request.ip_type,
>                                 cs->csc->request.ip_instance,
>                                 cs->csc->request.ring);
>     if (!fence)
> @@ -1062,22 +1067,20 @@ cleanup:
>  void amdgpu_cs_sync_flush(struct radeon_winsys_cs *rcs)
>  {
>     struct amdgpu_cs *cs = amdgpu_cs(rcs);
>     struct amdgpu_winsys *ws = cs->ctx->ws;
>
>     /* Wait for any pending ioctl of this CS to complete. */
>     if (util_queue_is_initialized(&ws->cs_queue))
>        util_queue_job_wait(&cs->flush_completed);
>  }
>
> -DEBUG_GET_ONCE_BOOL_OPTION(noop, "RADEON_NOOP", false)
> -
>  static int amdgpu_cs_flush(struct radeon_winsys_cs *rcs,
>                             unsigned flags,
>                             struct pipe_fence_handle **fence)
>  {
>     struct amdgpu_cs *cs = amdgpu_cs(rcs);
>     struct amdgpu_winsys *ws = cs->ctx->ws;
>     int error_code = 0;
>
>     rcs->current.max_dw += amdgpu_cs_epilog_dws(cs->ring_type);
>
>


More information about the mesa-dev mailing list