diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 891c3bff5ae0..b878f82146f1 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -1085,8 +1085,28 @@ drm_gem_open(struct drm_device *dev, struct drm_file *file_private) void drm_gem_release(struct drm_device *dev, struct drm_file *file_private) { - idr_for_each(&file_private->object_idr, - &drm_gem_object_release_handle, file_private); + struct drm_gem_object *obj; + int next_id; + + next_id = 0; + while (1) { + spin_lock(&file_private->table_lock); + obj = idr_get_next(&file_private->object_idr, &next_id); + if (!obj) { + spin_unlock(&file_private->table_lock); + break; + } + /* Claim the handle — same pattern as drm_gem_handle_delete */ + idr_replace(&file_private->object_idr, NULL, next_id); + spin_unlock(&file_private->table_lock); + + drm_gem_object_release_handle(next_id, obj, file_private); + + spin_lock(&file_private->table_lock); + idr_remove(&file_private->object_idr, next_id); + spin_unlock(&file_private->table_lock); + next_id++; + } idr_destroy(&file_private->object_idr); }