struct qxl_release **ret)
{
struct qxl_release *release;
- int handle;
+ int err;
size_t size = sizeof(*release);
release = kmalloc(size, GFP_KERNEL);
release->surface_release_id = 0;
INIT_LIST_HEAD(&release->bos);
- idr_preload(GFP_KERNEL);
- spin_lock(&qdev->release_idr_lock);
- handle = idr_alloc(&qdev->release_idr, release, 1, 0, GFP_NOWAIT);
+ xa_lock(&qdev->releases);
+ err = __xa_alloc(&qdev->releases, &release->id, release, xa_limit_31b,
+ GFP_KERNEL);
release->base.seqno = ++qdev->release_seqno;
- spin_unlock(&qdev->release_idr_lock);
- idr_preload_end();
- if (handle < 0) {
+ xa_unlock(&qdev->releases);
+ if (err < 0) {
kfree(release);
*ret = NULL;
- return handle;
+ return err;
}
*ret = release;
- DRM_DEBUG_DRIVER("allocated release %d\n", handle);
- release->id = handle;
- return handle;
+ DRM_DEBUG_DRIVER("allocated release %d\n", release->id);
+ return release->id;
}
static void
if (release->surface_release_id)
qxl_surface_id_dealloc(qdev, release->surface_release_id);
- spin_lock(&qdev->release_idr_lock);
- idr_remove(&qdev->release_idr, release->id);
- spin_unlock(&qdev->release_idr_lock);
+ xa_erase(&qdev->releases, release->id);
if (release->base.ops) {
WARN_ON(list_empty(&release->bos));
struct qxl_release **release)
{
if (surface_cmd_type == QXL_SURFACE_CMD_DESTROY && create_rel) {
- int idr_ret;
+ int id;
struct qxl_bo *bo;
union qxl_release_info *info;
/* stash the release after the create command */
- idr_ret = qxl_release_alloc(qdev, QXL_RELEASE_SURFACE_CMD, release);
- if (idr_ret < 0)
- return idr_ret;
+ id = qxl_release_alloc(qdev, QXL_RELEASE_SURFACE_CMD, release);
+ if (id < 0)
+ return id;
bo = create_rel->release_bo;
(*release)->release_bo = bo;
qxl_release_list_add(*release, bo);
info = qxl_release_map(qdev, *release);
- info->id = idr_ret;
+ info->id = id;
qxl_release_unmap(qdev, *release, info);
return 0;
}
struct qxl_bo **rbo)
{
struct qxl_bo *bo;
- int idr_ret;
+ int id;
int ret = 0;
union qxl_release_info *info;
int cur_idx;
return -EINVAL;
}
- idr_ret = qxl_release_alloc(qdev, type, release);
- if (idr_ret < 0) {
+ id = qxl_release_alloc(qdev, type, release);
+ if (id < 0) {
if (rbo)
*rbo = NULL;
- return idr_ret;
+ return id;
}
mutex_lock(&qdev->release_mutex);
}
info = qxl_release_map(qdev, *release);
- info->id = idr_ret;
+ info->id = id;
qxl_release_unmap(qdev, *release, info);
return ret;
{
struct qxl_release *release;
- spin_lock(&qdev->release_idr_lock);
- release = idr_find(&qdev->release_idr, id);
- spin_unlock(&qdev->release_idr_lock);
- if (!release) {
- DRM_ERROR("failed to find id in release_idr\n");
- return NULL;
- }
+ release = xa_load(&qdev->releases, id);
+ if (!release)
+ DRM_ERROR("failed to find id in releases\n");
return release;
}