summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/ttm/ttm_bo.c
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2010-12-22 12:56:10 +0900
committerPaul Mundt <lethal@linux-sh.org>2010-12-22 12:56:10 +0900
commit7ccbefe07ea0a3570e44d1ec13a307552ee4dadd (patch)
treeba0299694a9f3940f289b6a29cadab853906e3d2 /drivers/gpu/drm/ttm/ttm_bo.c
parent623eb15647fc35c5a8cd38985d5958240eb072c1 (diff)
parent90a8a73c06cc32b609a880d48449d7083327e11a (diff)
downloadtalos-op-linux-7ccbefe07ea0a3570e44d1ec13a307552ee4dadd.tar.gz
talos-op-linux-7ccbefe07ea0a3570e44d1ec13a307552ee4dadd.zip
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'drivers/gpu/drm/ttm/ttm_bo.c')
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo.c11
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 3ca77dc03915..148a322d8f5d 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 {
OpenPOWER on IntegriCloud