[Intel-gfx] [PATCH v2 2/2] drm/i915/gem: Only revoke mmap handlers if active
Chris Wilson
chris at chris-wilson.co.uk
Thu Jul 2 13:10:36 UTC 2020
Quoting Chris Wilson (2020-07-02 14:06:05)
> Avoid waking up the device and taking stale locks if we know that the
> object is not currently mmapped. This is particularly useful as not many
> object are actually mmapped and so we can destroy them without waking
> the device up, and gives us a little more freedom of workqueue ordering
> during shutdown.
>
> v2: Pull the release_mmap() into its single user in freeing the objects,
> where there can not be any race with a concurrent user of the freed
> object. Or so one hopes!
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at linux.intel.com>,
> ---
> drivers/gpu/drm/i915/gem/i915_gem_mman.c | 13 -------------
> drivers/gpu/drm/i915/gem/i915_gem_mman.h | 2 --
> drivers/gpu/drm/i915/gem/i915_gem_object.c | 11 +++++++++++
> 3 files changed, 11 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> index 7c2650cfb070..b23368529a40 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> @@ -507,19 +507,6 @@ void i915_gem_object_release_mmap_offset(struct drm_i915_gem_object *obj)
> spin_unlock(&obj->mmo.lock);
> }
>
> -/**
> - * i915_gem_object_release_mmap - remove physical page mappings
> - * @obj: obj in question
> - *
> - * Preserve the reservation of the mmapping with the DRM core code, but
> - * relinquish ownership of the pages back to the system.
> - */
> -void i915_gem_object_release_mmap(struct drm_i915_gem_object *obj)
> -{
> - i915_gem_object_release_mmap_gtt(obj);
> - i915_gem_object_release_mmap_offset(obj);
> -}
> -
> static struct i915_mmap_offset *
> lookup_mmo(struct drm_i915_gem_object *obj,
> enum i915_mmap_type mmap_type)
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.h b/drivers/gpu/drm/i915/gem/i915_gem_mman.h
> index 7c5ccdf59359..efee9e0d2508 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_mman.h
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.h
> @@ -24,8 +24,6 @@ int i915_gem_dumb_mmap_offset(struct drm_file *file_priv,
> struct drm_device *dev,
> u32 handle, u64 *offset);
>
> -void i915_gem_object_release_mmap(struct drm_i915_gem_object *obj);
> -
> void __i915_gem_object_release_mmap_gtt(struct drm_i915_gem_object *obj);
> void i915_gem_object_release_mmap_gtt(struct drm_i915_gem_object *obj);
>
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c
> index 6b69191c5543..d377c0ef8603 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c
> @@ -171,6 +171,17 @@ static void __i915_gem_free_object_rcu(struct rcu_head *head)
> atomic_dec(&i915->mm.free_count);
> }
>
> +static void i915_gem_object_release_mmap(struct drm_i915_gem_object *obj)
Maybe free_mmaps to try and discourage re-use?
> +{
> + /* Skip serialisation and waking the device if known to be not used. */
> +
> + if (obj->userfault_count)
> + i915_gem_object_release_mmap_gtt(obj);
> +
> + if (!RB_EMPTY_ROOT(&obj->mmo.offsets))
> + i915_gem_object_release_mmap_offset(obj);
> +}
More information about the Intel-gfx
mailing list