[PATCH 124/124] drm/i915: Allow i915_gem_object_pin_pages() to be nested
Chris Wilson
chris at chris-wilson.co.uk
Mon Sep 10 21:43:44 UTC 2018
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
drivers/gpu/drm/i915/i915_gem_object.c | 5 +++--
drivers/gpu/drm/i915/i915_gem_object.h | 25 +++++++++++++++++--------
2 files changed, 20 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_gem_object.c b/drivers/gpu/drm/i915/i915_gem_object.c
index b459acecffc8..dc91b4a106f8 100644
--- a/drivers/gpu/drm/i915/i915_gem_object.c
+++ b/drivers/gpu/drm/i915/i915_gem_object.c
@@ -235,11 +235,12 @@ static int ____i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
* either as a result of memory pressure (reaping pages under the shrinker)
* or as the object is itself released.
*/
-int __i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
+int __i915_gem_object_get_pages(struct drm_i915_gem_object *obj,
+ enum i915_mm_subclass subclass)
{
int err;
- err = mutex_lock_interruptible(&obj->mm.lock);
+ err = mutex_lock_interruptible_nested(&obj->mm.lock, subclass);
if (err)
return err;
diff --git a/drivers/gpu/drm/i915/i915_gem_object.h b/drivers/gpu/drm/i915/i915_gem_object.h
index a8b5d693cfc6..8128c8169456 100644
--- a/drivers/gpu/drm/i915/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/i915_gem_object.h
@@ -530,13 +530,21 @@ dma_addr_t
i915_gem_object_get_dma_address(struct drm_i915_gem_object *obj,
unsigned long n);
+enum i915_mm_subclass { /* lockdep subclass for obj->mm.lock */
+ I915_MM_NORMAL = 0,
+ I915_MM_PROXY,
+ I915_MM_SHRINKER
+};
+
void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj,
struct sg_table *pages,
unsigned int sg_page_sizes);
-int __i915_gem_object_get_pages(struct drm_i915_gem_object *obj);
+int __i915_gem_object_get_pages(struct drm_i915_gem_object *obj,
+ enum i915_mm_subclass subclass);
static inline int __must_check
-i915_gem_object_pin_pages(struct drm_i915_gem_object *obj)
+i915_gem_object_pin_pages_nested(struct drm_i915_gem_object *obj,
+ enum i915_mm_subclass subclass)
{
might_lock(&obj->mm.lock);
@@ -545,7 +553,13 @@ i915_gem_object_pin_pages(struct drm_i915_gem_object *obj)
if (atomic_inc_not_zero(&obj->mm.pages_pin_count))
return 0;
- return __i915_gem_object_get_pages(obj);
+ return __i915_gem_object_get_pages(obj, subclass);
+}
+
+static inline int __must_check
+i915_gem_object_pin_pages(struct drm_i915_gem_object *obj)
+{
+ return i915_gem_object_pin_pages_nested(obj, I915_MM_NORMAL);
}
static inline bool
@@ -583,11 +597,6 @@ i915_gem_object_unpin_pages(struct drm_i915_gem_object *obj)
__i915_gem_object_unpin_pages(obj);
}
-enum i915_mm_subclass { /* lockdep subclass for obj->mm.lock */
- I915_MM_NORMAL = 0,
- I915_MM_SHRINKER
-};
-
void __i915_gem_object_put_pages(struct drm_i915_gem_object *obj,
enum i915_mm_subclass subclass);
void __i915_gem_object_invalidate(struct drm_i915_gem_object *obj);
--
2.19.0.rc2
More information about the Intel-gfx-trybot
mailing list