[Intel-gfx] [PATCH 55/55] Revert "drm/i915: Clean up associated VMAs on context destruction"
Joonas Lahtinen
joonas.lahtinen at linux.intel.com
Wed Jul 27 10:18:13 UTC 2016
On ma, 2016-07-25 at 18:32 +0100, Chris Wilson wrote:
> This reverts commit e9f24d5fb7cf3628b195b18ff3ac4e37937ceeae.
>
> The patch was only a stop-gap measure that fixed half the problem - the
> leak of the fbcon when restarting X. A complete solution required
> releasing the VMA when the object itself was closed rather than rely on
> file/process exit. The previous patches add the VMA tracking necessary
> to do close them along with the object, context or file, and so the time
> has come to remove the partial fix.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
With the improvements in tracking, makes sense.
Reviewed-by: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> ---
> drivers/gpu/drm/i915/i915_drv.h | 5 -----
> drivers/gpu/drm/i915/i915_gem.c | 14 ++------------
> drivers/gpu/drm/i915/i915_gem_context.c | 22 ----------------------
> drivers/gpu/drm/i915/i915_gem_gtt.c | 2 +-
> 4 files changed, 3 insertions(+), 40 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index c6c64003504f..40033ca30e55 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -3044,11 +3044,6 @@ int i915_vma_bind(struct i915_vma *vma, enum i915_cache_level cache_level,
> u32 flags);
> void __i915_vma_set_map_and_fenceable(struct i915_vma *vma);
> int __must_check i915_vma_unbind(struct i915_vma *vma);
> -/*
> - * BEWARE: Do not use the function below unless you can _absolutely_
> - * _guarantee_ VMA in question is _not in use_ anywhere.
> - */
> -int __must_check __i915_vma_unbind_no_wait(struct i915_vma *vma);
> void i915_vma_close(struct i915_vma *vma);
> void i915_vma_destroy(struct i915_vma *vma);
>
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 0d9a80b41101..e3278f4e1ad2 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -2810,7 +2810,7 @@ static void __i915_vma_iounmap(struct i915_vma *vma)
> vma->iomap = NULL;
> }
>
> -static int __i915_vma_unbind(struct i915_vma *vma, bool wait)
> +int i915_vma_unbind(struct i915_vma *vma)
> {
> struct drm_i915_gem_object *obj = vma->obj;
> unsigned long active;
> @@ -2820,7 +2820,7 @@ static int __i915_vma_unbind(struct i915_vma *vma, bool wait)
> * have side-effects such as unpinning or even unbinding this vma.
> */
> active = vma->active;
> - if (active && wait) {
> + if (active) {
> int idx;
>
> /* When a closed VMA is retired, it is unbound - eek.
> @@ -2902,16 +2902,6 @@ destroy:
> return 0;
> }
>
> -int i915_vma_unbind(struct i915_vma *vma)
> -{
> - return __i915_vma_unbind(vma, true);
> -}
> -
> -int __i915_vma_unbind_no_wait(struct i915_vma *vma)
> -{
> - return __i915_vma_unbind(vma, false);
> -}
> -
> int i915_gem_wait_for_idle(struct drm_i915_private *dev_priv)
> {
> struct intel_engine_cs *engine;
> diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
> index 1ba6c0bb856a..e9da8aaaa41d 100644
> --- a/drivers/gpu/drm/i915/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> @@ -134,21 +134,6 @@ static int get_context_size(struct drm_i915_private *dev_priv)
> return ret;
> }
>
> -static void i915_gem_context_clean(struct i915_gem_context *ctx)
> -{
> - struct i915_hw_ppgtt *ppgtt = ctx->ppgtt;
> - struct i915_vma *vma, *next;
> -
> - if (!ppgtt)
> - return;
> -
> - list_for_each_entry_safe(vma, next, &ppgtt->base.inactive_list,
> - vm_link) {
> - if (WARN_ON(__i915_vma_unbind_no_wait(vma)))
> - break;
> - }
> -}
> -
> void i915_gem_context_free(struct kref *ctx_ref)
> {
> struct i915_gem_context *ctx = container_of(ctx_ref, typeof(*ctx), ref);
> @@ -158,13 +143,6 @@ void i915_gem_context_free(struct kref *ctx_ref)
> trace_i915_context_free(ctx);
> GEM_BUG_ON(!ctx->closed);
>
> - /*
> - * This context is going away and we need to remove all VMAs still
> - * around. This is to handle imported shared objects for which
> - * destructor did not run when their handles were closed.
> - */
> - i915_gem_context_clean(ctx);
> -
> i915_ppgtt_put(ctx->ppgtt);
>
> for (i = 0; i < I915_NUM_ENGINES; i++) {
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index d2130da3de9d..e19a5fd5f15f 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -3365,7 +3365,7 @@ void i915_vma_close(struct i915_vma *vma)
>
> list_del_init(&vma->obj_link);
> if (!i915_vma_is_active(vma) && !vma->pin_count)
> - WARN_ON(__i915_vma_unbind_no_wait(vma));
> + WARN_ON(i915_vma_unbind(vma));
> }
>
> static struct i915_vma *
--
Joonas Lahtinen
Open Source Technology Center
Intel Corporation
More information about the Intel-gfx
mailing list