drm/nv50-nvc0/vm: take client reference on shared channel vm
authorBen Skeggs <bskeggs@redhat.com>
Fri, 3 Jun 2011 00:07:08 +0000 (10:07 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 23 Jun 2011 05:58:46 +0000 (15:58 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_drv.h
drivers/gpu/drm/nouveau/nouveau_state.c

index 633f1e6..a499536 100644 (file)
@@ -48,6 +48,7 @@
 struct nouveau_fpriv {
        spinlock_t lock;
        struct list_head channels;
+       struct nouveau_vm *vm;
 };
 
 static inline struct nouveau_fpriv *
index b38b280..12b3471 100644 (file)
@@ -767,6 +767,7 @@ static void nouveau_card_takedown(struct drm_device *dev)
 int
 nouveau_open(struct drm_device *dev, struct drm_file *file_priv)
 {
+       struct drm_nouveau_private *dev_priv = dev->dev_private;
        struct nouveau_fpriv *fpriv;
 
        fpriv = kzalloc(sizeof(*fpriv), GFP_KERNEL);
@@ -776,6 +777,9 @@ nouveau_open(struct drm_device *dev, struct drm_file *file_priv)
        spin_lock_init(&fpriv->lock);
        INIT_LIST_HEAD(&fpriv->channels);
 
+       if (dev_priv->card_type >= NV_50)
+               nouveau_vm_ref(dev_priv->chan_vm, &fpriv->vm, NULL);
+
        file_priv->driver_priv = fpriv;
        return 0;
 }
@@ -791,6 +795,7 @@ void
 nouveau_postclose(struct drm_device *dev, struct drm_file *file_priv)
 {
        struct nouveau_fpriv *fpriv = nouveau_fpriv(file_priv);
+       nouveau_vm_ref(NULL, &fpriv->vm, NULL);
        kfree(fpriv);
 }