op 14-05-14 17:29, Christian König schreef:Ah, I see. That's also the reason why you moved the wake_up_all out of the processing function.
It's not a race condition because fence_queue.lock is held when this function is called.+ /* did fence get signaled after we enabled the sw irq? */That looks like a race condition to me. The fence needs to be added to the wait queue before the check, not after.
+ if (atomic64_read(&fence->rdev->fence_drv[fence->ring].last_seq) >= fence->seq) {
+ radeon_irq_kms_sw_irq_put(fence->rdev, fence->ring);
+ return false;
+ }
+
+ fence->fence_wake.flags = 0;
+ fence->fence_wake.private = NULL;
+ fence->fence_wake.func = radeon_fence_check_signaled;
+ __add_wait_queue(&fence->rdev->fence_queue, &fence->fence_wake);
+ fence_get(f);
Apart from that the whole approach looks like a really bad idea to me. How for example is lockup detection supposed to happen with this?
Timeouts help with the detection of the lockup, but not at all with the handling of them.
Lockup's a bit of a weird problem, the changes wouldn't allow core ttm code to handle the lockup any more,
but any driver specific wait code would still handle this. I did this by design, because in future patches the wait
function may be called from outside of the radeon driver. The official wait function takes a timeout parameter,
so lockups wouldn't be fatal if the timeout is set to something like 30*HZ for example, it would still return
and report that the function timed out.
~Maarten