drm/nouveau: Add a separate class for the kernel channel mutex.
authorFrancisco Jerez <currojerez@riseup.net>
Mon, 25 Oct 2010 21:38:59 +0000 (23:38 +0200)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 3 Dec 2010 05:11:18 +0000 (15:11 +1000)
nouveau_bo_move_m2mf() needs to lock the kernel channel, and it may be
called from the pushbuf IOCTL with an user channel already locked. Use
a separate subclass for the kernel channel mutex because this is
legitimate mutex nesting.

Signed-off-by: Francisco Jerez <currojerez@riseup.net>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/nouveau/nouveau_drv.h

index cdc8f544d47f1d31660592dc951bbf5218148de9..099f806f39eda91ed6df51e886c84c4f090dade0 100644 (file)
@@ -678,7 +678,7 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr,
        chan = nvbo->channel;
        if (!chan || nvbo->no_vm) {
                chan = dev_priv->channel;
-               mutex_lock(&chan->mutex);
+               mutex_lock_nested(&chan->mutex, NOUVEAU_KCHANNEL_MUTEX);
        }
 
        if (dev_priv->card_type < NV_50)
index 5814db82f778cc297ab6205f643af591c2f566b5..ce0475ead3812f5664c9a45f35398fbd8b77c0aa 100644 (file)
@@ -173,6 +173,11 @@ struct nouveau_page_flip_state {
        uint64_t offset;
 };
 
+enum nouveau_channel_mutex_class {
+       NOUVEAU_UCHANNEL_MUTEX,
+       NOUVEAU_KCHANNEL_MUTEX
+};
+
 struct nouveau_channel {
        struct drm_device *dev;
        int id;