These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / gpu / drm / qxl / qxl_release.c
index d9b2568..4efa8e2 100644 (file)
@@ -122,7 +122,7 @@ static const struct fence_ops qxl_fence_ops = {
        .wait = qxl_fence_wait,
 };
 
-static uint64_t
+static int
 qxl_release_alloc(struct qxl_device *qdev, int type,
                  struct qxl_release **ret)
 {
@@ -153,7 +153,7 @@ qxl_release_alloc(struct qxl_device *qdev, int type,
                return handle;
        }
        *ret = release;
-       QXL_INFO(qdev, "allocated release %lld\n", handle);
+       QXL_INFO(qdev, "allocated release %d\n", handle);
        release->id = handle;
        return handle;
 }
@@ -307,7 +307,7 @@ int qxl_alloc_surface_release_reserved(struct qxl_device *qdev,
                idr_ret = qxl_release_alloc(qdev, QXL_RELEASE_SURFACE_CMD, release);
                if (idr_ret < 0)
                        return idr_ret;
-               bo = qxl_bo_ref(to_qxl_bo(entry->tv.bo));
+               bo = to_qxl_bo(entry->tv.bo);
 
                (*release)->release_offset = create_rel->release_offset + 64;
 
@@ -316,8 +316,6 @@ int qxl_alloc_surface_release_reserved(struct qxl_device *qdev,
                info = qxl_release_map(qdev, *release);
                info->id = idr_ret;
                qxl_release_unmap(qdev, *release, info);
-
-               qxl_bo_unref(&bo);
                return 0;
        }
 
@@ -363,6 +361,7 @@ int qxl_alloc_release_reserved(struct qxl_device *qdev, unsigned long size,
                ret = qxl_release_bo_alloc(qdev, &qdev->current_release_bo[cur_idx]);
                if (ret) {
                        mutex_unlock(&qdev->release_mutex);
+                       qxl_release_free(qdev, *release);
                        return ret;
                }
        }
@@ -377,13 +376,17 @@ int qxl_alloc_release_reserved(struct qxl_device *qdev, unsigned long size,
 
        mutex_unlock(&qdev->release_mutex);
 
-       qxl_release_list_add(*release, bo);
+       ret = qxl_release_list_add(*release, bo);
+       qxl_bo_unref(&bo);
+       if (ret) {
+               qxl_release_free(qdev, *release);
+               return ret;
+       }
 
        info = qxl_release_map(qdev, *release);
        info->id = idr_ret;
        qxl_release_unmap(qdev, *release, info);
 
-       qxl_bo_unref(&bo);
        return ret;
 }