diff options
author | Christian König <[email protected]> | 2013-10-07 12:08:29 +0200 |
---|---|---|
committer | Christian König <[email protected]> | 2013-10-10 11:50:38 +0200 |
commit | 8bc7673ef874faa95d43c255c7fc631c2d2160c0 (patch) | |
tree | 659d2a5cf19ec3003605c8b02b22c32ae8f15619 /src/gallium/winsys | |
parent | a922d3413f99ec384ed23324a4cceade8ab57e34 (diff) |
radeon/winsys: fix handling in radeon_drm_cs_flush v2
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).
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]>
Diffstat (limited to 'src/gallium/winsys')
-rw-r--r-- | src/gallium/winsys/radeon/drm/radeon_drm_cs.c | 8 | ||||
-rw-r--r-- | 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 62f77044b3a..0782e10c800 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 7683e96f525..ebec161c540 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; }; |