|
@@ -3208,6 +3208,19 @@ i915_gem_object_create_from_data(struct drm_i915_private *dev_priv,
|
|
void i915_gem_close_object(struct drm_gem_object *gem, struct drm_file *file);
|
|
void i915_gem_close_object(struct drm_gem_object *gem, struct drm_file *file);
|
|
void i915_gem_free_object(struct drm_gem_object *obj);
|
|
void i915_gem_free_object(struct drm_gem_object *obj);
|
|
|
|
|
|
|
|
+static inline void i915_gem_drain_freed_objects(struct drm_i915_private *i915)
|
|
|
|
+{
|
|
|
|
+ /* A single pass should suffice to release all the freed objects (along
|
|
|
|
+ * most call paths) , but be a little more paranoid in that freeing
|
|
|
|
+ * the objects does take a little amount of time, during which the rcu
|
|
|
|
+ * callbacks could have added new objects into the freed list, and
|
|
|
|
+ * armed the work again.
|
|
|
|
+ */
|
|
|
|
+ do {
|
|
|
|
+ rcu_barrier();
|
|
|
|
+ } while (flush_work(&i915->mm.free_work));
|
|
|
|
+}
|
|
|
|
+
|
|
struct i915_vma * __must_check
|
|
struct i915_vma * __must_check
|
|
i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj,
|
|
i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj,
|
|
const struct i915_ggtt_view *view,
|
|
const struct i915_ggtt_view *view,
|