winsys/radeon: remove cs_queue_empty

Waiting for an empty queue is nonsense and can lead to deadlocks if we have
multiple waiters or another thread that continuously sends down new commands.

Just post the cs to the queue and immediately wait for it to finish.

This is a candidate for the stable branch.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Christian König 2013-09-21 15:24:55 +02:00
parent f7ccb84aa1
commit 0653c66ef4
3 changed files with 3 additions and 19 deletions

View File

@ -560,17 +560,12 @@ static void radeon_drm_cs_flush(struct radeon_winsys_cs *rcs, unsigned flags, ui
break;
}
if (cs->ws->thread && (flags & RADEON_FLUSH_ASYNC)) {
if (cs->ws->thread) {
cs->flush_started = 1;
radeon_drm_ws_queue_cs(cs->ws, cs);
if (!(flags & RADEON_FLUSH_ASYNC))
radeon_drm_cs_sync_flush(rcs);
} else {
pipe_mutex_lock(cs->ws->cs_stack_lock);
if (cs->ws->thread) {
while (p_atomic_read(&cs->ws->ncs)) {
pipe_condvar_wait(cs->ws->cs_queue_empty, cs->ws->cs_stack_lock);
}
}
pipe_mutex_unlock(cs->ws->cs_stack_lock);
radeon_drm_cs_emit_ioctl_oneshot(cs, cs->cst);
}
} else {

View File

@ -431,7 +431,6 @@ static void radeon_winsys_destroy(struct radeon_winsys *rws)
pipe_thread_wait(ws->thread);
}
pipe_semaphore_destroy(&ws->cs_queued);
pipe_condvar_destroy(ws->cs_queue_empty);
pipe_mutex_destroy(ws->hyperz_owner_mutex);
pipe_mutex_destroy(ws->cmask_owner_mutex);
@ -567,9 +566,6 @@ next:
}
ws->cs_stack[p_atomic_read(&ws->ncs) - 1] = NULL;
empty_stack = p_atomic_dec_zero(&ws->ncs);
if (empty_stack) {
pipe_condvar_signal(ws->cs_queue_empty);
}
pipe_mutex_unlock(ws->cs_stack_lock);
pipe_semaphore_signal(&cs->flush_completed);
@ -585,7 +581,6 @@ next:
ws->cs_stack[i] = NULL;
}
p_atomic_set(&ws->ncs, 0);
pipe_condvar_signal(ws->cs_queue_empty);
pipe_mutex_unlock(ws->cs_stack_lock);
return NULL;
}
@ -651,7 +646,6 @@ struct radeon_winsys *radeon_drm_winsys_create(int fd)
p_atomic_set(&ws->ncs, 0);
pipe_semaphore_init(&ws->cs_queued, 0);
pipe_condvar_init(ws->cs_queue_empty);
if (ws->num_cpus > 1 && debug_get_option_thread())
ws->thread = pipe_thread_create(radeon_drm_cs_emit_ioctl, ws);

View File

@ -67,11 +67,6 @@ struct radeon_drm_winsys {
/* rings submission thread */
pipe_mutex cs_stack_lock;
pipe_semaphore cs_queued;
/* we cannot use semaphore for empty queue because maintaining an even
* number of call to semaphore_wait and semaphore_signal is, to say the
* least, tricky
*/
pipe_condvar cs_queue_empty;
pipe_thread thread;
int kill_thread;
int ncs;