diff options
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_cmd.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_release.c | 21 |
2 files changed, 16 insertions, 24 deletions
diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c index 736365e6ca8..08b0823c93d 100644 --- a/drivers/gpu/drm/qxl/qxl_cmd.c +++ b/drivers/gpu/drm/qxl/qxl_cmd.c @@ -435,22 +435,18 @@ void qxl_io_monitors_config(struct qxl_device *qdev) int qxl_surface_id_alloc(struct qxl_device *qdev, struct qxl_bo *surf) { - uint32_t handle = -ENOMEM; + uint32_t handle; int idr_ret; int count = 0; again: - if (idr_pre_get(&qdev->surf_id_idr, GFP_ATOMIC) == 0) { - DRM_ERROR("Out of memory for surf idr\n"); - kfree(surf); - goto alloc_fail; - } - + idr_preload(GFP_ATOMIC); spin_lock(&qdev->surf_id_idr_lock); - idr_ret = idr_get_new_above(&qdev->surf_id_idr, NULL, 1, &handle); + idr_ret = idr_alloc(&qdev->surf_id_idr, NULL, 1, 0, GFP_NOWAIT); spin_unlock(&qdev->surf_id_idr_lock); - - if (idr_ret == -EAGAIN) - goto again; + idr_preload_end(); + if (idr_ret < 0) + return idr_ret; + handle = idr_ret; if (handle >= qdev->rom->n_surfaces) { count++; @@ -465,7 +461,6 @@ again: spin_lock(&qdev->surf_id_idr_lock); qdev->last_alloced_surf_id = handle; spin_unlock(&qdev->surf_id_idr_lock); - alloc_fail: return 0; } diff --git a/drivers/gpu/drm/qxl/qxl_release.c b/drivers/gpu/drm/qxl/qxl_release.c index c4267c71dd2..b443d6751d5 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, struct qxl_release **ret) { struct qxl_release *release; - int handle = 0; + int handle; size_t size = sizeof(*release); int idr_ret; @@ -56,19 +56,16 @@ qxl_release_alloc(struct qxl_device *qdev, int type, release->bo_count = 0; release->release_offset = 0; release->surface_release_id = 0; -again: - if (idr_pre_get(&qdev->release_idr, GFP_KERNEL) == 0) { - DRM_ERROR("Out of memory for release idr\n"); - kfree(release); - goto release_fail; - } + + idr_preload(GFP_KERNEL); spin_lock(&qdev->release_idr_lock); - idr_ret = idr_get_new_above(&qdev->release_idr, release, 1, &handle); + idr_ret = idr_alloc(&qdev->release_idr, release, 1, 0, GFP_NOWAIT); spin_unlock(&qdev->release_idr_lock); - if (idr_ret == -EAGAIN) - goto again; - if (ret) - *ret = release; + idr_preload_end(); + handle = idr_ret; + if (idr_ret < 0) + goto release_fail; + *ret = release; QXL_INFO(qdev, "allocated release %lld\n", handle); release->id = handle; release_fail: |