diff options
author | Francisco Jerez <currojerez@riseup.net> | 2010-10-09 04:02:09 +0200 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2010-11-18 14:38:10 +1000 |
commit | 907af60b93045ae33b450553167aa8f684252de3 (patch) | |
tree | 7271e5e96f81ccead0f25245414bcfa019c6a0c4 | |
parent | da3bd8203082794d26de3a0a6a7d1ee639d07eb1 (diff) | |
download | linux-3.10-907af60b93045ae33b450553167aa8f684252de3.tar.gz linux-3.10-907af60b93045ae33b450553167aa8f684252de3.tar.bz2 linux-3.10-907af60b93045ae33b450553167aa8f684252de3.zip |
drm/nouveau: Fix sleep while atomic in the semaphore code.
Signed-off-by: Francisco Jerez <currojerez@riseup.net>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_fence.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c index 441b12420bb..ab1bbfbf266 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fence.c +++ b/drivers/gpu/drm/nouveau/nouveau_fence.c @@ -249,6 +249,7 @@ alloc_semaphore(struct drm_device *dev) { struct drm_nouveau_private *dev_priv = dev->dev_private; struct nouveau_semaphore *sema; + int ret; if (!USE_SEMA(dev)) return NULL; @@ -257,10 +258,14 @@ alloc_semaphore(struct drm_device *dev) if (!sema) goto fail; + ret = drm_mm_pre_get(&dev_priv->fence.heap); + if (ret) + goto fail; + spin_lock(&dev_priv->fence.lock); sema->mem = drm_mm_search_free(&dev_priv->fence.heap, 4, 0, 0); if (sema->mem) - sema->mem = drm_mm_get_block(sema->mem, 4, 0); + sema->mem = drm_mm_get_block_atomic(sema->mem, 4, 0); spin_unlock(&dev_priv->fence.lock); if (!sema->mem) |