[Mesa-dev] [PATCH] radeon/winsys: fix handling in radeon_drm_cs_flush v2

Alex Deucher alexdeucher at gmail.com
Wed Oct 9 18:55:33 CEST 2013


On Wed, Oct 9, 2013 at 10:32 AM, Christian König
<deathsimple at vodafone.de> wrote:
> From: Christian König <christian.koenig at amd.com>
>
> Calling radeon_drm_cs_flush from multiple threads might cause deadlocks,
> fix this by immediately signaling the semaphore after waiting for it.
>
> This is a candidate for the stable branch(es).

Need to add:

CC: "9.2" <mesa-stable at lists.freedesktop.org>
CC: "9.1" <mesa-stable at lists.freedesktop.org>

now for stable branches.

Alex

>
> Partially fixes: https://bugs.freedesktop.org/show_bug.cgi?id=70123
>
> v2: some fixes on commit message
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
>  src/gallium/winsys/radeon/drm/radeon_drm_cs.c | 8 ++++----
>  src/gallium/winsys/radeon/drm/radeon_drm_cs.h | 1 -
>  2 files changed, 4 insertions(+), 5 deletions(-)
>
> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
> index 62f7704..0782e10 100644
> --- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
> @@ -178,7 +178,7 @@ static struct radeon_winsys_cs *radeon_drm_cs_create(struct radeon_winsys *rws,
>      if (!cs) {
>          return NULL;
>      }
> -    pipe_semaphore_init(&cs->flush_completed, 0);
> +    pipe_semaphore_init(&cs->flush_completed, 1);
>
>      cs->ws = ws;
>      cs->trace_buf = (struct radeon_bo*)trace_buf;
> @@ -453,9 +453,9 @@ void radeon_drm_cs_sync_flush(struct radeon_winsys_cs *rcs)
>      struct radeon_drm_cs *cs = radeon_drm_cs(rcs);
>
>      /* Wait for any pending ioctl to complete. */
> -    if (cs->ws->thread && cs->flush_started) {
> +    if (cs->ws->thread) {
>          pipe_semaphore_wait(&cs->flush_completed);
> -        cs->flush_started = 0;
> +        pipe_semaphore_signal(&cs->flush_completed);
>      }
>  }
>
> @@ -567,7 +567,7 @@ static void radeon_drm_cs_flush(struct radeon_winsys_cs *rcs, unsigned flags, ui
>          }
>
>          if (cs->ws->thread) {
> -            cs->flush_started = 1;
> +            pipe_semaphore_wait(&cs->flush_completed);
>              radeon_drm_ws_queue_cs(cs->ws, cs);
>              if (!(flags & RADEON_FLUSH_ASYNC))
>                  radeon_drm_cs_sync_flush(rcs);
> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.h b/src/gallium/winsys/radeon/drm/radeon_drm_cs.h
> index 7683e96..ebec161 100644
> --- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.h
> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.h
> @@ -76,7 +76,6 @@ struct radeon_drm_cs {
>      void (*flush_cs)(void *ctx, unsigned flags);
>      void *flush_data;
>
> -    int flush_started;
>      pipe_semaphore flush_completed;
>      struct radeon_bo                    *trace_buf;
>  };
> --
> 1.8.1.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list