diff mbox series

[v2,1/2] drm/i915: Encapsulate lmem rpm stuff in intel_runtime_pm

Message ID 20221021095525.788221-1-anshuman.gupta@intel.com (mailing list archive)
State New, archived
Headers show
Series [v2,1/2] drm/i915: Encapsulate lmem rpm stuff in intel_runtime_pm | expand

Commit Message

Gupta, Anshuman Oct. 21, 2022, 9:55 a.m. UTC
Runtime pm is not really per GT, therefore it make sense to
move lmem_userfault_list, lmem_userfault_lock and
userfault_wakeref from intel_gt to intel_runtime_pm structure,
which is embedded to i915.

No functional change.

Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
---
 drivers/gpu/drm/i915/gem/i915_gem_mman.c |  6 +++---
 drivers/gpu/drm/i915/gem/i915_gem_pm.c   |  2 +-
 drivers/gpu/drm/i915/gem/i915_gem_ttm.c  |  8 ++++----
 drivers/gpu/drm/i915/gt/intel_gt.c       |  3 ---
 drivers/gpu/drm/i915/gt/intel_gt_types.h | 17 -----------------
 drivers/gpu/drm/i915/i915_gem.c          |  4 +---
 drivers/gpu/drm/i915/intel_runtime_pm.c  |  5 +++++
 drivers/gpu/drm/i915/intel_runtime_pm.h  | 22 ++++++++++++++++++++++
 8 files changed, 36 insertions(+), 31 deletions(-)

Comments

