On Wed, Oct 9, 2013 at 10:32 AM, Christian König <[email protected]> wrote: > From: Christian König <[email protected]> > > 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" <[email protected]> CC: "9.1" <[email protected]> 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 <[email protected]> > --- > 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 > [email protected] > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
