Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915: Encapsulate lmem rpm stuff in intel_runtime_pm

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.

v2:
- Fixes the code comment nit. [Matt Auld]

Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Acked-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221027092242.1476080-2-anshuman.gupta@intel.com

+36 -31
+3 -3
drivers/gpu/drm/i915/gem/i915_gem_mman.c
··· 413 413 vma->mmo = mmo; 414 414 415 415 if (CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND) 416 - intel_wakeref_auto(&to_gt(i915)->userfault_wakeref, 416 + intel_wakeref_auto(&i915->runtime_pm.userfault_wakeref, 417 417 msecs_to_jiffies_timeout(CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND)); 418 418 419 419 if (write) { ··· 589 589 spin_unlock(&obj->mmo.lock); 590 590 591 591 if (obj->userfault_count) { 592 - mutex_lock(&to_gt(to_i915(obj->base.dev))->lmem_userfault_lock); 592 + mutex_lock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock); 593 593 list_del(&obj->userfault_link); 594 - mutex_unlock(&to_gt(to_i915(obj->base.dev))->lmem_userfault_lock); 594 + mutex_unlock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock); 595 595 obj->userfault_count = 0; 596 596 } 597 597 }
+1 -1
drivers/gpu/drm/i915/gem/i915_gem_pm.c
··· 27 27 28 28 GEM_TRACE("%s\n", dev_name(i915->drm.dev)); 29 29 30 - intel_wakeref_auto(&to_gt(i915)->userfault_wakeref, 0); 30 + intel_wakeref_auto(&i915->runtime_pm.userfault_wakeref, 0); 31 31 flush_workqueue(i915->wq); 32 32 33 33 /*
+4 -4
drivers/gpu/drm/i915/gem/i915_gem_ttm.c
··· 1101 1101 /* ttm_bo_vm_reserve() already has dma_resv_lock */ 1102 1102 if (ret == VM_FAULT_NOPAGE && wakeref && !obj->userfault_count) { 1103 1103 obj->userfault_count = 1; 1104 - mutex_lock(&to_gt(to_i915(obj->base.dev))->lmem_userfault_lock); 1105 - list_add(&obj->userfault_link, &to_gt(to_i915(obj->base.dev))->lmem_userfault_list); 1106 - mutex_unlock(&to_gt(to_i915(obj->base.dev))->lmem_userfault_lock); 1104 + mutex_lock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock); 1105 + list_add(&obj->userfault_link, &to_i915(obj->base.dev)->runtime_pm.lmem_userfault_list); 1106 + mutex_unlock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock); 1107 1107 } 1108 1108 1109 1109 if (wakeref & CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND) 1110 - intel_wakeref_auto(&to_gt(to_i915(obj->base.dev))->userfault_wakeref, 1110 + intel_wakeref_auto(&to_i915(obj->base.dev)->runtime_pm.userfault_wakeref, 1111 1111 msecs_to_jiffies_timeout(CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND)); 1112 1112 1113 1113 i915_ttm_adjust_lru(obj);
-3
drivers/gpu/drm/i915/gt/intel_gt.c
··· 40 40 { 41 41 spin_lock_init(gt->irq_lock); 42 42 43 - INIT_LIST_HEAD(&gt->lmem_userfault_list); 44 - mutex_init(&gt->lmem_userfault_lock); 45 43 INIT_LIST_HEAD(&gt->closed_vma); 46 44 spin_lock_init(&gt->closed_lock); 47 45 ··· 857 859 } 858 860 859 861 intel_uncore_init_early(gt->uncore, gt); 860 - intel_wakeref_auto_init(&gt->userfault_wakeref, gt->uncore->rpm); 861 862 862 863 ret = intel_uncore_setup_mmio(gt->uncore, phys_addr); 863 864 if (ret)
-17
drivers/gpu/drm/i915/gt/intel_gt_types.h
··· 145 145 struct intel_wakeref wakeref; 146 146 atomic_t user_wakeref; 147 147 148 - /** 149 - * Protects access to lmem usefault list. 150 - * It is required, if we are outside of the runtime suspend path, 151 - * access to @lmem_userfault_list requires always first grabbing the 152 - * runtime pm, to ensure we can't race against runtime suspend. 153 - * Once we have that we also need to grab @lmem_userfault_lock, 154 - * at which point we have exclusive access. 155 - * The runtime suspend path is special since it doesn't really hold any locks, 156 - * but instead has exclusive access by virtue of all other accesses requiring 157 - * holding the runtime pm wakeref. 158 - */ 159 - struct mutex lmem_userfault_lock; 160 - struct list_head lmem_userfault_list; 161 - 162 148 struct list_head closed_vma; 163 149 spinlock_t closed_lock; /* guards the list of closed_vma */ 164 150 ··· 159 173 * is a slight delay before we do so. 160 174 */ 161 175 intel_wakeref_t awake; 162 - 163 - /* Manual runtime pm autosuspend delay for user GGTT/lmem mmaps */ 164 - struct intel_wakeref_auto userfault_wakeref; 165 176 166 177 u32 clock_frequency; 167 178 u32 clock_period_ns;
+1 -3
drivers/gpu/drm/i915/i915_gem.c
··· 843 843 __i915_gem_object_release_mmap_gtt(obj); 844 844 845 845 list_for_each_entry_safe(obj, on, 846 - &to_gt(i915)->lmem_userfault_list, userfault_link) 846 + &i915->runtime_pm.lmem_userfault_list, userfault_link) 847 847 i915_gem_object_runtime_pm_release_mmap_offset(obj); 848 848 849 849 /* ··· 1226 1226 { 1227 1227 struct intel_gt *gt; 1228 1228 unsigned int i; 1229 - 1230 - intel_wakeref_auto_fini(&to_gt(dev_priv)->userfault_wakeref); 1231 1229 1232 1230 i915_gem_suspend_late(dev_priv); 1233 1231 for_each_gt(gt, dev_priv, i)
+5
drivers/gpu/drm/i915/intel_runtime_pm.c
··· 626 626 runtime_pm); 627 627 int count = atomic_read(&rpm->wakeref_count); 628 628 629 + intel_wakeref_auto_fini(&rpm->userfault_wakeref); 630 + 629 631 drm_WARN(&i915->drm, count, 630 632 "i915 raw-wakerefs=%d wakelocks=%d on cleanup\n", 631 633 intel_rpm_raw_wakeref_count(count), ··· 647 645 rpm->available = HAS_RUNTIME_PM(i915); 648 646 649 647 init_intel_runtime_pm_wakeref(rpm); 648 + INIT_LIST_HEAD(&rpm->lmem_userfault_list); 649 + mutex_init(&rpm->lmem_userfault_lock); 650 + intel_wakeref_auto_init(&rpm->userfault_wakeref, rpm); 650 651 }
+22
drivers/gpu/drm/i915/intel_runtime_pm.h
··· 53 53 bool irqs_enabled; 54 54 bool no_wakeref_tracking; 55 55 56 + /* 57 + * Protects access to lmem usefault list. 58 + * It is required, if we are outside of the runtime suspend path, 59 + * access to @lmem_userfault_list requires always first grabbing the 60 + * runtime pm, to ensure we can't race against runtime suspend. 61 + * Once we have that we also need to grab @lmem_userfault_lock, 62 + * at which point we have exclusive access. 63 + * The runtime suspend path is special since it doesn't really hold any locks, 64 + * but instead has exclusive access by virtue of all other accesses requiring 65 + * holding the runtime pm wakeref. 66 + */ 67 + struct mutex lmem_userfault_lock; 68 + 69 + /* 70 + * Keep list of userfaulted gem obj, which require to release their 71 + * mmap mappings at runtime suspend path. 72 + */ 73 + struct list_head lmem_userfault_list; 74 + 75 + /* Manual runtime pm autosuspend delay for user GGTT/lmem mmaps */ 76 + struct intel_wakeref_auto userfault_wakeref; 77 + 56 78 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) 57 79 /* 58 80 * To aide detection of wakeref leaks and general misuse, we