Matthew Auld Oct. 24, 2022, 2 p.m. UTC | #1
On 21/10/2022 10:55, Anshuman Gupta wrote:
> Runtime pm is not really per GT, therefore it make sense to
> move lmem_userfault_list, lmem_userfault_lock and
> userfault_wakeref from intel_gt to intel_runtime_pm structure,
> which is embedded to i915.
> 
> No functional change.
> 
> Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
> ---
>   drivers/gpu/drm/i915/gem/i915_gem_mman.c |  6 +++---
>   drivers/gpu/drm/i915/gem/i915_gem_pm.c   |  2 +-
>   drivers/gpu/drm/i915/gem/i915_gem_ttm.c  |  8 ++++----
>   drivers/gpu/drm/i915/gt/intel_gt.c       |  3 ---
>   drivers/gpu/drm/i915/gt/intel_gt_types.h | 17 -----------------
>   drivers/gpu/drm/i915/i915_gem.c          |  4 +---
>   drivers/gpu/drm/i915/intel_runtime_pm.c  |  5 +++++
>   drivers/gpu/drm/i915/intel_runtime_pm.h  | 22 ++++++++++++++++++++++
>   8 files changed, 36 insertions(+), 31 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> index 73d9eda1d6b7..fd29a9053582 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> @@ -413,7 +413,7 @@ static vm_fault_t vm_fault_gtt(struct vm_fault *vmf)
>   	vma->mmo = mmo;
>   
>   	if (CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND)
> -		intel_wakeref_auto(&to_gt(i915)->userfault_wakeref,
> +		intel_wakeref_auto(&i915->runtime_pm.userfault_wakeref,
>   				   msecs_to_jiffies_timeout(CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND));
>   
>   	if (write) {
> @@ -589,9 +589,9 @@ void i915_gem_object_release_mmap_offset(struct drm_i915_gem_object *obj)
>   	spin_unlock(&obj->mmo.lock);
>   
>   	if (obj->userfault_count) {
> -		mutex_lock(&to_gt(to_i915(obj->base.dev))->lmem_userfault_lock);
> +		mutex_lock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock);
>   		list_del(&obj->userfault_link);
> -		mutex_unlock(&to_gt(to_i915(obj->base.dev))->lmem_userfault_lock);
> +		mutex_unlock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock);
>   		obj->userfault_count = 0;
>   	}
>   }
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pm.c b/drivers/gpu/drm/i915/gem/i915_gem_pm.c
> index e5bfb6be9f7a..0d812f4d787d 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_pm.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_pm.c
> @@ -27,7 +27,7 @@ void i915_gem_suspend(struct drm_i915_private *i915)
>   
>   	GEM_TRACE("%s\n", dev_name(i915->drm.dev));
>   
> -	intel_wakeref_auto(&to_gt(i915)->userfault_wakeref, 0);
> +	intel_wakeref_auto(&i915->runtime_pm.userfault_wakeref, 0);
>   	flush_workqueue(i915->wq);
>   
>   	/*
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> index 84c91a4228a1..50c70796ca38 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> @@ -1101,13 +1101,13 @@ static vm_fault_t vm_fault_ttm(struct vm_fault *vmf)
>   	/* ttm_bo_vm_reserve() already has dma_resv_lock */
>   	if (ret == VM_FAULT_NOPAGE && wakeref && !obj->userfault_count) {
>   		obj->userfault_count = 1;
> -		mutex_lock(&to_gt(to_i915(obj->base.dev))->lmem_userfault_lock);
> -		list_add(&obj->userfault_link, &to_gt(to_i915(obj->base.dev))->lmem_userfault_list);
> -		mutex_unlock(&to_gt(to_i915(obj->base.dev))->lmem_userfault_lock);
> +		mutex_lock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock);
> +		list_add(&obj->userfault_link, &to_i915(obj->base.dev)->runtime_pm.lmem_userfault_list);
> +		mutex_unlock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock);
>   	}
>   
>   	if (wakeref & CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND)
> -		intel_wakeref_auto(&to_gt(to_i915(obj->base.dev))->userfault_wakeref,
> +		intel_wakeref_auto(&to_i915(obj->base.dev)->runtime_pm.userfault_wakeref,
>   				   msecs_to_jiffies_timeout(CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND));
>   
>   	i915_ttm_adjust_lru(obj);
> diff --git a/drivers/gpu/drm/i915/gt/intel_gt.c b/drivers/gpu/drm/i915/gt/intel_gt.c
> index 27dbb9e4bd6c..0ad8118ccbee 100644
> --- a/drivers/gpu/drm/i915/gt/intel_gt.c
> +++ b/drivers/gpu/drm/i915/gt/intel_gt.c
> @@ -40,8 +40,6 @@ void intel_gt_common_init_early(struct intel_gt *gt)
>   {
>   	spin_lock_init(gt->irq_lock);
>   
> -	INIT_LIST_HEAD(&gt->lmem_userfault_list);
> -	mutex_init(&gt->lmem_userfault_lock);
>   	INIT_LIST_HEAD(&gt->closed_vma);
>   	spin_lock_init(&gt->closed_lock);
>   
> @@ -859,7 +857,6 @@ static int intel_gt_tile_setup(struct intel_gt *gt, phys_addr_t phys_addr)
>   	}
>   
>   	intel_uncore_init_early(gt->uncore, gt);
> -	intel_wakeref_auto_init(&gt->userfault_wakeref, gt->uncore->rpm);
>   
>   	ret = intel_uncore_setup_mmio(gt->uncore, phys_addr);
>   	if (ret)
> diff --git a/drivers/gpu/drm/i915/gt/intel_gt_types.h b/drivers/gpu/drm/i915/gt/intel_gt_types.h
> index 64aa2ba624fc..ff9251807f5c 100644
> --- a/drivers/gpu/drm/i915/gt/intel_gt_types.h
> +++ b/drivers/gpu/drm/i915/gt/intel_gt_types.h
> @@ -144,20 +144,6 @@ struct intel_gt {
>   	struct intel_wakeref wakeref;
>   	atomic_t user_wakeref;
>   
> -	/**
> -	 *  Protects access to lmem usefault list.
> -	 *  It is required, if we are outside of the runtime suspend path,
> -	 *  access to @lmem_userfault_list requires always first grabbing the
> -	 *  runtime pm, to ensure we can't race against runtime suspend.
> -	 *  Once we have that we also need to grab @lmem_userfault_lock,
> -	 *  at which point we have exclusive access.
> -	 *  The runtime suspend path is special since it doesn't really hold any locks,
> -	 *  but instead has exclusive access by virtue of all other accesses requiring
> -	 *  holding the runtime pm wakeref.
> -	 */
> -	struct mutex lmem_userfault_lock;
> -	struct list_head lmem_userfault_list;
> -
>   	struct list_head closed_vma;
>   	spinlock_t closed_lock; /* guards the list of closed_vma */
>   
> @@ -173,9 +159,6 @@ struct intel_gt {
>   	 */
>   	intel_wakeref_t awake;
>   
> -	/* Manual runtime pm autosuspend delay for user GGTT/lmem mmaps */
> -	struct intel_wakeref_auto userfault_wakeref;
> -
>   	u32 clock_frequency;
>   	u32 clock_period_ns;
>   
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 55d605c0c55d..299f94a9fb87 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -843,7 +843,7 @@ void i915_gem_runtime_suspend(struct drm_i915_private *i915)
>   		__i915_gem_object_release_mmap_gtt(obj);
>   
>   	list_for_each_entry_safe(obj, on,
> -				 &to_gt(i915)->lmem_userfault_list, userfault_link)
> +				 &i915->runtime_pm.lmem_userfault_list, userfault_link)
>   		i915_gem_object_runtime_pm_release_mmap_offset(obj);
>   
>   	/*
> @@ -1227,8 +1227,6 @@ void i915_gem_driver_remove(struct drm_i915_private *dev_priv)
>   	struct intel_gt *gt;
>   	unsigned int i;
>   
> -	intel_wakeref_auto_fini(&to_gt(dev_priv)->userfault_wakeref);
> -
>   	i915_gem_suspend_late(dev_priv);
>   	for_each_gt(gt, dev_priv, i)
>   		intel_gt_driver_remove(gt);
> diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
> index 744cca507946..bb74d4975cc8 100644
> --- a/drivers/gpu/drm/i915/intel_runtime_pm.c
> +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
> @@ -633,6 +633,8 @@ void intel_runtime_pm_driver_release(struct intel_runtime_pm *rpm)
>   						     runtime_pm);
>   	int count = atomic_read(&rpm->wakeref_count);
>   
> +	intel_wakeref_auto_fini(&rpm->userfault_wakeref);
> +
>   	drm_WARN(&i915->drm, count,
>   		 "i915 raw-wakerefs=%d wakelocks=%d on cleanup\n",
>   		 intel_rpm_raw_wakeref_count(count),
> @@ -652,4 +654,7 @@ void intel_runtime_pm_init_early(struct intel_runtime_pm *rpm)
>   	rpm->available = HAS_RUNTIME_PM(i915);
>   
>   	init_intel_runtime_pm_wakeref(rpm);
> +	INIT_LIST_HEAD(&rpm->lmem_userfault_list);
> +	mutex_init(&rpm->lmem_userfault_lock);
> +	intel_wakeref_auto_init(&rpm->userfault_wakeref, rpm);
>   }
> diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.h b/drivers/gpu/drm/i915/intel_runtime_pm.h
> index d9160e3ff4af..d0c04af2a6f3 100644
> --- a/drivers/gpu/drm/i915/intel_runtime_pm.h
> +++ b/drivers/gpu/drm/i915/intel_runtime_pm.h
> @@ -53,6 +53,28 @@ struct intel_runtime_pm {
>   	bool irqs_enabled;
>   	bool no_wakeref_tracking;
>   
> +	/**

Nit: that's not properly formatted kernel-doc.

Reviewed-by: Matthew Auld <matthew.auld@intel.com>

> +	 *  Protects access to lmem usefault list.
> +	 *  It is required, if we are outside of the runtime suspend path,
> +	 *  access to @lmem_userfault_list requires always first grabbing the
> +	 *  runtime pm, to ensure we can't race against runtime suspend.
> +	 *  Once we have that we also need to grab @lmem_userfault_lock,
> +	 *  at which point we have exclusive access.
> +	 *  The runtime suspend path is special since it doesn't really hold any locks,
> +	 *  but instead has exclusive access by virtue of all other accesses requiring
> +	 *  holding the runtime pm wakeref.
> +	 */
> +	struct mutex lmem_userfault_lock;
> +
> +	/*
> +	 *  Keep list of userfaulted gem obj, which require to release their
> +	 *  mmap mappings at runtime suspend path.
> +	 */
> +	struct list_head lmem_userfault_list;
> +
> +	/* Manual runtime pm autosuspend delay for user GGTT/lmem mmaps */
> +	struct intel_wakeref_auto userfault_wakeref;
> +
>   #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
>   	/*
>   	 * To aide detection of wakeref leaks and general misuse, we
Gupta, Anshuman Oct. 31, 2022, 6:42 a.m. UTC | #2
> -----Original Message-----
> From: Auld, Matthew <matthew.auld@intel.com>
> Sent: Monday, October 24, 2022 7:30 PM
> To: Gupta, Anshuman <anshuman.gupta@intel.com>; intel-
> gfx@lists.freedesktop.org
> Cc: tvrtko.ursulin@linux.intel.com; Vivi, Rodrigo <rodrigo.vivi@intel.com>
> Subject: Re: [PATCH v2 1/2] drm/i915: Encapsulate lmem rpm stuff in
> intel_runtime_pm
> 
> On 21/10/2022 10:55, Anshuman Gupta wrote:
> > Runtime pm is not really per GT, therefore it make sense to move
> > lmem_userfault_list, lmem_userfault_lock and userfault_wakeref from
> > intel_gt to intel_runtime_pm structure, which is embedded to i915.
> >
> > No functional change.
@rodrigo could you please provide the Ack on the patch.
Thanks,
Anshuman.
> >
> > Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
> > ---
> >   drivers/gpu/drm/i915/gem/i915_gem_mman.c |  6 +++---
> >   drivers/gpu/drm/i915/gem/i915_gem_pm.c   |  2 +-
> >   drivers/gpu/drm/i915/gem/i915_gem_ttm.c  |  8 ++++----
> >   drivers/gpu/drm/i915/gt/intel_gt.c       |  3 ---
> >   drivers/gpu/drm/i915/gt/intel_gt_types.h | 17 -----------------
> >   drivers/gpu/drm/i915/i915_gem.c          |  4 +---
> >   drivers/gpu/drm/i915/intel_runtime_pm.c  |  5 +++++
> >   drivers/gpu/drm/i915/intel_runtime_pm.h  | 22
> ++++++++++++++++++++++
> >   8 files changed, 36 insertions(+), 31 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> > b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> > index 73d9eda1d6b7..fd29a9053582 100644
> > --- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> > +++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> > @@ -413,7 +413,7 @@ static vm_fault_t vm_fault_gtt(struct vm_fault
> *vmf)
> >   	vma->mmo = mmo;
> >
> >   	if (CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND)
> > -		intel_wakeref_auto(&to_gt(i915)->userfault_wakeref,
> > +		intel_wakeref_auto(&i915->runtime_pm.userfault_wakeref,
> >
> >
> msecs_to_jiffies_timeout(CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND)
> );
> >
> >   	if (write) {
> > @@ -589,9 +589,9 @@ void
> i915_gem_object_release_mmap_offset(struct drm_i915_gem_object *obj)
> >   	spin_unlock(&obj->mmo.lock);
> >
> >   	if (obj->userfault_count) {
> > -		mutex_lock(&to_gt(to_i915(obj->base.dev))-
> >lmem_userfault_lock);
> > +
> > +mutex_lock(&to_i915(obj->base.dev)-
> >runtime_pm.lmem_userfault_lock);
> >   		list_del(&obj->userfault_link);
> > -		mutex_unlock(&to_gt(to_i915(obj->base.dev))-
> >lmem_userfault_lock);
> > +
> > +mutex_unlock(&to_i915(obj->base.dev)-
> >runtime_pm.lmem_userfault_lock)
> > +;
> >   		obj->userfault_count = 0;
> >   	}
> >   }
> > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pm.c
> > b/drivers/gpu/drm/i915/gem/i915_gem_pm.c
> > index e5bfb6be9f7a..0d812f4d787d 100644
> > --- a/drivers/gpu/drm/i915/gem/i915_gem_pm.c
> > +++ b/drivers/gpu/drm/i915/gem/i915_gem_pm.c
> > @@ -27,7 +27,7 @@ void i915_gem_suspend(struct drm_i915_private
> *i915)
> >
> >   	GEM_TRACE("%s\n", dev_name(i915->drm.dev));
> >
> > -	intel_wakeref_auto(&to_gt(i915)->userfault_wakeref, 0);
> > +	intel_wakeref_auto(&i915->runtime_pm.userfault_wakeref, 0);
> >   	flush_workqueue(i915->wq);
> >
> >   	/*
> > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> > b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> > index 84c91a4228a1..50c70796ca38 100644
> > --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> > +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> > @@ -1101,13 +1101,13 @@ static vm_fault_t vm_fault_ttm(struct vm_fault
> *vmf)
> >   	/* ttm_bo_vm_reserve() already has dma_resv_lock */
> >   	if (ret == VM_FAULT_NOPAGE && wakeref && !obj-
> >userfault_count) {
> >   		obj->userfault_count = 1;
> > -		mutex_lock(&to_gt(to_i915(obj->base.dev))-
> >lmem_userfault_lock);
> > -		list_add(&obj->userfault_link, &to_gt(to_i915(obj-
> >base.dev))->lmem_userfault_list);
> > -		mutex_unlock(&to_gt(to_i915(obj->base.dev))-
> >lmem_userfault_lock);
> > +		mutex_lock(&to_i915(obj->base.dev)-
> >runtime_pm.lmem_userfault_lock);
> > +		list_add(&obj->userfault_link, &to_i915(obj->base.dev)-
> >runtime_pm.lmem_userfault_list);
> > +
> > +mutex_unlock(&to_i915(obj->base.dev)-
> >runtime_pm.lmem_userfault_lock)
> > +;
> >   	}
> >
> >   	if (wakeref & CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND)
> > -		intel_wakeref_auto(&to_gt(to_i915(obj->base.dev))-
> >userfault_wakeref,
> > +
> > +intel_wakeref_auto(&to_i915(obj->base.dev)-
> >runtime_pm.userfault_wake
> > +ref,
> >
> >
> msecs_to_jiffies_timeout(CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND)
> );
> >
> >   	i915_ttm_adjust_lru(obj);
> > diff --git a/drivers/gpu/drm/i915/gt/intel_gt.c
> > b/drivers/gpu/drm/i915/gt/intel_gt.c
> > index 27dbb9e4bd6c..0ad8118ccbee 100644
> > --- a/drivers/gpu/drm/i915/gt/intel_gt.c
> > +++ b/drivers/gpu/drm/i915/gt/intel_gt.c
> > @@ -40,8 +40,6 @@ void intel_gt_common_init_early(struct intel_gt *gt)
> >   {
> >   	spin_lock_init(gt->irq_lock);
> >
> > -	INIT_LIST_HEAD(&gt->lmem_userfault_list);
> > -	mutex_init(&gt->lmem_userfault_lock);
> >   	INIT_LIST_HEAD(&gt->closed_vma);
> >   	spin_lock_init(&gt->closed_lock);
> >
> > @@ -859,7 +857,6 @@ static int intel_gt_tile_setup(struct intel_gt *gt,
> phys_addr_t phys_addr)
> >   	}
> >
> >   	intel_uncore_init_early(gt->uncore, gt);
> > -	intel_wakeref_auto_init(&gt->userfault_wakeref, gt->uncore-
> >rpm);
> >
> >   	ret = intel_uncore_setup_mmio(gt->uncore, phys_addr);
> >   	if (ret)
> > diff --git a/drivers/gpu/drm/i915/gt/intel_gt_types.h
> > b/drivers/gpu/drm/i915/gt/intel_gt_types.h
> > index 64aa2ba624fc..ff9251807f5c 100644
> > --- a/drivers/gpu/drm/i915/gt/intel_gt_types.h
> > +++ b/drivers/gpu/drm/i915/gt/intel_gt_types.h
> > @@ -144,20 +144,6 @@ struct intel_gt {
> >   	struct intel_wakeref wakeref;
> >   	atomic_t user_wakeref;
> >
> > -	/**
> > -	 *  Protects access to lmem usefault list.
> > -	 *  It is required, if we are outside of the runtime suspend path,
> > -	 *  access to @lmem_userfault_list requires always first grabbing the
> > -	 *  runtime pm, to ensure we can't race against runtime suspend.
> > -	 *  Once we have that we also need to grab @lmem_userfault_lock,
> > -	 *  at which point we have exclusive access.
> > -	 *  The runtime suspend path is special since it doesn't really hold any
> locks,
> > -	 *  but instead has exclusive access by virtue of all other accesses
> requiring
> > -	 *  holding the runtime pm wakeref.
> > -	 */
> > -	struct mutex lmem_userfault_lock;
> > -	struct list_head lmem_userfault_list;
> > -
> >   	struct list_head closed_vma;
> >   	spinlock_t closed_lock; /* guards the list of closed_vma */
> >
> > @@ -173,9 +159,6 @@ struct intel_gt {
> >   	 */
> >   	intel_wakeref_t awake;
> >
> > -	/* Manual runtime pm autosuspend delay for user GGTT/lmem
> mmaps */
> > -	struct intel_wakeref_auto userfault_wakeref;
> > -
> >   	u32 clock_frequency;
> >   	u32 clock_period_ns;
> >
> > diff --git a/drivers/gpu/drm/i915/i915_gem.c
> > b/drivers/gpu/drm/i915/i915_gem.c index 55d605c0c55d..299f94a9fb87
> > 100644
> > --- a/drivers/gpu/drm/i915/i915_gem.c
> > +++ b/drivers/gpu/drm/i915/i915_gem.c
> > @@ -843,7 +843,7 @@ void i915_gem_runtime_suspend(struct
> drm_i915_private *i915)
> >   		__i915_gem_object_release_mmap_gtt(obj);
> >
> >   	list_for_each_entry_safe(obj, on,
> > -				 &to_gt(i915)->lmem_userfault_list,
> userfault_link)
> > +				 &i915->runtime_pm.lmem_userfault_list,
> userfault_link)
> >   		i915_gem_object_runtime_pm_release_mmap_offset(obj);
> >
> >   	/*
> > @@ -1227,8 +1227,6 @@ void i915_gem_driver_remove(struct
> drm_i915_private *dev_priv)
> >   	struct intel_gt *gt;
> >   	unsigned int i;
> >
> > -	intel_wakeref_auto_fini(&to_gt(dev_priv)->userfault_wakeref);
> > -
> >   	i915_gem_suspend_late(dev_priv);
> >   	for_each_gt(gt, dev_priv, i)
> >   		intel_gt_driver_remove(gt);
> > diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c
> > b/drivers/gpu/drm/i915/intel_runtime_pm.c
> > index 744cca507946..bb74d4975cc8 100644
> > --- a/drivers/gpu/drm/i915/intel_runtime_pm.c
> > +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
> > @@ -633,6 +633,8 @@ void intel_runtime_pm_driver_release(struct
> intel_runtime_pm *rpm)
> >   						     runtime_pm);
> >   	int count = atomic_read(&rpm->wakeref_count);
> >
> > +	intel_wakeref_auto_fini(&rpm->userfault_wakeref);
> > +
> >   	drm_WARN(&i915->drm, count,
> >   		 "i915 raw-wakerefs=%d wakelocks=%d on cleanup\n",
> >   		 intel_rpm_raw_wakeref_count(count),
> > @@ -652,4 +654,7 @@ void intel_runtime_pm_init_early(struct
> intel_runtime_pm *rpm)
> >   	rpm->available = HAS_RUNTIME_PM(i915);
> >
> >   	init_intel_runtime_pm_wakeref(rpm);
> > +	INIT_LIST_HEAD(&rpm->lmem_userfault_list);
> > +	mutex_init(&rpm->lmem_userfault_lock);
> > +	intel_wakeref_auto_init(&rpm->userfault_wakeref, rpm);
> >   }
> > diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.h
> > b/drivers/gpu/drm/i915/intel_runtime_pm.h
> > index d9160e3ff4af..d0c04af2a6f3 100644
> > --- a/drivers/gpu/drm/i915/intel_runtime_pm.h
> > +++ b/drivers/gpu/drm/i915/intel_runtime_pm.h
> > @@ -53,6 +53,28 @@ struct intel_runtime_pm {
> >   	bool irqs_enabled;
> >   	bool no_wakeref_tracking;
> >
> > +	/**
> 
> Nit: that's not properly formatted kernel-doc.
> 
> Reviewed-by: Matthew Auld <matthew.auld@intel.com>
> 
> > +	 *  Protects access to lmem usefault list.
> > +	 *  It is required, if we are outside of the runtime suspend path,
> > +	 *  access to @lmem_userfault_list requires always first grabbing the
> > +	 *  runtime pm, to ensure we can't race against runtime suspend.
> > +	 *  Once we have that we also need to grab @lmem_userfault_lock,
> > +	 *  at which point we have exclusive access.
> > +	 *  The runtime suspend path is special since it doesn't really hold any
> locks,
> > +	 *  but instead has exclusive access by virtue of all other accesses
> requiring
> > +	 *  holding the runtime pm wakeref.
> > +	 */
> > +	struct mutex lmem_userfault_lock;
> > +
> > +	/*
> > +	 *  Keep list of userfaulted gem obj, which require to release their
> > +	 *  mmap mappings at runtime suspend path.
> > +	 */
> > +	struct list_head lmem_userfault_list;
> > +
> > +	/* Manual runtime pm autosuspend delay for user GGTT/lmem
> mmaps */
> > +	struct intel_wakeref_auto userfault_wakeref;
> > +
> >   #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
> >   	/*
> >   	 * To aide detection of wakeref leaks and general misuse, we
Rodrigo Vivi Oct. 31, 2022, 9:34 a.m. UTC | #3
On Mon, Oct 31, 2022 at 02:42:09AM -0400, Gupta, Anshuman wrote:
> 
> 
> > -----Original Message-----
> > From: Auld, Matthew <matthew.auld@intel.com>
> > Sent: Monday, October 24, 2022 7:30 PM
> > To: Gupta, Anshuman <anshuman.gupta@intel.com>; intel-
> > gfx@lists.freedesktop.org
> > Cc: tvrtko.ursulin@linux.intel.com; Vivi, Rodrigo <rodrigo.vivi@intel.com>
> > Subject: Re: [PATCH v2 1/2] drm/i915: Encapsulate lmem rpm stuff in
> > intel_runtime_pm
> > 
> > On 21/10/2022 10:55, Anshuman Gupta wrote:
> > > Runtime pm is not really per GT, therefore it make sense to move
> > > lmem_userfault_list, lmem_userfault_lock and userfault_wakeref from
> > > intel_gt to intel_runtime_pm structure, which is embedded to i915.
> > >
> > > No functional change.
> @rodrigo could you please provide the Ack on the patch.

not needed :)

I had seen the patch and it does make sense to me, but I have
not comment because it already had the rv-b from Matt.


Acked-by: Rodrigo Vivi <rodrigo.vivi@intel.com>


> Thanks,
> Anshuman.
> > >
> > > Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
> > > ---
> > >   drivers/gpu/drm/i915/gem/i915_gem_mman.c |  6 +++---
> > >   drivers/gpu/drm/i915/gem/i915_gem_pm.c   |  2 +-
> > >   drivers/gpu/drm/i915/gem/i915_gem_ttm.c  |  8 ++++----
> > >   drivers/gpu/drm/i915/gt/intel_gt.c       |  3 ---
> > >   drivers/gpu/drm/i915/gt/intel_gt_types.h | 17 -----------------
> > >   drivers/gpu/drm/i915/i915_gem.c          |  4 +---
> > >   drivers/gpu/drm/i915/intel_runtime_pm.c  |  5 +++++
> > >   drivers/gpu/drm/i915/intel_runtime_pm.h  | 22
> > ++++++++++++++++++++++
> > >   8 files changed, 36 insertions(+), 31 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> > > b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> > > index 73d9eda1d6b7..fd29a9053582 100644
> > > --- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> > > +++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> > > @@ -413,7 +413,7 @@ static vm_fault_t vm_fault_gtt(struct vm_fault
> > *vmf)
> > >   	vma->mmo = mmo;
> > >
> > >   	if (CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND)
> > > -		intel_wakeref_auto(&to_gt(i915)->userfault_wakeref,
> > > +		intel_wakeref_auto(&i915->runtime_pm.userfault_wakeref,
> > >
> > >
> > msecs_to_jiffies_timeout(CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND)
> > );
> > >
> > >   	if (write) {
> > > @@ -589,9 +589,9 @@ void
> > i915_gem_object_release_mmap_offset(struct drm_i915_gem_object *obj)
> > >   	spin_unlock(&obj->mmo.lock);
> > >
> > >   	if (obj->userfault_count) {
> > > -		mutex_lock(&to_gt(to_i915(obj->base.dev))-
> > >lmem_userfault_lock);
> > > +
> > > +mutex_lock(&to_i915(obj->base.dev)-
> > >runtime_pm.lmem_userfault_lock);
> > >   		list_del(&obj->userfault_link);
> > > -		mutex_unlock(&to_gt(to_i915(obj->base.dev))-
> > >lmem_userfault_lock);
> > > +
> > > +mutex_unlock(&to_i915(obj->base.dev)-
> > >runtime_pm.lmem_userfault_lock)
> > > +;
> > >   		obj->userfault_count = 0;
> > >   	}
> > >   }
> > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pm.c
> > > b/drivers/gpu/drm/i915/gem/i915_gem_pm.c
> > > index e5bfb6be9f7a..0d812f4d787d 100644
> > > --- a/drivers/gpu/drm/i915/gem/i915_gem_pm.c
> > > +++ b/drivers/gpu/drm/i915/gem/i915_gem_pm.c
> > > @@ -27,7 +27,7 @@ void i915_gem_suspend(struct drm_i915_private
> > *i915)
> > >
> > >   	GEM_TRACE("%s\n", dev_name(i915->drm.dev));
> > >
> > > -	intel_wakeref_auto(&to_gt(i915)->userfault_wakeref, 0);
> > > +	intel_wakeref_auto(&i915->runtime_pm.userfault_wakeref, 0);
> > >   	flush_workqueue(i915->wq);
> > >
> > >   	/*
> > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> > > b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> > > index 84c91a4228a1..50c70796ca38 100644
> > > --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> > > +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> > > @@ -1101,13 +1101,13 @@ static vm_fault_t vm_fault_ttm(struct vm_fault
> > *vmf)
> > >   	/* ttm_bo_vm_reserve() already has dma_resv_lock */
> > >   	if (ret == VM_FAULT_NOPAGE && wakeref && !obj-
> > >userfault_count) {
> > >   		obj->userfault_count = 1;
> > > -		mutex_lock(&to_gt(to_i915(obj->base.dev))-
> > >lmem_userfault_lock);
> > > -		list_add(&obj->userfault_link, &to_gt(to_i915(obj-
> > >base.dev))->lmem_userfault_list);
> > > -		mutex_unlock(&to_gt(to_i915(obj->base.dev))-
> > >lmem_userfault_lock);
> > > +		mutex_lock(&to_i915(obj->base.dev)-
> > >runtime_pm.lmem_userfault_lock);
> > > +		list_add(&obj->userfault_link, &to_i915(obj->base.dev)-
> > >runtime_pm.lmem_userfault_list);
> > > +
> > > +mutex_unlock(&to_i915(obj->base.dev)-
> > >runtime_pm.lmem_userfault_lock)
> > > +;
> > >   	}
> > >
> > >   	if (wakeref & CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND)
> > > -		intel_wakeref_auto(&to_gt(to_i915(obj->base.dev))-
> > >userfault_wakeref,
> > > +
> > > +intel_wakeref_auto(&to_i915(obj->base.dev)-
> > >runtime_pm.userfault_wake
> > > +ref,
> > >
> > >
> > msecs_to_jiffies_timeout(CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND)
> > );
> > >
> > >   	i915_ttm_adjust_lru(obj);
> > > diff --git a/drivers/gpu/drm/i915/gt/intel_gt.c
> > > b/drivers/gpu/drm/i915/gt/intel_gt.c
> > > index 27dbb9e4bd6c..0ad8118ccbee 100644
> > > --- a/drivers/gpu/drm/i915/gt/intel_gt.c
> > > +++ b/drivers/gpu/drm/i915/gt/intel_gt.c
> > > @@ -40,8 +40,6 @@ void intel_gt_common_init_early(struct intel_gt *gt)
> > >   {
> > >   	spin_lock_init(gt->irq_lock);
> > >
> > > -	INIT_LIST_HEAD(&gt->lmem_userfault_list);
> > > -	mutex_init(&gt->lmem_userfault_lock);
> > >   	INIT_LIST_HEAD(&gt->closed_vma);
> > >   	spin_lock_init(&gt->closed_lock);
> > >
> > > @@ -859,7 +857,6 @@ static int intel_gt_tile_setup(struct intel_gt *gt,
> > phys_addr_t phys_addr)
> > >   	}
> > >
> > >   	intel_uncore_init_early(gt->uncore, gt);
> > > -	intel_wakeref_auto_init(&gt->userfault_wakeref, gt->uncore-
> > >rpm);
> > >
> > >   	ret = intel_uncore_setup_mmio(gt->uncore, phys_addr);
> > >   	if (ret)
> > > diff --git a/drivers/gpu/drm/i915/gt/intel_gt_types.h
> > > b/drivers/gpu/drm/i915/gt/intel_gt_types.h
> > > index 64aa2ba624fc..ff9251807f5c 100644
> > > --- a/drivers/gpu/drm/i915/gt/intel_gt_types.h
> > > +++ b/drivers/gpu/drm/i915/gt/intel_gt_types.h
> > > @@ -144,20 +144,6 @@ struct intel_gt {
> > >   	struct intel_wakeref wakeref;
> > >   	atomic_t user_wakeref;
> > >
> > > -	/**
> > > -	 *  Protects access to lmem usefault list.
> > > -	 *  It is required, if we are outside of the runtime suspend path,
> > > -	 *  access to @lmem_userfault_list requires always first grabbing the
> > > -	 *  runtime pm, to ensure we can't race against runtime suspend.
> > > -	 *  Once we have that we also need to grab @lmem_userfault_lock,
> > > -	 *  at which point we have exclusive access.
> > > -	 *  The runtime suspend path is special since it doesn't really hold any
> > locks,
> > > -	 *  but instead has exclusive access by virtue of all other accesses
> > requiring
> > > -	 *  holding the runtime pm wakeref.
> > > -	 */
> > > -	struct mutex lmem_userfault_lock;
> > > -	struct list_head lmem_userfault_list;
> > > -
> > >   	struct list_head closed_vma;
> > >   	spinlock_t closed_lock; /* guards the list of closed_vma */
> > >
> > > @@ -173,9 +159,6 @@ struct intel_gt {
> > >   	 */
> > >   	intel_wakeref_t awake;
> > >
> > > -	/* Manual runtime pm autosuspend delay for user GGTT/lmem
> > mmaps */
> > > -	struct intel_wakeref_auto userfault_wakeref;
> > > -
> > >   	u32 clock_frequency;
> > >   	u32 clock_period_ns;
> > >
> > > diff --git a/drivers/gpu/drm/i915/i915_gem.c
> > > b/drivers/gpu/drm/i915/i915_gem.c index 55d605c0c55d..299f94a9fb87
> > > 100644
> > > --- a/drivers/gpu/drm/i915/i915_gem.c
> > > +++ b/drivers/gpu/drm/i915/i915_gem.c
> > > @@ -843,7 +843,7 @@ void i915_gem_runtime_suspend(struct
> > drm_i915_private *i915)
> > >   		__i915_gem_object_release_mmap_gtt(obj);
> > >
> > >   	list_for_each_entry_safe(obj, on,
> > > -				 &to_gt(i915)->lmem_userfault_list,
> > userfault_link)
> > > +				 &i915->runtime_pm.lmem_userfault_list,
> > userfault_link)
> > >   		i915_gem_object_runtime_pm_release_mmap_offset(obj);
> > >
> > >   	/*
> > > @@ -1227,8 +1227,6 @@ void i915_gem_driver_remove(struct
> > drm_i915_private *dev_priv)
> > >   	struct intel_gt *gt;
> > >   	unsigned int i;
> > >
> > > -	intel_wakeref_auto_fini(&to_gt(dev_priv)->userfault_wakeref);
> > > -
> > >   	i915_gem_suspend_late(dev_priv);
> > >   	for_each_gt(gt, dev_priv, i)
> > >   		intel_gt_driver_remove(gt);
> > > diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c
> > > b/drivers/gpu/drm/i915/intel_runtime_pm.c
> > > index 744cca507946..bb74d4975cc8 100644
> > > --- a/drivers/gpu/drm/i915/intel_runtime_pm.c
> > > +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
> > > @@ -633,6 +633,8 @@ void intel_runtime_pm_driver_release(struct
> > intel_runtime_pm *rpm)
> > >   						     runtime_pm);
> > >   	int count = atomic_read(&rpm->wakeref_count);
> > >
> > > +	intel_wakeref_auto_fini(&rpm->userfault_wakeref);
> > > +
> > >   	drm_WARN(&i915->drm, count,
> > >   		 "i915 raw-wakerefs=%d wakelocks=%d on cleanup\n",
> > >   		 intel_rpm_raw_wakeref_count(count),
> > > @@ -652,4 +654,7 @@ void intel_runtime_pm_init_early(struct
> > intel_runtime_pm *rpm)
> > >   	rpm->available = HAS_RUNTIME_PM(i915);
> > >
> > >   	init_intel_runtime_pm_wakeref(rpm);
> > > +	INIT_LIST_HEAD(&rpm->lmem_userfault_list);
> > > +	mutex_init(&rpm->lmem_userfault_lock);
> > > +	intel_wakeref_auto_init(&rpm->userfault_wakeref, rpm);
> > >   }
> > > diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.h
> > > b/drivers/gpu/drm/i915/intel_runtime_pm.h
> > > index d9160e3ff4af..d0c04af2a6f3 100644
> > > --- a/drivers/gpu/drm/i915/intel_runtime_pm.h
> > > +++ b/drivers/gpu/drm/i915/intel_runtime_pm.h
> > > @@ -53,6 +53,28 @@ struct intel_runtime_pm {
> > >   	bool irqs_enabled;
> > >   	bool no_wakeref_tracking;
> > >
> > > +	/**
> > 
> > Nit: that's not properly formatted kernel-doc.
> > 
> > Reviewed-by: Matthew Auld <matthew.auld@intel.com>
> > 
> > > +	 *  Protects access to lmem usefault list.
> > > +	 *  It is required, if we are outside of the runtime suspend path,
> > > +	 *  access to @lmem_userfault_list requires always first grabbing the
> > > +	 *  runtime pm, to ensure we can't race against runtime suspend.
> > > +	 *  Once we have that we also need to grab @lmem_userfault_lock,
> > > +	 *  at which point we have exclusive access.
> > > +	 *  The runtime suspend path is special since it doesn't really hold any
> > locks,
> > > +	 *  but instead has exclusive access by virtue of all other accesses
> > requiring
> > > +	 *  holding the runtime pm wakeref.
> > > +	 */
> > > +	struct mutex lmem_userfault_lock;
> > > +
> > > +	/*
> > > +	 *  Keep list of userfaulted gem obj, which require to release their
> > > +	 *  mmap mappings at runtime suspend path.
> > > +	 */
> > > +	struct list_head lmem_userfault_list;
> > > +
> > > +	/* Manual runtime pm autosuspend delay for user GGTT/lmem
> > mmaps */
> > > +	struct intel_wakeref_auto userfault_wakeref;
> > > +
> > >   #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
> > >   	/*
> > >   	 * To aide detection of wakeref leaks and general misuse, we
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
index 73d9eda1d6b7..fd29a9053582 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
@@ -413,7 +413,7 @@  static vm_fault_t vm_fault_gtt(struct vm_fault *vmf)
 	vma->mmo = mmo;
 
 	if (CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND)
-		intel_wakeref_auto(&to_gt(i915)->userfault_wakeref,
+		intel_wakeref_auto(&i915->runtime_pm.userfault_wakeref,
 				   msecs_to_jiffies_timeout(CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND));
 
 	if (write) {
@@ -589,9 +589,9 @@  void i915_gem_object_release_mmap_offset(struct drm_i915_gem_object *obj)
 	spin_unlock(&obj->mmo.lock);
 
 	if (obj->userfault_count) {
-		mutex_lock(&to_gt(to_i915(obj->base.dev))->lmem_userfault_lock);
+		mutex_lock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock);
 		list_del(&obj->userfault_link);
-		mutex_unlock(&to_gt(to_i915(obj->base.dev))->lmem_userfault_lock);
+		mutex_unlock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock);
 		obj->userfault_count = 0;
 	}
 }
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pm.c b/drivers/gpu/drm/i915/gem/i915_gem_pm.c
index e5bfb6be9f7a..0d812f4d787d 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_pm.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_pm.c
@@ -27,7 +27,7 @@  void i915_gem_suspend(struct drm_i915_private *i915)
 
 	GEM_TRACE("%s\n", dev_name(i915->drm.dev));
 
-	intel_wakeref_auto(&to_gt(i915)->userfault_wakeref, 0);
+	intel_wakeref_auto(&i915->runtime_pm.userfault_wakeref, 0);
 	flush_workqueue(i915->wq);
 
 	/*
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
index 84c91a4228a1..50c70796ca38 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
@@ -1101,13 +1101,13 @@  static vm_fault_t vm_fault_ttm(struct vm_fault *vmf)
 	/* ttm_bo_vm_reserve() already has dma_resv_lock */
 	if (ret == VM_FAULT_NOPAGE && wakeref && !obj->userfault_count) {
 		obj->userfault_count = 1;
-		mutex_lock(&to_gt(to_i915(obj->base.dev))->lmem_userfault_lock);
-		list_add(&obj->userfault_link, &to_gt(to_i915(obj->base.dev))->lmem_userfault_list);
-		mutex_unlock(&to_gt(to_i915(obj->base.dev))->lmem_userfault_lock);
+		mutex_lock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock);
+		list_add(&obj->userfault_link, &to_i915(obj->base.dev)->runtime_pm.lmem_userfault_list);
+		mutex_unlock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock);
 	}
 
 	if (wakeref & CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND)
-		intel_wakeref_auto(&to_gt(to_i915(obj->base.dev))->userfault_wakeref,
+		intel_wakeref_auto(&to_i915(obj->base.dev)->runtime_pm.userfault_wakeref,
 				   msecs_to_jiffies_timeout(CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND));
 
 	i915_ttm_adjust_lru(obj);
diff --git a/drivers/gpu/drm/i915/gt/intel_gt.c b/drivers/gpu/drm/i915/gt/intel_gt.c
index 27dbb9e4bd6c..0ad8118ccbee 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt.c
+++ b/drivers/gpu/drm/i915/gt/intel_gt.c
@@ -40,8 +40,6 @@  void intel_gt_common_init_early(struct intel_gt *gt)
 {
 	spin_lock_init(gt->irq_lock);
 
-	INIT_LIST_HEAD(&gt->lmem_userfault_list);
-	mutex_init(&gt->lmem_userfault_lock);
 	INIT_LIST_HEAD(&gt->closed_vma);
 	spin_lock_init(&gt->closed_lock);
 
@@ -859,7 +857,6 @@  static int intel_gt_tile_setup(struct intel_gt *gt, phys_addr_t phys_addr)
 	}
 
 	intel_uncore_init_early(gt->uncore, gt);
-	intel_wakeref_auto_init(&gt->userfault_wakeref, gt->uncore->rpm);
 
 	ret = intel_uncore_setup_mmio(gt->uncore, phys_addr);
 	if (ret)
diff --git a/drivers/gpu/drm/i915/gt/intel_gt_types.h b/drivers/gpu/drm/i915/gt/intel_gt_types.h
index 64aa2ba624fc..ff9251807f5c 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_gt_types.h
@@ -144,20 +144,6 @@  struct intel_gt {
 	struct intel_wakeref wakeref;
 	atomic_t user_wakeref;
 
-	/**
-	 *  Protects access to lmem usefault list.
-	 *  It is required, if we are outside of the runtime suspend path,
-	 *  access to @lmem_userfault_list requires always first grabbing the
-	 *  runtime pm, to ensure we can't race against runtime suspend.
-	 *  Once we have that we also need to grab @lmem_userfault_lock,
-	 *  at which point we have exclusive access.
-	 *  The runtime suspend path is special since it doesn't really hold any locks,
-	 *  but instead has exclusive access by virtue of all other accesses requiring
-	 *  holding the runtime pm wakeref.
-	 */
-	struct mutex lmem_userfault_lock;
-	struct list_head lmem_userfault_list;
-
 	struct list_head closed_vma;
 	spinlock_t closed_lock; /* guards the list of closed_vma */
 
@@ -173,9 +159,6 @@  struct intel_gt {
 	 */
 	intel_wakeref_t awake;
 
-	/* Manual runtime pm autosuspend delay for user GGTT/lmem mmaps */
-	struct intel_wakeref_auto userfault_wakeref;
-
 	u32 clock_frequency;
 	u32 clock_period_ns;
 
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 55d605c0c55d..299f94a9fb87 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -843,7 +843,7 @@  void i915_gem_runtime_suspend(struct drm_i915_private *i915)
 		__i915_gem_object_release_mmap_gtt(obj);
 
 	list_for_each_entry_safe(obj, on,
-				 &to_gt(i915)->lmem_userfault_list, userfault_link)
+				 &i915->runtime_pm.lmem_userfault_list, userfault_link)
 		i915_gem_object_runtime_pm_release_mmap_offset(obj);
 
 	/*
@@ -1227,8 +1227,6 @@  void i915_gem_driver_remove(struct drm_i915_private *dev_priv)
 	struct intel_gt *gt;
 	unsigned int i;
 
-	intel_wakeref_auto_fini(&to_gt(dev_priv)->userfault_wakeref);
-
 	i915_gem_suspend_late(dev_priv);
 	for_each_gt(gt, dev_priv, i)
 		intel_gt_driver_remove(gt);
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 744cca507946..bb74d4975cc8 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -633,6 +633,8 @@  void intel_runtime_pm_driver_release(struct intel_runtime_pm *rpm)
 						     runtime_pm);
 	int count = atomic_read(&rpm->wakeref_count);
 
+	intel_wakeref_auto_fini(&rpm->userfault_wakeref);
+
 	drm_WARN(&i915->drm, count,
 		 "i915 raw-wakerefs=%d wakelocks=%d on cleanup\n",
 		 intel_rpm_raw_wakeref_count(count),
@@ -652,4 +654,7 @@  void intel_runtime_pm_init_early(struct intel_runtime_pm *rpm)
 	rpm->available = HAS_RUNTIME_PM(i915);
 
 	init_intel_runtime_pm_wakeref(rpm);
+	INIT_LIST_HEAD(&rpm->lmem_userfault_list);
+	mutex_init(&rpm->lmem_userfault_lock);
+	intel_wakeref_auto_init(&rpm->userfault_wakeref, rpm);
 }
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.h b/drivers/gpu/drm/i915/intel_runtime_pm.h
index d9160e3ff4af..d0c04af2a6f3 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.h
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.h
@@ -53,6 +53,28 @@  struct intel_runtime_pm {
 	bool irqs_enabled;
 	bool no_wakeref_tracking;
 
+	/**
+	 *  Protects access to lmem usefault list.
+	 *  It is required, if we are outside of the runtime suspend path,
+	 *  access to @lmem_userfault_list requires always first grabbing the
+	 *  runtime pm, to ensure we can't race against runtime suspend.
+	 *  Once we have that we also need to grab @lmem_userfault_lock,
+	 *  at which point we have exclusive access.
+	 *  The runtime suspend path is special since it doesn't really hold any locks,
+	 *  but instead has exclusive access by virtue of all other accesses requiring
+	 *  holding the runtime pm wakeref.
+	 */
+	struct mutex lmem_userfault_lock;
+
+	/*
+	 *  Keep list of userfaulted gem obj, which require to release their
+	 *  mmap mappings at runtime suspend path.
+	 */
+	struct list_head lmem_userfault_list;
+
+	/* Manual runtime pm autosuspend delay for user GGTT/lmem mmaps */
+	struct intel_wakeref_auto userfault_wakeref;
+
 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
 	/*
 	 * To aide detection of wakeref leaks and general misuse, we