[PATCH] drm/ttm: Fix up a theoretical deadlock

2010-11-11 Thread Thomas Hellstrom
A process suspended waiting for a higher sequence or no sequence to unreserve,
a bo may be beaten to the reservation by a process with a lower sequence.
In that case the first process should give up trying to reserve and
return -EAGAIN. In order for that to happen, we must wake waiting processes
when we change sequence, so that they have a chance to detect the new
sequence.

Signed-off-by: Thomas Hellstrom 
---
 drivers/gpu/drm/ttm/ttm_bo.c |   11 +++
 1 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 3ca77dc..148a322 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -224,6 +224,9 @@ int ttm_bo_reserve_locked(struct ttm_buffer_object *bo,
int ret;

while (unlikely(atomic_cmpxchg(>reserved, 0, 1) != 0)) {
+   /**
+* Deadlock avoidance for multi-bo reserving.
+*/
if (use_sequence && bo->seq_valid &&
(sequence - bo->val_seq < (1 << 31))) {
return -EAGAIN;
@@ -241,6 +244,14 @@ int ttm_bo_reserve_locked(struct ttm_buffer_object *bo,
}

if (use_sequence) {
+   /**
+* Wake up waiters that may need to recheck for deadlock,
+* if we decreased the sequence number.
+*/
+   if (unlikely((bo->val_seq - sequence < (1 << 31))
+|| !bo->seq_valid))
+   wake_up_all(>event_queue);
+
bo->val_seq = sequence;
bo->seq_valid = true;
} else {
-- 
1.6.2.5



[PATCH] drm/ttm: Fix up a theoretical deadlock

2010-11-11 Thread Thomas Hellstrom
A process suspended waiting for a higher sequence or no sequence to unreserve,
a bo may be beaten to the reservation by a process with a lower sequence.
In that case the first process should give up trying to reserve and
return -EAGAIN. In order for that to happen, we must wake waiting processes
when we change sequence, so that they have a chance to detect the new
sequence.

Signed-off-by: Thomas Hellstrom thellst...@vmware.com
---
 drivers/gpu/drm/ttm/ttm_bo.c |   11 +++
 1 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 3ca77dc..148a322 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -224,6 +224,9 @@ int ttm_bo_reserve_locked(struct ttm_buffer_object *bo,
int ret;
 
while (unlikely(atomic_cmpxchg(bo-reserved, 0, 1) != 0)) {
+   /**
+* Deadlock avoidance for multi-bo reserving.
+*/
if (use_sequence  bo-seq_valid 
(sequence - bo-val_seq  (1  31))) {
return -EAGAIN;
@@ -241,6 +244,14 @@ int ttm_bo_reserve_locked(struct ttm_buffer_object *bo,
}
 
if (use_sequence) {
+   /**
+* Wake up waiters that may need to recheck for deadlock,
+* if we decreased the sequence number.
+*/
+   if (unlikely((bo-val_seq - sequence  (1  31))
+|| !bo-seq_valid))
+   wake_up_all(bo-event_queue);
+
bo-val_seq = sequence;
bo-seq_valid = true;
} else {
-- 
1.6.2.5

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel