Merge branch 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[cascardo/linux.git] / drivers / gpu / drm / etnaviv / etnaviv_gem.c
index 8c6f750..0370b84 100644 (file)
@@ -535,8 +535,7 @@ void etnaviv_gem_describe_objects(struct etnaviv_drm_private *priv,
 
 static void etnaviv_gem_shmem_release(struct etnaviv_gem_object *etnaviv_obj)
 {
-       if (etnaviv_obj->vaddr)
-               vunmap(etnaviv_obj->vaddr);
+       vunmap(etnaviv_obj->vaddr);
        put_pages(etnaviv_obj);
 }
 
@@ -670,9 +669,7 @@ static struct drm_gem_object *__etnaviv_gem_new(struct drm_device *dev,
        return obj;
 
 fail:
-       if (obj)
-               drm_gem_object_unreference_unlocked(obj);
-
+       drm_gem_object_unreference_unlocked(obj);
        return ERR_PTR(ret);
 }
 
@@ -751,19 +748,22 @@ static struct page **etnaviv_gem_userptr_do_get_pages(
        int ret = 0, pinned, npages = etnaviv_obj->base.size >> PAGE_SHIFT;
        struct page **pvec;
        uintptr_t ptr;
+       unsigned int flags = 0;
 
        pvec = drm_malloc_ab(npages, sizeof(struct page *));
        if (!pvec)
                return ERR_PTR(-ENOMEM);
 
+       if (!etnaviv_obj->userptr.ro)
+               flags |= FOLL_WRITE;
+
        pinned = 0;
        ptr = etnaviv_obj->userptr.ptr;
 
        down_read(&mm->mmap_sem);
        while (pinned < npages) {
                ret = get_user_pages_remote(task, mm, ptr, npages - pinned,
-                                           !etnaviv_obj->userptr.ro, 0,
-                                           pvec + pinned, NULL);
+                                           flags, pvec + pinned, NULL);
                if (ret < 0)
                        break;
 
@@ -916,15 +916,12 @@ int etnaviv_gem_new_userptr(struct drm_device *dev, struct drm_file *file,
        get_task_struct(current);
 
        ret = etnaviv_gem_obj_add(dev, &etnaviv_obj->base);
-       if (ret) {
-               drm_gem_object_unreference_unlocked(&etnaviv_obj->base);
-               return ret;
-       }
+       if (ret)
+               goto unreference;
 
        ret = drm_gem_handle_create(file, &etnaviv_obj->base, handle);
-
+unreference:
        /* drop reference from allocate - handle holds it now */
        drm_gem_object_unreference_unlocked(&etnaviv_obj->base);
-
        return ret;
 }