summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/nouveau/nouveau_fence.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2010-09-07 13:59:49 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2010-09-07 13:59:49 -0700
commit6300d6d755842f2ed18053ed6f868944d51b5aef (patch)
tree07cc64945858e12855c1c23c6ba213230d4f4988 /drivers/gpu/drm/nouveau/nouveau_fence.c
parente6ba59bcae6968ee18ef5a237a8020a0ea331ae1 (diff)
parentc7ef35a960369bcad733b92868e4befe03ba9234 (diff)
Merge branch 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6
* 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: drm: Do not force 1024x768 modes on unknown connectors drm/kms: Add a module parameter to disable polling drm/radeon/kms: fix tv-out on avivo asics drm/radeon/kms/evergreen: fix gpu hangs in userspace accel code drm/nv50: initialize ramht_refs list for faked 0 channel drm/nouveau: Don't take struct_mutex around the pushbuf IOCTL. drm/nouveau: Take fence spinlock before reading the last sequence. drm/radeon/kms/evergreen: work around bad data in some i2c tables drm/radeon/kms: properly set crtc high base on r7xx drm/radeon/kms: fix tv module parameter drm/radeon/kms: force legacy pll algo for RV515 LVDS drm/radeon/kms: remove useless clock code drm/radeon/kms: fix a regression on r7xx AGP due to the HDP flush fix drm/radeon/kms: use tracked values for sclk and mclk
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_fence.c')
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_fence.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c
index 6b208ffafa8..87ac21ec23d 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fence.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fence.c
@@ -64,16 +64,17 @@ nouveau_fence_update(struct nouveau_channel *chan)
struct nouveau_fence *fence;
uint32_t sequence;
+ spin_lock(&chan->fence.lock);
+
if (USE_REFCNT)
sequence = nvchan_rd32(chan, 0x48);
else
sequence = atomic_read(&chan->fence.last_sequence_irq);
if (chan->fence.sequence_ack == sequence)
- return;
+ goto out;
chan->fence.sequence_ack = sequence;
- spin_lock(&chan->fence.lock);
list_for_each_safe(entry, tmp, &chan->fence.pending) {
fence = list_entry(entry, struct nouveau_fence, entry);
@@ -85,6 +86,7 @@ nouveau_fence_update(struct nouveau_channel *chan)
if (sequence == chan->fence.sequence_ack)
break;
}
+out:
spin_unlock(&chan->fence.lock);
}