aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_prime.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/drm_prime.c')
-rw-r--r--drivers/gpu/drm/drm_prime.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index 5737cb8c6f03..231e3f6d5f41 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -663,24 +663,33 @@ EXPORT_SYMBOL(drm_gem_prime_handle_to_fd);
663 */ 663 */
664int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma) 664int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
665{ 665{
666 /* Used by drm_gem_mmap() to lookup the GEM object */ 666 struct drm_file *priv;
667 struct drm_file priv = { 667 struct file *fil;
668 .minor = obj->dev->primary,
669 };
670 struct file fil = {
671 .private_data = &priv,
672 };
673 int ret; 668 int ret;
674 669
675 ret = drm_vma_node_allow(&obj->vma_node, &priv); 670 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
671 fil = kzalloc(sizeof(*fil), GFP_KERNEL);
672 if (!priv || !fil) {
673 ret = -ENOMEM;
674 goto out;
675 }
676
677 /* Used by drm_gem_mmap() to lookup the GEM object */
678 priv->minor = obj->dev->primary;
679 fil->private_data = priv;
680
681 ret = drm_vma_node_allow(&obj->vma_node, priv);
676 if (ret) 682 if (ret)
677 return ret; 683 goto out;
678 684
679 vma->vm_pgoff += drm_vma_node_start(&obj->vma_node); 685 vma->vm_pgoff += drm_vma_node_start(&obj->vma_node);
680 686
681 ret = obj->dev->driver->fops->mmap(&fil, vma); 687 ret = obj->dev->driver->fops->mmap(fil, vma);
682 688
683 drm_vma_node_revoke(&obj->vma_node, &priv); 689 drm_vma_node_revoke(&obj->vma_node, priv);
690out:
691 kfree(priv);
692 kfree(fil);
684 693
685 return ret; 694 return ret;
686} 695}