aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/qxl/qxl_release.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/qxl/qxl_release.c')
-rw-r--r--drivers/gpu/drm/qxl/qxl_release.c21
1 files changed, 9 insertions, 12 deletions
diff --git a/drivers/gpu/drm/qxl/qxl_release.c b/drivers/gpu/drm/qxl/qxl_release.c
index c4267c71dd2d..b443d6751d5f 100644
--- a/drivers/gpu/drm/qxl/qxl_release.c
+++ b/drivers/gpu/drm/qxl/qxl_release.c
@@ -43,7 +43,7 @@ qxl_release_alloc(struct qxl_device *qdev, int type,
43 struct qxl_release **ret) 43 struct qxl_release **ret)
44{ 44{
45 struct qxl_release *release; 45 struct qxl_release *release;
46 int handle = 0; 46 int handle;
47 size_t size = sizeof(*release); 47 size_t size = sizeof(*release);
48 int idr_ret; 48 int idr_ret;
49 49
@@ -56,19 +56,16 @@ qxl_release_alloc(struct qxl_device *qdev, int type,
56 release->bo_count = 0; 56 release->bo_count = 0;
57 release->release_offset = 0; 57 release->release_offset = 0;
58 release->surface_release_id = 0; 58 release->surface_release_id = 0;
59again: 59
60 if (idr_pre_get(&qdev->release_idr, GFP_KERNEL) == 0) { 60 idr_preload(GFP_KERNEL);
61 DRM_ERROR("Out of memory for release idr\n");
62 kfree(release);
63 goto release_fail;
64 }
65 spin_lock(&qdev->release_idr_lock); 61 spin_lock(&qdev->release_idr_lock);
66 idr_ret = idr_get_new_above(&qdev->release_idr, release, 1, &handle); 62 idr_ret = idr_alloc(&qdev->release_idr, release, 1, 0, GFP_NOWAIT);
67 spin_unlock(&qdev->release_idr_lock); 63 spin_unlock(&qdev->release_idr_lock);
68 if (idr_ret == -EAGAIN) 64 idr_preload_end();
69 goto again; 65 handle = idr_ret;
70 if (ret) 66 if (idr_ret < 0)
71 *ret = release; 67 goto release_fail;
68 *ret = release;
72 QXL_INFO(qdev, "allocated release %lld\n", handle); 69 QXL_INFO(qdev, "allocated release %lld\n", handle);
73 release->id = handle; 70 release->id = handle;
74release_fail: 71release_fail: