|
@@ -4490,13 +4490,14 @@ static void __i915_gem_free_objects(struct drm_i915_private *i915,
|
|
|
{
|
|
|
struct drm_i915_gem_object *obj, *on;
|
|
|
|
|
|
- mutex_lock(&i915->drm.struct_mutex);
|
|
|
intel_runtime_pm_get(i915);
|
|
|
- llist_for_each_entry(obj, freed, freed) {
|
|
|
+ llist_for_each_entry_safe(obj, on, freed, freed) {
|
|
|
struct i915_vma *vma, *vn;
|
|
|
|
|
|
trace_i915_gem_object_destroy(obj);
|
|
|
|
|
|
+ mutex_lock(&i915->drm.struct_mutex);
|
|
|
+
|
|
|
GEM_BUG_ON(i915_gem_object_is_active(obj));
|
|
|
list_for_each_entry_safe(vma, vn,
|
|
|
&obj->vma_list, obj_link) {
|
|
@@ -4519,13 +4520,8 @@ static void __i915_gem_free_objects(struct drm_i915_private *i915,
|
|
|
spin_unlock(&i915->mm.obj_lock);
|
|
|
}
|
|
|
|
|
|
- }
|
|
|
- intel_runtime_pm_put(i915);
|
|
|
- mutex_unlock(&i915->drm.struct_mutex);
|
|
|
-
|
|
|
- cond_resched();
|
|
|
+ mutex_unlock(&i915->drm.struct_mutex);
|
|
|
|
|
|
- llist_for_each_entry_safe(obj, on, freed, freed) {
|
|
|
GEM_BUG_ON(obj->bind_count);
|
|
|
GEM_BUG_ON(obj->userfault_count);
|
|
|
GEM_BUG_ON(atomic_read(&obj->frontbuffer_bits));
|
|
@@ -4548,7 +4544,11 @@ static void __i915_gem_free_objects(struct drm_i915_private *i915,
|
|
|
|
|
|
kfree(obj->bit_17);
|
|
|
i915_gem_object_free(obj);
|
|
|
+
|
|
|
+ if (on)
|
|
|
+ cond_resched();
|
|
|
}
|
|
|
+ intel_runtime_pm_put(i915);
|
|
|
}
|
|
|
|
|
|
static void i915_gem_flush_free_objects(struct drm_i915_private *i915)
|