[PATCH 26/27] drm/i915: Convert i915_gem_object_attach_phys() to ww locking
Maarten Lankhorst
maarten.lankhorst at linux.intel.com
Tue Aug 18 13:39:45 UTC 2020
Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
---
drivers/gpu/drm/i915/gem/i915_gem_phys.c | 35 +++++++++++++++++-------
1 file changed, 25 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_phys.c b/drivers/gpu/drm/i915/gem/i915_gem_phys.c
index 28147aab47b9..3548267b8572 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_phys.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_phys.c
@@ -149,37 +149,46 @@ static const struct drm_i915_gem_object_ops i915_gem_phys_ops = {
int i915_gem_object_attach_phys(struct drm_i915_gem_object *obj, int align)
{
+ struct i915_gem_ww_ctx ww;
struct sg_table *pages;
int err;
if (align > obj->base.size)
return -EINVAL;
+ i915_gem_ww_ctx_init(&ww, true);
+retry:
+ err = i915_gem_object_lock(obj, &ww);
+ if (err)
+ goto out;
+
if (obj->ops == &i915_gem_phys_ops)
- return 0;
+ goto out;
- if (obj->ops != &i915_gem_shmem_ops)
- return -EINVAL;
+ if (obj->ops != &i915_gem_shmem_ops) {
+ err = -EINVAL;
+ goto out;
+ }
err = i915_gem_object_unbind(obj, I915_GEM_OBJECT_UNBIND_ACTIVE);
if (err)
- return err;
+ goto out;
mutex_lock_nested(&obj->mm.lock, I915_MM_GET_PAGES);
if (obj->mm.madv != I915_MADV_WILLNEED) {
err = -EFAULT;
- goto err_unlock;
+ goto out_unlock;
}
if (obj->mm.quirked) {
err = -EFAULT;
- goto err_unlock;
+ goto out_unlock;
}
if (obj->mm.mapping) {
err = -EBUSY;
- goto err_unlock;
+ goto out_unlock;
}
pages = __i915_gem_object_unset_pages(obj);
@@ -198,8 +207,7 @@ int i915_gem_object_attach_phys(struct drm_i915_gem_object *obj, int align)
i915_gem_object_release_memory_region(obj);
- mutex_unlock(&obj->mm.lock);
- return 0;
+ goto out_unlock;
err_xfer:
obj->ops = &i915_gem_shmem_ops;
@@ -208,8 +216,15 @@ int i915_gem_object_attach_phys(struct drm_i915_gem_object *obj, int align)
__i915_gem_object_set_pages(obj, pages, sg_page_sizes);
}
-err_unlock:
+out_unlock:
mutex_unlock(&obj->mm.lock);
+out:
+ if (err == -EDEADLK) {
+ err = i915_gem_ww_ctx_backoff(&ww);
+ if (!err)
+ goto retry;
+ }
+ i915_gem_ww_ctx_fini(&ww);
return err;
}
--
2.28.0
More information about the Intel-gfx-trybot
mailing list