summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian König <[email protected]>2013-10-07 12:08:29 +0200
committerChristian König <[email protected]>2013-10-10 11:50:38 +0200
commit8bc7673ef874faa95d43c255c7fc631c2d2160c0 (patch)
tree659d2a5cf19ec3003605c8b02b22c32ae8f15619
parenta922d3413f99ec384ed23324a4cceade8ab57e34 (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]>
-rw-r--r--src/gallium/winsys/radeon/drm/radeon_drm_cs.c8
-rw-r--r--src/gallium/winsys/radeon/drm/radeon_drm_cs.h1
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;
};