All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mika Kuoppala <mika.kuoppala@linux.intel.com>
To: Chris Wilson <chris@chris-wilson.co.uk>, intel-gfx@lists.freedesktop.org
Cc: Jani Nikula <jani.nikula@intel.com>
Subject: Re: [PATCH 04/46] drm/i915: Markup paired operations on wakerefs
Date: Tue, 08 Jan 2019 18:23:18 +0200	[thread overview]
Message-ID: <87k1jf2k5l.fsf@gaia.fi.intel.com> (raw)
In-Reply-To: <20190107115509.12523-4-chris@chris-wilson.co.uk>

Chris Wilson <chris@chris-wilson.co.uk> writes:

> The majority of runtime-pm operations are bounded and scoped within a
> function; these are easy to verify that the wakeref are handled
> correctly. We can employ the compiler to help us, and reduce the number
> of wakerefs tracked when debugging, by passing around cookies provided
> by the various rpm_get functions to their rpm_put counterpart. This
> makes the pairing explicit, and given the required wakeref cookie the
> compiler can verify that we pass an initialised value to the rpm_put
> (quite handy for double checking error paths).
>
> For regular builds, the compiler should be able to eliminate the unused
> local variables and the program growth should be minimal. Fwiw, it came
> out as a net improvement as gcc was able to refactor rpm_get and
> rpm_get_if_in_use together,
>
> v2: Just s/rpm_put/rpm_put_unchecked/ everywhere, leaving the manual
> mark up for smaller more targeted patches.
>
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Jani Nikula <jani.nikula@intel.com>
> ---
>  drivers/gpu/drm/i915/Kconfig.debug            |  1 +
>  drivers/gpu/drm/i915/gvt/aperture_gm.c        |  8 +-
>  drivers/gpu/drm/i915/gvt/gvt.h                |  2 +-
>  drivers/gpu/drm/i915/gvt/sched_policy.c       |  2 +-
>  drivers/gpu/drm/i915/gvt/scheduler.c          |  4 +-
>  drivers/gpu/drm/i915/i915_debugfs.c           | 54 +++++------
>  drivers/gpu/drm/i915/i915_drv.h               |  2 +
>  drivers/gpu/drm/i915/i915_gem.c               | 20 ++---
>  drivers/gpu/drm/i915/i915_gem_execbuffer.c    |  2 +-
>  drivers/gpu/drm/i915/i915_gem_fence_reg.c     |  2 +-
>  drivers/gpu/drm/i915/i915_gem_gtt.c           |  8 +-
>  drivers/gpu/drm/i915/i915_gem_shrinker.c      | 10 +--
>  drivers/gpu/drm/i915/i915_irq.c               |  2 +-
>  drivers/gpu/drm/i915/i915_perf.c              |  4 +-
>  drivers/gpu/drm/i915/i915_pmu.c               |  6 +-
>  drivers/gpu/drm/i915/i915_sysfs.c             | 12 +--
>  drivers/gpu/drm/i915/intel_display.c          |  2 +-
>  drivers/gpu/drm/i915/intel_drv.h              | 15 +++-
>  drivers/gpu/drm/i915/intel_engine_cs.c        |  4 +-
>  drivers/gpu/drm/i915/intel_fbdev.c            |  4 +-
>  drivers/gpu/drm/i915/intel_guc_log.c          |  6 +-
>  drivers/gpu/drm/i915/intel_hotplug.c          |  2 +-
>  drivers/gpu/drm/i915/intel_huc.c              |  2 +-
>  drivers/gpu/drm/i915/intel_panel.c            |  2 +-
>  drivers/gpu/drm/i915/intel_runtime_pm.c       | 89 +++++++++++++++----
>  drivers/gpu/drm/i915/intel_uncore.c           |  2 +-
>  drivers/gpu/drm/i915/selftests/huge_pages.c   |  2 +-
>  drivers/gpu/drm/i915/selftests/i915_gem.c     | 10 +--
>  .../drm/i915/selftests/i915_gem_coherency.c   |  2 +-
>  .../gpu/drm/i915/selftests/i915_gem_context.c | 10 +--
>  .../gpu/drm/i915/selftests/i915_gem_evict.c   |  2 +-
>  drivers/gpu/drm/i915/selftests/i915_gem_gtt.c |  4 +-
>  .../gpu/drm/i915/selftests/i915_gem_object.c  |  6 +-
>  drivers/gpu/drm/i915/selftests/i915_request.c |  8 +-
>  drivers/gpu/drm/i915/selftests/intel_guc.c    |  4 +-
>  .../gpu/drm/i915/selftests/intel_hangcheck.c  |  6 +-
>  drivers/gpu/drm/i915/selftests/intel_lrc.c    | 10 +--
>  .../drm/i915/selftests/intel_workarounds.c    | 10 +--
>  38 files changed, 203 insertions(+), 138 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/Kconfig.debug b/drivers/gpu/drm/i915/Kconfig.debug
> index a97929c47466..ad4d71161dda 100644
> --- a/drivers/gpu/drm/i915/Kconfig.debug
> +++ b/drivers/gpu/drm/i915/Kconfig.debug
> @@ -173,6 +173,7 @@ config DRM_I915_DEBUG_RUNTIME_PM
>  	bool "Enable extra state checking for runtime PM"
>  	depends on DRM_I915
>  	default n
> +	select STACKDEPOT
>  	help
>  	  Choose this option to turn on extra state checking for the
>  	  runtime PM functionality. This may introduce overhead during
> diff --git a/drivers/gpu/drm/i915/gvt/aperture_gm.c b/drivers/gpu/drm/i915/gvt/aperture_gm.c
> index 359d37d5c958..1fa2f65c3cd1 100644
> --- a/drivers/gpu/drm/i915/gvt/aperture_gm.c
> +++ b/drivers/gpu/drm/i915/gvt/aperture_gm.c
> @@ -180,7 +180,7 @@ static void free_vgpu_fence(struct intel_vgpu *vgpu)
>  	}
>  	mutex_unlock(&dev_priv->drm.struct_mutex);
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  }
>  
>  static int alloc_vgpu_fence(struct intel_vgpu *vgpu)
> @@ -206,7 +206,7 @@ static int alloc_vgpu_fence(struct intel_vgpu *vgpu)
>  	_clear_vgpu_fence(vgpu);
>  
>  	mutex_unlock(&dev_priv->drm.struct_mutex);
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  	return 0;
>  out_free_fence:
>  	gvt_vgpu_err("Failed to alloc fences\n");
> @@ -219,7 +219,7 @@ static int alloc_vgpu_fence(struct intel_vgpu *vgpu)
>  		vgpu->fence.regs[i] = NULL;
>  	}
>  	mutex_unlock(&dev_priv->drm.struct_mutex);
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  	return -ENOSPC;
>  }
>  
> @@ -317,7 +317,7 @@ void intel_vgpu_reset_resource(struct intel_vgpu *vgpu)
>  
>  	intel_runtime_pm_get(dev_priv);
>  	_clear_vgpu_fence(vgpu);
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  }
>  
>  /**
> diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h
> index b4ab1dad0143..435c746c3f73 100644
> --- a/drivers/gpu/drm/i915/gvt/gvt.h
> +++ b/drivers/gpu/drm/i915/gvt/gvt.h
> @@ -597,7 +597,7 @@ static inline void mmio_hw_access_pre(struct drm_i915_private *dev_priv)
>  
>  static inline void mmio_hw_access_post(struct drm_i915_private *dev_priv)
>  {
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  }
>  
>  /**
> diff --git a/drivers/gpu/drm/i915/gvt/sched_policy.c b/drivers/gpu/drm/i915/gvt/sched_policy.c
> index c32e7d5e8629..f04b3b965bfc 100644
> --- a/drivers/gpu/drm/i915/gvt/sched_policy.c
> +++ b/drivers/gpu/drm/i915/gvt/sched_policy.c
> @@ -474,6 +474,6 @@ void intel_vgpu_stop_schedule(struct intel_vgpu *vgpu)
>  		}
>  	}
>  	spin_unlock_bh(&scheduler->mmio_context_lock);
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  	mutex_unlock(&vgpu->gvt->sched_lock);
>  }
> diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c
> index 1ad8c5e1455d..3816dcae2185 100644
> --- a/drivers/gpu/drm/i915/gvt/scheduler.c
> +++ b/drivers/gpu/drm/i915/gvt/scheduler.c
> @@ -997,7 +997,7 @@ static int workload_thread(void *priv)
>  			intel_uncore_forcewake_put(gvt->dev_priv,
>  					FORCEWAKE_ALL);
>  
> -		intel_runtime_pm_put(gvt->dev_priv);
> +		intel_runtime_pm_put_unchecked(gvt->dev_priv);
>  		if (ret && (vgpu_is_vm_unhealthy(ret)))
>  			enter_failsafe_mode(vgpu, GVT_FAILSAFE_GUEST_ERR);
>  	}
> @@ -1451,7 +1451,7 @@ intel_vgpu_create_workload(struct intel_vgpu *vgpu, int ring_id,
>  		mutex_lock(&dev_priv->drm.struct_mutex);
>  		ret = intel_gvt_scan_and_shadow_workload(workload);
>  		mutex_unlock(&dev_priv->drm.struct_mutex);
> -		intel_runtime_pm_put(dev_priv);
> +		intel_runtime_pm_put_unchecked(dev_priv);
>  	}
>  
>  	if (ret && (vgpu_is_vm_unhealthy(ret))) {
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> index 3a369245d7e6..6b8da14f213b 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -877,7 +877,7 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
>  		}
>  	}
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return 0;
>  }
> @@ -953,7 +953,7 @@ static int i915_gpu_info_open(struct inode *inode, struct file *file)
>  
>  	intel_runtime_pm_get(i915);
>  	gpu = i915_capture_gpu_state(i915);
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	if (IS_ERR(gpu))
>  		return PTR_ERR(gpu);
>  
> @@ -1226,7 +1226,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
>  	seq_printf(m, "Max CD clock frequency: %d kHz\n", dev_priv->max_cdclk_freq);
>  	seq_printf(m, "Max pixel clock frequency: %d kHz\n", dev_priv->max_dotclk_freq);
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  	return ret;
>  }
>  
> @@ -1292,7 +1292,7 @@ static int i915_hangcheck_info(struct seq_file *m, void *unused)
>  
>  	intel_engine_get_instdone(dev_priv->engine[RCS], &instdone);
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	if (timer_pending(&dev_priv->gpu_error.hangcheck_work.timer))
>  		seq_printf(m, "Hangcheck active, timer fires in %dms\n",
> @@ -1579,7 +1579,7 @@ static int i915_drpc_info(struct seq_file *m, void *unused)
>  	else
>  		err = ironlake_drpc_info(m);
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return err;
>  }
> @@ -1632,7 +1632,7 @@ static int i915_fbc_status(struct seq_file *m, void *unused)
>  	}
>  
>  	mutex_unlock(&fbc->lock);
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return 0;
>  }
> @@ -1695,7 +1695,7 @@ static int i915_ips_status(struct seq_file *m, void *unused)
>  			seq_puts(m, "Currently: disabled\n");
>  	}
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return 0;
>  }
> @@ -1723,7 +1723,7 @@ static int i915_sr_status(struct seq_file *m, void *unused)
>  		sr_enabled = I915_READ(FW_BLC_SELF_VLV) & FW_CSPWRDWNEN;
>  
>  	intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	seq_printf(m, "self-refresh: %s\n", enableddisabled(sr_enabled));
>  
> @@ -1756,7 +1756,7 @@ static int i915_emon_status(struct seq_file *m, void *unused)
>  	seq_printf(m, "GFX power: %ld\n", gfx);
>  	seq_printf(m, "Total power: %ld\n", chipset + gfx);
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return 0;
>  }
> @@ -1805,7 +1805,7 @@ static int i915_ring_freq_table(struct seq_file *m, void *unused)
>  	mutex_unlock(&dev_priv->pcu_lock);
>  
>  out:
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  	return ret;
>  }
>  
> @@ -2017,7 +2017,7 @@ static int i915_swizzle_info(struct seq_file *m, void *data)
>  	if (dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES)
>  		seq_puts(m, "L-shaped memory detected\n");
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return 0;
>  }
> @@ -2067,7 +2067,7 @@ static int i915_rps_boost_info(struct seq_file *m, void *data)
>  			act_freq = intel_get_cagf(dev_priv,
>  						  I915_READ(GEN6_RPSTAT1));
>  		}
> -		intel_runtime_pm_put(dev_priv);
> +		intel_runtime_pm_put_unchecked(dev_priv);
>  	}
>  
>  	seq_printf(m, "RPS enabled? %d\n", rps->enabled);
> @@ -2160,7 +2160,7 @@ static int i915_huc_load_status_info(struct seq_file *m, void *data)
>  
>  	intel_runtime_pm_get(dev_priv);
>  	seq_printf(m, "\nHuC status 0x%08x:\n", I915_READ(HUC_STATUS2));
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return 0;
>  }
> @@ -2192,7 +2192,7 @@ static int i915_guc_load_status_info(struct seq_file *m, void *data)
>  	for (i = 0; i < 16; i++)
>  		seq_printf(m, "\t%2d: \t0x%x\n", i, I915_READ(SOFT_SCRATCH(i)));
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return 0;
>  }
> @@ -2601,7 +2601,7 @@ static int i915_edp_psr_status(struct seq_file *m, void *data)
>  			   dev_priv->psr.last_exit);
>  	}
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  	return 0;
>  }
>  
> @@ -2632,7 +2632,7 @@ i915_edp_psr_debug_set(void *data, u64 val)
>  	drm_modeset_drop_locks(&ctx);
>  	drm_modeset_acquire_fini(&ctx);
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return ret;
>  }
> @@ -2665,7 +2665,7 @@ static int i915_energy_uJ(struct seq_file *m, void *data)
>  	intel_runtime_pm_get(dev_priv);
>  
>  	if (rdmsrl_safe(MSR_RAPL_POWER_UNIT, &power)) {
> -		intel_runtime_pm_put(dev_priv);
> +		intel_runtime_pm_put_unchecked(dev_priv);
>  		return -ENODEV;
>  	}
>  
> @@ -2673,7 +2673,7 @@ static int i915_energy_uJ(struct seq_file *m, void *data)
>  	power = I915_READ(MCH_SECP_NRG_STTS);
>  	power = (1000000 * power) >> units; /* convert to uJ */
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	seq_printf(m, "%llu", power);
>  
> @@ -2775,7 +2775,7 @@ static int i915_dmc_info(struct seq_file *m, void *unused)
>  	seq_printf(m, "ssp base: 0x%08x\n", I915_READ(CSR_SSP_BASE));
>  	seq_printf(m, "htp: 0x%08x\n", I915_READ(CSR_HTP_SKL));
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return 0;
>  }
> @@ -3114,7 +3114,7 @@ static int i915_display_info(struct seq_file *m, void *unused)
>  	drm_connector_list_iter_end(&conn_iter);
>  	mutex_unlock(&dev->mode_config.mutex);
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return 0;
>  }
> @@ -3139,7 +3139,7 @@ static int i915_engine_info(struct seq_file *m, void *unused)
>  	for_each_engine(engine, dev_priv, id)
>  		intel_engine_dump(engine, &p, "%s\n", engine->name);
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return 0;
>  }
> @@ -3265,7 +3265,7 @@ static ssize_t i915_ipc_status_write(struct file *file, const char __user *ubuf,
>  	dev_priv->wm.distrust_bios_wm = true;
>  	dev_priv->ipc_enabled = enable;
>  	intel_enable_ipc(dev_priv);
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return len;
>  }
> @@ -4090,7 +4090,7 @@ i915_drop_caches_set(void *data, u64 val)
>  		i915_gem_drain_freed_objects(i915);
>  
>  out:
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  
>  	return ret;
>  }
> @@ -4112,7 +4112,7 @@ i915_cache_sharing_get(void *data, u64 *val)
>  
>  	snpcr = I915_READ(GEN6_MBCUNIT_SNPCR);
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	*val = (snpcr & GEN6_MBC_SNPCR_MASK) >> GEN6_MBC_SNPCR_SHIFT;
>  
> @@ -4140,7 +4140,7 @@ i915_cache_sharing_set(void *data, u64 val)
>  	snpcr |= (val << GEN6_MBC_SNPCR_SHIFT);
>  	I915_WRITE(GEN6_MBCUNIT_SNPCR, snpcr);
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  	return 0;
>  }
>  
> @@ -4388,7 +4388,7 @@ static int i915_sseu_status(struct seq_file *m, void *unused)
>  		gen10_sseu_device_status(dev_priv, &sseu);
>  	}
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	i915_print_sseu_info(m, false, &sseu);
>  
> @@ -4416,7 +4416,7 @@ static int i915_forcewake_release(struct inode *inode, struct file *file)
>  		return 0;
>  
>  	intel_uncore_forcewake_user_put(i915);
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  
>  	return 0;
>  }
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 60b98103aba3..464ff89d1464 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -131,6 +131,8 @@ bool i915_error_injected(void);
>  	__i915_printk(i915, i915_error_injected() ? KERN_DEBUG : KERN_ERR, \
>  		      fmt, ##__VA_ARGS__)
>  
> +typedef depot_stack_handle_t intel_wakeref_t;
> +
>  enum hpd_pin {
>  	HPD_NONE = 0,
>  	HPD_TV = HPD_NONE,     /* TV is known to be unreliable */
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 987acbb8280f..5ac32ea4c8fa 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -176,7 +176,7 @@ static u32 __i915_gem_park(struct drm_i915_private *i915)
>  
>  	intel_display_power_put(i915, POWER_DOMAIN_GT_IRQ);
>  
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  
>  	return i915->gt.epoch;
>  }
> @@ -815,7 +815,7 @@ void i915_gem_flush_ggtt_writes(struct drm_i915_private *dev_priv)
>  	POSTING_READ_FW(RING_HEAD(RENDER_RING_BASE));
>  
>  	spin_unlock_irq(&dev_priv->uncore.lock);
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  }
>  
>  static void
> @@ -1150,7 +1150,7 @@ i915_gem_gtt_pread(struct drm_i915_gem_object *obj,
>  		i915_vma_unpin(vma);
>  	}
>  out_unlock:
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	mutex_unlock(&i915->drm.struct_mutex);
>  
>  	return ret;
> @@ -1357,7 +1357,7 @@ i915_gem_gtt_pwrite_fast(struct drm_i915_gem_object *obj,
>  		i915_vma_unpin(vma);
>  	}
>  out_rpm:
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  out_unlock:
>  	mutex_unlock(&i915->drm.struct_mutex);
>  	return ret;
> @@ -1969,7 +1969,7 @@ vm_fault_t i915_gem_fault(struct vm_fault *vmf)
>  err_unlock:
>  	mutex_unlock(&dev->struct_mutex);
>  err_rpm:
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  	i915_gem_object_unpin_pages(obj);
>  err:
>  	switch (ret) {
> @@ -2069,7 +2069,7 @@ i915_gem_release_mmap(struct drm_i915_gem_object *obj)
>  	wmb();
>  
>  out:
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  }
>  
>  void i915_gem_runtime_suspend(struct drm_i915_private *dev_priv)
> @@ -4766,7 +4766,7 @@ static void __i915_gem_free_objects(struct drm_i915_private *i915,
>  		if (on)
>  			cond_resched();
>  	}
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  }
>  
>  static void i915_gem_flush_free_objects(struct drm_i915_private *i915)
> @@ -4902,7 +4902,7 @@ void i915_gem_sanitize(struct drm_i915_private *i915)
>  	intel_engines_sanitize(i915, false);
>  
>  	intel_uncore_forcewake_put(i915, FORCEWAKE_ALL);
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  
>  	i915_gem_contexts_lost(i915);
>  	mutex_unlock(&i915->drm.struct_mutex);
> @@ -4966,12 +4966,12 @@ int i915_gem_suspend(struct drm_i915_private *i915)
>  	if (WARN_ON(!intel_engines_are_idle(i915)))
>  		i915_gem_set_wedged(i915); /* no hope, discard everything */
>  
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	return 0;
>  
>  err_unlock:
>  	mutex_unlock(&i915->drm.struct_mutex);
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	return ret;
>  }
>  
> diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> index 5b7cd7add63e..a52fa42ed8b1 100644
> --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> @@ -2425,7 +2425,7 @@ i915_gem_do_execbuffer(struct drm_device *dev,
>  		eb_release_vmas(&eb);
>  	mutex_unlock(&dev->struct_mutex);
>  err_rpm:
> -	intel_runtime_pm_put(eb.i915);
> +	intel_runtime_pm_put_unchecked(eb.i915);
>  	i915_gem_context_put(eb.ctx);
>  err_destroy:
>  	eb_destroy(&eb);
> diff --git a/drivers/gpu/drm/i915/i915_gem_fence_reg.c b/drivers/gpu/drm/i915/i915_gem_fence_reg.c
> index 24df2e2a8fc1..1f72f5047945 100644
> --- a/drivers/gpu/drm/i915/i915_gem_fence_reg.c
> +++ b/drivers/gpu/drm/i915/i915_gem_fence_reg.c
> @@ -259,7 +259,7 @@ static int fence_update(struct drm_i915_fence_reg *fence,
>  	 */
>  	if (intel_runtime_pm_get_if_in_use(fence->i915)) {
>  		fence_write(fence, vma);
> -		intel_runtime_pm_put(fence->i915);
> +		intel_runtime_pm_put_unchecked(fence->i915);
>  	}
>  
>  	if (vma) {
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index 5cc8968eb3bf..6dac9614f7ba 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -2537,7 +2537,7 @@ static int ggtt_bind_vma(struct i915_vma *vma,
>  
>  	intel_runtime_pm_get(i915);
>  	vma->vm->insert_entries(vma->vm, vma, cache_level, pte_flags);
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  
>  	vma->page_sizes.gtt = I915_GTT_PAGE_SIZE;
>  
> @@ -2557,7 +2557,7 @@ static void ggtt_unbind_vma(struct i915_vma *vma)
>  
>  	intel_runtime_pm_get(i915);
>  	vma->vm->clear_range(vma->vm, vma->node.start, vma->size);
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  }
>  
>  static int aliasing_gtt_bind_vma(struct i915_vma *vma,
> @@ -2591,7 +2591,7 @@ static int aliasing_gtt_bind_vma(struct i915_vma *vma,
>  	if (flags & I915_VMA_GLOBAL_BIND) {
>  		intel_runtime_pm_get(i915);
>  		vma->vm->insert_entries(vma->vm, vma, cache_level, pte_flags);
> -		intel_runtime_pm_put(i915);
> +		intel_runtime_pm_put_unchecked(i915);
>  	}
>  
>  	return 0;
> @@ -2604,7 +2604,7 @@ static void aliasing_gtt_unbind_vma(struct i915_vma *vma)
>  	if (vma->flags & I915_VMA_GLOBAL_BIND) {
>  		intel_runtime_pm_get(i915);
>  		vma->vm->clear_range(vma->vm, vma->node.start, vma->size);
> -		intel_runtime_pm_put(i915);
> +		intel_runtime_pm_put_unchecked(i915);
>  	}
>  
>  	if (vma->flags & I915_VMA_LOCAL_BIND) {
> diff --git a/drivers/gpu/drm/i915/i915_gem_shrinker.c b/drivers/gpu/drm/i915/i915_gem_shrinker.c
> index 72d6ea0cac7e..16693dd4d019 100644
> --- a/drivers/gpu/drm/i915/i915_gem_shrinker.c
> +++ b/drivers/gpu/drm/i915/i915_gem_shrinker.c
> @@ -266,7 +266,7 @@ i915_gem_shrink(struct drm_i915_private *i915,
>  	}
>  
>  	if (flags & I915_SHRINK_BOUND)
> -		intel_runtime_pm_put(i915);
> +		intel_runtime_pm_put_unchecked(i915);
>  
>  	i915_retire_requests(i915);
>  
> @@ -300,7 +300,7 @@ unsigned long i915_gem_shrink_all(struct drm_i915_private *i915)
>  				I915_SHRINK_BOUND |
>  				I915_SHRINK_UNBOUND |
>  				I915_SHRINK_ACTIVE);
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  
>  	return freed;
>  }
> @@ -378,7 +378,7 @@ i915_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)
>  					 I915_SHRINK_ACTIVE |
>  					 I915_SHRINK_BOUND |
>  					 I915_SHRINK_UNBOUND);
> -		intel_runtime_pm_put(i915);
> +		intel_runtime_pm_put_unchecked(i915);
>  	}
>  
>  	shrinker_unlock(i915, unlock);
> @@ -423,7 +423,7 @@ i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr)
>  	freed_pages = i915_gem_shrink(i915, -1UL, NULL,
>  				      I915_SHRINK_BOUND |
>  				      I915_SHRINK_UNBOUND);
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  
>  	/* Because we may be allocating inside our own driver, we cannot
>  	 * assert that there are no objects with pinned pages that are not
> @@ -479,7 +479,7 @@ i915_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr
>  				       I915_SHRINK_BOUND |
>  				       I915_SHRINK_UNBOUND |
>  				       I915_SHRINK_VMAPS);
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  
>  	/* We also want to clear any cached iomaps as they wrap vmap */
>  	list_for_each_entry_safe(vma, next,
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index fbb094ecf6c9..72b799c5e8f6 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -3375,7 +3375,7 @@ void i915_handle_error(struct drm_i915_private *dev_priv,
>  	wake_up_all(&dev_priv->gpu_error.reset_queue);
>  
>  out:
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  }
>  
>  /* Called from drm generic code, passed 'crtc' which
> diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
> index 5b1ae5ed97b3..e4dfd1477c78 100644
> --- a/drivers/gpu/drm/i915/i915_perf.c
> +++ b/drivers/gpu/drm/i915/i915_perf.c
> @@ -1365,7 +1365,7 @@ static void i915_oa_stream_destroy(struct i915_perf_stream *stream)
>  	free_oa_buffer(dev_priv);
>  
>  	intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	if (stream->ctx)
>  		oa_put_render_ctx_id(stream);
> @@ -2123,7 +2123,7 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream,
>  	put_oa_config(dev_priv, stream->oa_config);
>  
>  	intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  err_config:
>  	if (stream->ctx)
> diff --git a/drivers/gpu/drm/i915/i915_pmu.c b/drivers/gpu/drm/i915/i915_pmu.c
> index d6c8f8fdfda5..c99fcfce79d5 100644
> --- a/drivers/gpu/drm/i915/i915_pmu.c
> +++ b/drivers/gpu/drm/i915/i915_pmu.c
> @@ -210,7 +210,7 @@ engines_sample(struct drm_i915_private *dev_priv, unsigned int period_ns)
>  	if (fw)
>  		intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  }
>  
>  static void
> @@ -231,7 +231,7 @@ frequency_sample(struct drm_i915_private *dev_priv, unsigned int period_ns)
>  		    intel_runtime_pm_get_if_in_use(dev_priv)) {
>  			val = intel_get_cagf(dev_priv,
>  					     I915_READ_NOTRACE(GEN6_RPSTAT1));
> -			intel_runtime_pm_put(dev_priv);
> +			intel_runtime_pm_put_unchecked(dev_priv);
>  		}
>  
>  		add_sample_mult(&dev_priv->pmu.sample[__I915_SAMPLE_FREQ_ACT],
> @@ -448,7 +448,7 @@ static u64 get_rc6(struct drm_i915_private *i915)
>  
>  	if (intel_runtime_pm_get_if_in_use(i915)) {
>  		val = __get_rc6(i915);
> -		intel_runtime_pm_put(i915);
> +		intel_runtime_pm_put_unchecked(i915);
>  
>  		/*
>  		 * If we are coming back from being runtime suspended we must
> diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c
> index c0cfe7ae2ba5..53c20e103d56 100644
> --- a/drivers/gpu/drm/i915/i915_sysfs.c
> +++ b/drivers/gpu/drm/i915/i915_sysfs.c
> @@ -46,7 +46,7 @@ static u32 calc_residency(struct drm_i915_private *dev_priv,
>  
>  	intel_runtime_pm_get(dev_priv);
>  	res = intel_rc6_residency_us(dev_priv, reg);
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return DIV_ROUND_CLOSEST_ULL(res, 1000);
>  }
> @@ -274,7 +274,7 @@ static ssize_t gt_act_freq_mhz_show(struct device *kdev,
>  	}
>  	mutex_unlock(&dev_priv->pcu_lock);
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return snprintf(buf, PAGE_SIZE, "%d\n", ret);
>  }
> @@ -371,7 +371,7 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev,
>  	    val > rps->max_freq ||
>  	    val < rps->min_freq_softlimit) {
>  		mutex_unlock(&dev_priv->pcu_lock);
> -		intel_runtime_pm_put(dev_priv);
> +		intel_runtime_pm_put_unchecked(dev_priv);
>  		return -EINVAL;
>  	}
>  
> @@ -392,7 +392,7 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev,
>  
>  	mutex_unlock(&dev_priv->pcu_lock);
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return ret ?: count;
>  }
> @@ -429,7 +429,7 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
>  	    val > rps->max_freq ||
>  	    val > rps->max_freq_softlimit) {
>  		mutex_unlock(&dev_priv->pcu_lock);
> -		intel_runtime_pm_put(dev_priv);
> +		intel_runtime_pm_put_unchecked(dev_priv);
>  		return -EINVAL;
>  	}
>  
> @@ -446,7 +446,7 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
>  
>  	mutex_unlock(&dev_priv->pcu_lock);
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return ret ?: count;
>  }
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 696e6f5680df..c6000aa47a8d 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -2102,7 +2102,7 @@ intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
>  err:
>  	atomic_dec(&dev_priv->gpu_error.pending_fb_pin);
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  	return vma;
>  }
>  
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index ac513fd70315..a1e4e1033289 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -29,6 +29,7 @@
>  #include <linux/i2c.h>
>  #include <linux/hdmi.h>
>  #include <linux/sched/clock.h>
> +#include <linux/stackdepot.h>
>  #include <drm/i915_drm.h>
>  #include "i915_drv.h"
>  #include <drm/drm_crtc.h>
> @@ -2182,10 +2183,16 @@ enable_rpm_wakeref_asserts(struct drm_i915_private *i915)
>  	atomic_dec(&i915->runtime_pm.wakeref_count);
>  }
>  
> -void intel_runtime_pm_get(struct drm_i915_private *i915);
> -bool intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915);
> -void intel_runtime_pm_get_noresume(struct drm_i915_private *i915);
> -void intel_runtime_pm_put(struct drm_i915_private *i915);
> +intel_wakeref_t intel_runtime_pm_get(struct drm_i915_private *i915);
> +intel_wakeref_t intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915);
> +intel_wakeref_t intel_runtime_pm_get_noresume(struct drm_i915_private *i915);
> +
> +void intel_runtime_pm_put_unchecked(struct drm_i915_private *i915);
> +#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
> +void intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref);
> +#else
> +#define intel_runtime_pm_put(i915, wref) intel_runtime_pm_put_unchecked(i915)
> +#endif
>  
>  #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
>  void print_intel_runtime_pm_wakeref(struct drm_i915_private *i915,
> diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
> index 236cd040f271..85131166589c 100644
> --- a/drivers/gpu/drm/i915/intel_engine_cs.c
> +++ b/drivers/gpu/drm/i915/intel_engine_cs.c
> @@ -928,7 +928,7 @@ static bool ring_is_idle(struct intel_engine_cs *engine)
>  	if (INTEL_GEN(dev_priv) > 2 && !(I915_READ_MODE(engine) & MODE_IDLE))
>  		idle = false;
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return idle;
>  }
> @@ -1485,7 +1485,7 @@ void intel_engine_dump(struct intel_engine_cs *engine,
>  
>  	if (intel_runtime_pm_get_if_in_use(engine->i915)) {
>  		intel_engine_print_registers(engine, m);
> -		intel_runtime_pm_put(engine->i915);
> +		intel_runtime_pm_put_unchecked(engine->i915);
>  	} else {
>  		drm_printf(m, "\tDevice is asleep; skipping register dump\n");
>  	}
> diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
> index fb5bb5b32a60..11d877b908e2 100644
> --- a/drivers/gpu/drm/i915/intel_fbdev.c
> +++ b/drivers/gpu/drm/i915/intel_fbdev.c
> @@ -277,7 +277,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
>  	ifbdev->vma = vma;
>  	ifbdev->vma_flags = flags;
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  	mutex_unlock(&dev->struct_mutex);
>  	vga_switcheroo_client_fb_set(pdev, info);
>  	return 0;
> @@ -285,7 +285,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
>  out_unpin:
>  	intel_unpin_fb_vma(vma, flags);
>  out_unlock:
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  	mutex_unlock(&dev->struct_mutex);
>  	return ret;
>  }
> diff --git a/drivers/gpu/drm/i915/intel_guc_log.c b/drivers/gpu/drm/i915/intel_guc_log.c
> index d3ebdbc0182e..1b1581a42aa1 100644
> --- a/drivers/gpu/drm/i915/intel_guc_log.c
> +++ b/drivers/gpu/drm/i915/intel_guc_log.c
> @@ -445,7 +445,7 @@ static void guc_log_capture_logs(struct intel_guc_log *log)
>  	 */
>  	intel_runtime_pm_get(dev_priv);
>  	guc_action_flush_log_complete(guc);
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  }
>  
>  int intel_guc_log_create(struct intel_guc_log *log)
> @@ -528,7 +528,7 @@ int intel_guc_log_set_level(struct intel_guc_log *log, u32 level)
>  	ret = guc_action_control_log(guc, GUC_LOG_LEVEL_IS_VERBOSE(level),
>  				     GUC_LOG_LEVEL_IS_ENABLED(level),
>  				     GUC_LOG_LEVEL_TO_VERBOSITY(level));
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  	if (ret) {
>  		DRM_DEBUG_DRIVER("guc_log_control action failed %d\n", ret);
>  		goto out_unlock;
> @@ -610,7 +610,7 @@ void intel_guc_log_relay_flush(struct intel_guc_log *log)
>  
>  	intel_runtime_pm_get(i915);
>  	guc_action_flush_log(guc);
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  
>  	/* GuC would have updated log buffer by now, so capture it */
>  	guc_log_capture_logs(log);
> diff --git a/drivers/gpu/drm/i915/intel_hotplug.c b/drivers/gpu/drm/i915/intel_hotplug.c
> index e24174d08fed..067277ca7cff 100644
> --- a/drivers/gpu/drm/i915/intel_hotplug.c
> +++ b/drivers/gpu/drm/i915/intel_hotplug.c
> @@ -262,7 +262,7 @@ static void intel_hpd_irq_storm_reenable_work(struct work_struct *work)
>  		dev_priv->display.hpd_irq_setup(dev_priv);
>  	spin_unlock_irq(&dev_priv->irq_lock);
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  }
>  
>  bool intel_encoder_hotplug(struct intel_encoder *encoder,
> diff --git a/drivers/gpu/drm/i915/intel_huc.c b/drivers/gpu/drm/i915/intel_huc.c
> index bc27b691d824..c2b076e9bada 100644
> --- a/drivers/gpu/drm/i915/intel_huc.c
> +++ b/drivers/gpu/drm/i915/intel_huc.c
> @@ -122,7 +122,7 @@ int intel_huc_check_status(struct intel_huc *huc)
>  
>  	intel_runtime_pm_get(dev_priv);
>  	status = I915_READ(HUC_STATUS2) & HUC_FW_VERIFIED;
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return status;
>  }
> diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
> index ee3e0842d542..c2b7455a023e 100644
> --- a/drivers/gpu/drm/i915/intel_panel.c
> +++ b/drivers/gpu/drm/i915/intel_panel.c
> @@ -1213,7 +1213,7 @@ static int intel_backlight_device_get_brightness(struct backlight_device *bd)
>  	ret = scale_hw_to_user(connector, hw_level, bd->props.max_brightness);
>  
>  	drm_modeset_unlock(&dev->mode_config.connection_mutex);
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return ret;
>  }
> diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
> index 67d71cc604f1..38c22fb7152e 100644
> --- a/drivers/gpu/drm/i915/intel_runtime_pm.c
> +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
> @@ -62,7 +62,7 @@ static void init_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
>  	spin_lock_init(&i915->runtime_pm.debug_lock);
>  }
>  
> -static noinline void
> +static noinline depot_stack_handle_t
>  track_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
>  {
>  	struct i915_runtime_pm *rpm = &i915->runtime_pm;
> @@ -76,7 +76,7 @@ track_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
>  	depot_stack_handle_t stack, *stacks;
>  
>  	if (!HAS_RUNTIME_PM(i915))
> -		return;
> +		return -1;
>  
>  	save_stack_trace(&trace);
>  	if (trace.nr_entries &&
> @@ -85,7 +85,7 @@ track_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
>  
>  	stack = depot_save_stack(&trace, GFP_NOWAIT | __GFP_NOWARN);
>  	if (!stack)
> -		return;
> +		return -1;
>  
>  	spin_lock_irqsave(&rpm->debug_lock, flags);
>  	stacks = krealloc(rpm->debug_owners,
> @@ -94,8 +94,55 @@ track_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
>  	if (stacks) {
>  		stacks[rpm->debug_count++] = stack;
>  		rpm->debug_owners = stacks;
> +	} else {
> +		stack = -1;
>  	}
>  	spin_unlock_irqrestore(&rpm->debug_lock, flags);
> +
> +	return stack;
> +}
> +
> +static void cancel_intel_runtime_pm_wakeref(struct drm_i915_private *i915,
> +					    depot_stack_handle_t stack)
> +{
> +	struct i915_runtime_pm *rpm = &i915->runtime_pm;
> +	unsigned long flags, n;
> +	bool found = false;
> +
> +	if (unlikely(stack == -1))
> +		return;
> +
> +	spin_lock_irqsave(&rpm->debug_lock, flags);
> +	for (n = rpm->debug_count; n--; ) {
> +		if (rpm->debug_owners[n] == stack) {
> +			memmove(rpm->debug_owners + n,
> +				rpm->debug_owners + n + 1,
> +				(--rpm->debug_count - n) * sizeof(stack));

You could mark the released ones as a special value here? (-1).

Tho releasing from the end, should keep the size small enough
so that we dont need to care.

> +			found = true;
> +			break;
> +		}
> +	}
> +	spin_unlock_irqrestore(&rpm->debug_lock, flags);
> +
> +	if (WARN(!found,
> +		 "Unmatched wakeref (tracking %lu), count %u\n",
> +		 rpm->debug_count, atomic_read(&rpm->wakeref_count))) {
> +		unsigned long entries[STACKDEPTH];
> +		struct stack_trace trace = {
> +			.entries = entries,
> +			.max_entries = ARRAY_SIZE(entries),
> +		};
> +		char *buf;
> +
> +		buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
> +		if (!buf)
> +			return;
> +
> +		depot_fetch_stack(stack, &trace);
> +		snprint_stack_trace(buf, PAGE_SIZE, &trace, 0);
> +		DRM_DEBUG_DRIVER("wakeref %x from\n%s", stack, buf);
> +		kfree(buf);
> +	}
>  }
>  
>  static void untrack_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
> @@ -220,8 +267,10 @@ static void init_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
>  {
>  }
>  
> -static void track_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
> +static depot_stack_handle_t
> +track_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
>  {
> +	return -1;
>  }
>  
>  static void untrack_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
> @@ -1823,7 +1872,7 @@ bool intel_display_power_get_if_enabled(struct drm_i915_private *dev_priv,
>  	mutex_unlock(&power_domains->lock);
>  
>  	if (!is_enabled)
> -		intel_runtime_pm_put(dev_priv);
> +		intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return is_enabled;
>  }
> @@ -1857,7 +1906,7 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
>  
>  	mutex_unlock(&power_domains->lock);
>  
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  }
>  
>  #define I830_PIPES_POWER_DOMAINS (		\
> @@ -3965,7 +4014,7 @@ void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume)
>  void intel_power_domains_fini_hw(struct drm_i915_private *dev_priv)
>  {
>  	/* Keep the power well enabled, but cancel its rpm wakeref. */
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	/* Remove the refcount we took to keep power well support disabled. */
>  	if (!i915_modparams.disable_power_well)
> @@ -4179,7 +4228,7 @@ static void intel_power_domains_verify_state(struct drm_i915_private *dev_priv)
>   * Any runtime pm reference obtained by this function must have a symmetric
>   * call to intel_runtime_pm_put() to release the reference again.
>   */

Need to update the documentation.

> -void intel_runtime_pm_get(struct drm_i915_private *i915)
> +intel_wakeref_t intel_runtime_pm_get(struct drm_i915_private *i915)
>  {
>  	struct pci_dev *pdev = i915->drm.pdev;
>  	struct device *kdev = &pdev->dev;
> @@ -4191,7 +4240,7 @@ void intel_runtime_pm_get(struct drm_i915_private *i915)
>  	atomic_inc(&i915->runtime_pm.wakeref_count);
>  	assert_rpm_wakelock_held(i915);
>  
> -	track_intel_runtime_pm_wakeref(i915);
> +	return track_intel_runtime_pm_wakeref(i915);
>  }
>  
>  /**
> @@ -4207,7 +4256,7 @@ void intel_runtime_pm_get(struct drm_i915_private *i915)
>   *
>   * Returns: True if the wakeref was acquired, or False otherwise.

For practical purposes this could still be the case but please update
the return value type.

>   */
> -bool intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915)
> +intel_wakeref_t intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915)
>  {
>  	if (IS_ENABLED(CONFIG_PM)) {
>  		struct pci_dev *pdev = i915->drm.pdev;
> @@ -4220,15 +4269,13 @@ bool intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915)
>  		 * atm to the late/early system suspend/resume handlers.
>  		 */
>  		if (pm_runtime_get_if_in_use(kdev) <= 0)
> -			return false;
> +			return 0;
>  	}
>  
>  	atomic_inc(&i915->runtime_pm.wakeref_count);
>  	assert_rpm_wakelock_held(i915);
>  
> -	track_intel_runtime_pm_wakeref(i915);
> -
> -	return true;
> +	return track_intel_runtime_pm_wakeref(i915);
>  }
>  
>  /**
> @@ -4248,7 +4295,7 @@ bool intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915)
>   * Any runtime pm reference obtained by this function must have a symmetric
>   * call to intel_runtime_pm_put() to release the reference again.
>   */

Document update needed here also.

> -void intel_runtime_pm_get_noresume(struct drm_i915_private *i915)
> +intel_wakeref_t intel_runtime_pm_get_noresume(struct drm_i915_private *i915)
>  {
>  	struct pci_dev *pdev = i915->drm.pdev;
>  	struct device *kdev = &pdev->dev;
> @@ -4258,7 +4305,7 @@ void intel_runtime_pm_get_noresume(struct drm_i915_private *i915)
>  
>  	atomic_inc(&i915->runtime_pm.wakeref_count);
>  
> -	track_intel_runtime_pm_wakeref(i915);
> +	return track_intel_runtime_pm_wakeref(i915);
>  }
>  
>  /**
> @@ -4269,7 +4316,7 @@ void intel_runtime_pm_get_noresume(struct drm_i915_private *i915)
>   * intel_runtime_pm_get() and might power down the corresponding
>   * hardware block right away if this is the last reference.
>   */

Documentation part needs updating.

-Mika

> -void intel_runtime_pm_put(struct drm_i915_private *i915)
> +void intel_runtime_pm_put_unchecked(struct drm_i915_private *i915)
>  {
>  	struct pci_dev *pdev = i915->drm.pdev;
>  	struct device *kdev = &pdev->dev;
> @@ -4282,6 +4329,14 @@ void intel_runtime_pm_put(struct drm_i915_private *i915)
>  	pm_runtime_put_autosuspend(kdev);
>  }
>  
> +#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
> +void intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref)
> +{
> +	cancel_intel_runtime_pm_wakeref(i915, wref);
> +	intel_runtime_pm_put_unchecked(i915);
> +}
> +#endif
> +
>  /**
>   * intel_runtime_pm_enable - enable runtime pm
>   * @i915: i915 device instance
> diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
> index fff468f17d2d..8d4c76ac0e7d 100644
> --- a/drivers/gpu/drm/i915/intel_uncore.c
> +++ b/drivers/gpu/drm/i915/intel_uncore.c
> @@ -1709,7 +1709,7 @@ int i915_reg_read_ioctl(struct drm_device *dev,
>  		reg->val = I915_READ8(entry->offset_ldw);
>  	else
>  		ret = -EINVAL;
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  
>  	return ret;
>  }
> diff --git a/drivers/gpu/drm/i915/selftests/huge_pages.c b/drivers/gpu/drm/i915/selftests/huge_pages.c
> index a0c7cbc212ba..731dfd3d3fc8 100644
> --- a/drivers/gpu/drm/i915/selftests/huge_pages.c
> +++ b/drivers/gpu/drm/i915/selftests/huge_pages.c
> @@ -1789,7 +1789,7 @@ int i915_gem_huge_page_live_selftests(struct drm_i915_private *dev_priv)
>  	err = i915_subtests(tests, ctx);
>  
>  out_unlock:
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  	mutex_unlock(&dev_priv->drm.struct_mutex);
>  
>  	mock_file_free(dev_priv, file);
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem.c b/drivers/gpu/drm/i915/selftests/i915_gem.c
> index bdcc53e15e75..762e1a7125f5 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem.c
> @@ -32,7 +32,7 @@ static int switch_to_context(struct drm_i915_private *i915,
>  		i915_request_add(rq);
>  	}
>  
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  
>  	return err;
>  }
> @@ -76,7 +76,7 @@ static void simulate_hibernate(struct drm_i915_private *i915)
>  	 */
>  	trash_stolen(i915);
>  
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  }
>  
>  static int pm_prepare(struct drm_i915_private *i915)
> @@ -98,7 +98,7 @@ static void pm_suspend(struct drm_i915_private *i915)
>  	i915_gem_suspend_gtt_mappings(i915);
>  	i915_gem_suspend_late(i915);
>  
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  }
>  
>  static void pm_hibernate(struct drm_i915_private *i915)
> @@ -110,7 +110,7 @@ static void pm_hibernate(struct drm_i915_private *i915)
>  	i915_gem_freeze(i915);
>  	i915_gem_freeze_late(i915);
>  
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  }
>  
>  static void pm_resume(struct drm_i915_private *i915)
> @@ -125,7 +125,7 @@ static void pm_resume(struct drm_i915_private *i915)
>  	i915_gem_sanitize(i915);
>  	i915_gem_resume(i915);
>  
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  }
>  
>  static int igt_gem_suspend(void *arg)
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c b/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
> index f7392c1ffe75..eea4fc2445ae 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
> @@ -376,7 +376,7 @@ static int igt_gem_coherency(void *arg)
>  		}
>  	}
>  unlock:
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	mutex_unlock(&i915->drm.struct_mutex);
>  	kfree(offsets);
>  	return err;
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> index d00cdf3c2939..6e1a0711d201 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> @@ -243,7 +243,7 @@ static int live_nop_switch(void *arg)
>  	}
>  
>  out_unlock:
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	mutex_unlock(&i915->drm.struct_mutex);
>  	mock_file_free(i915, file);
>  	return err;
> @@ -609,7 +609,7 @@ static int igt_ctx_exec(void *arg)
>  
>  			intel_runtime_pm_get(i915);
>  			err = gpu_fill(obj, ctx, engine, dw);
> -			intel_runtime_pm_put(i915);
> +			intel_runtime_pm_put_unchecked(i915);
>  			if (err) {
>  				pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) in ctx %u [full-ppgtt? %s], err=%d\n",
>  				       ndwords, dw, max_dwords(obj),
> @@ -715,7 +715,7 @@ static int igt_ctx_readonly(void *arg)
>  
>  			intel_runtime_pm_get(i915);
>  			err = gpu_fill(obj, ctx, engine, dw);
> -			intel_runtime_pm_put(i915);
> +			intel_runtime_pm_put_unchecked(i915);
>  			if (err) {
>  				pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) in ctx %u [full-ppgtt? %s], err=%d\n",
>  				       ndwords, dw, max_dwords(obj),
> @@ -1067,7 +1067,7 @@ static int igt_vm_isolation(void *arg)
>  		count, RUNTIME_INFO(i915)->num_rings);
>  
>  out_rpm:
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  out_unlock:
>  	if (end_live_test(&t))
>  		err = -EIO;
> @@ -1200,7 +1200,7 @@ static int igt_switch_to_kernel_context(void *arg)
>  	if (igt_flush_test(i915, I915_WAIT_LOCKED))
>  		err = -EIO;
>  
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	mutex_unlock(&i915->drm.struct_mutex);
>  
>  	kernel_context_close(ctx);
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
> index 4365979d8222..8d22f73a9b63 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
> @@ -464,7 +464,7 @@ static int igt_evict_contexts(void *arg)
>  	}
>  	if (drm_mm_node_allocated(&hole))
>  		drm_mm_remove_node(&hole);
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	mutex_unlock(&i915->drm.struct_mutex);
>  
>  	return err;
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
> index a9ed0ecc94e2..87cb0602a5fc 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
> @@ -295,7 +295,7 @@ static int lowlevel_hole(struct drm_i915_private *i915,
>  
>  			intel_runtime_pm_get(i915);
>  			vm->insert_entries(vm, &mock_vma, I915_CACHE_NONE, 0);
> -			intel_runtime_pm_put(i915);
> +			intel_runtime_pm_put_unchecked(i915);
>  		}
>  		count = n;
>  
> @@ -1216,7 +1216,7 @@ static int igt_ggtt_page(void *arg)
>  	kfree(order);
>  out_remove:
>  	ggtt->vm.clear_range(&ggtt->vm, tmp.start, tmp.size);
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	drm_mm_remove_node(&tmp);
>  out_unpin:
>  	i915_gem_object_unpin_pages(obj);
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_object.c b/drivers/gpu/drm/i915/selftests/i915_gem_object.c
> index be7ecb66ad11..b03890c590d7 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_object.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_object.c
> @@ -444,7 +444,7 @@ next_tiling: ;
>  	}
>  
>  out_unlock:
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	mutex_unlock(&i915->drm.struct_mutex);
>  	i915_gem_object_unpin_pages(obj);
>  out:
> @@ -508,7 +508,7 @@ static void disable_retire_worker(struct drm_i915_private *i915)
>  	if (!i915->gt.active_requests++) {
>  		intel_runtime_pm_get(i915);
>  		i915_gem_unpark(i915);
> -		intel_runtime_pm_put(i915);
> +		intel_runtime_pm_put_unchecked(i915);
>  	}
>  	mutex_unlock(&i915->drm.struct_mutex);
>  	cancel_delayed_work_sync(&i915->gt.retire_work);
> @@ -590,7 +590,7 @@ static int igt_mmap_offset_exhaustion(void *arg)
>  		mutex_lock(&i915->drm.struct_mutex);
>  		intel_runtime_pm_get(i915);
>  		err = make_obj_busy(obj);
> -		intel_runtime_pm_put(i915);
> +		intel_runtime_pm_put_unchecked(i915);
>  		mutex_unlock(&i915->drm.struct_mutex);
>  		if (err) {
>  			pr_err("[loop %d] Failed to busy the object\n", loop);
> diff --git a/drivers/gpu/drm/i915/selftests/i915_request.c b/drivers/gpu/drm/i915/selftests/i915_request.c
> index 07e557815308..e8880cabd5c7 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_request.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_request.c
> @@ -403,7 +403,7 @@ static int live_nop_request(void *arg)
>  	}
>  
>  out_unlock:
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	mutex_unlock(&i915->drm.struct_mutex);
>  	return err;
>  }
> @@ -553,7 +553,7 @@ static int live_empty_request(void *arg)
>  	i915_vma_unpin(batch);
>  	i915_vma_put(batch);
>  out_unlock:
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	mutex_unlock(&i915->drm.struct_mutex);
>  	return err;
>  }
> @@ -731,7 +731,7 @@ static int live_all_engines(void *arg)
>  	i915_vma_unpin(batch);
>  	i915_vma_put(batch);
>  out_unlock:
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	mutex_unlock(&i915->drm.struct_mutex);
>  	return err;
>  }
> @@ -860,7 +860,7 @@ static int live_sequential_engines(void *arg)
>  		i915_request_put(request[id]);
>  	}
>  out_unlock:
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	mutex_unlock(&i915->drm.struct_mutex);
>  	return err;
>  }
> diff --git a/drivers/gpu/drm/i915/selftests/intel_guc.c b/drivers/gpu/drm/i915/selftests/intel_guc.c
> index 32cba4cae31a..3590ba3d8897 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_guc.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_guc.c
> @@ -225,7 +225,7 @@ static int igt_guc_clients(void *args)
>  	guc_clients_create(guc);
>  	guc_clients_enable(guc);
>  unlock:
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  	mutex_unlock(&dev_priv->drm.struct_mutex);
>  	return err;
>  }
> @@ -337,7 +337,7 @@ static int igt_guc_doorbells(void *arg)
>  			guc_client_free(clients[i]);
>  		}
>  unlock:
> -	intel_runtime_pm_put(dev_priv);
> +	intel_runtime_pm_put_unchecked(dev_priv);
>  	mutex_unlock(&dev_priv->drm.struct_mutex);
>  	return err;
>  }
> diff --git a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
> index 0aadbd9c7d56..33bd3c4b6fa3 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
> @@ -402,7 +402,7 @@ static int igt_wedged_reset(void *arg)
>  	i915_reset(i915, ALL_ENGINES, NULL);
>  	GEM_BUG_ON(test_bit(I915_RESET_HANDOFF, &i915->gpu_error.flags));
>  
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	mutex_unlock(&i915->drm.struct_mutex);
>  	igt_global_reset_unlock(i915);
>  
> @@ -1636,7 +1636,7 @@ static int igt_atomic_reset(void *arg)
>  	force_reset(i915);
>  
>  unlock:
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	mutex_unlock(&i915->drm.struct_mutex);
>  	igt_global_reset_unlock(i915);
>  
> @@ -1679,7 +1679,7 @@ int intel_hangcheck_live_selftests(struct drm_i915_private *i915)
>  	mutex_unlock(&i915->drm.struct_mutex);
>  
>  	i915_modparams.enable_hangcheck = saved_hangcheck;
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  
>  	return err;
>  }
> diff --git a/drivers/gpu/drm/i915/selftests/intel_lrc.c b/drivers/gpu/drm/i915/selftests/intel_lrc.c
> index 00caaa00f02f..ac1b18a17f3c 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_lrc.c
> @@ -65,7 +65,7 @@ static int live_sanitycheck(void *arg)
>  	igt_spinner_fini(&spin);
>  err_unlock:
>  	igt_flush_test(i915, I915_WAIT_LOCKED);
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	mutex_unlock(&i915->drm.struct_mutex);
>  	return err;
>  }
> @@ -158,7 +158,7 @@ static int live_preempt(void *arg)
>  	igt_spinner_fini(&spin_hi);
>  err_unlock:
>  	igt_flush_test(i915, I915_WAIT_LOCKED);
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	mutex_unlock(&i915->drm.struct_mutex);
>  	return err;
>  }
> @@ -251,7 +251,7 @@ static int live_late_preempt(void *arg)
>  	igt_spinner_fini(&spin_hi);
>  err_unlock:
>  	igt_flush_test(i915, I915_WAIT_LOCKED);
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	mutex_unlock(&i915->drm.struct_mutex);
>  	return err;
>  
> @@ -374,7 +374,7 @@ static int live_preempt_hang(void *arg)
>  	igt_spinner_fini(&spin_hi);
>  err_unlock:
>  	igt_flush_test(i915, I915_WAIT_LOCKED);
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	mutex_unlock(&i915->drm.struct_mutex);
>  	return err;
>  }
> @@ -627,7 +627,7 @@ static int live_preempt_smoke(void *arg)
>  err_batch:
>  	i915_gem_object_put(smoke.batch);
>  err_unlock:
> -	intel_runtime_pm_put(smoke.i915);
> +	intel_runtime_pm_put_unchecked(smoke.i915);
>  	mutex_unlock(&smoke.i915->drm.struct_mutex);
>  	kfree(smoke.contexts);
>  
> diff --git a/drivers/gpu/drm/i915/selftests/intel_workarounds.c b/drivers/gpu/drm/i915/selftests/intel_workarounds.c
> index c2b3cd8fcc34..54f5c2de3d08 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_workarounds.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_workarounds.c
> @@ -49,7 +49,7 @@ read_nonprivs(struct i915_gem_context *ctx, struct intel_engine_cs *engine)
>  
>  	intel_runtime_pm_get(engine->i915);
>  	rq = i915_request_alloc(engine, ctx);
> -	intel_runtime_pm_put(engine->i915);
> +	intel_runtime_pm_put_unchecked(engine->i915);
>  	if (IS_ERR(rq)) {
>  		err = PTR_ERR(rq);
>  		goto err_pin;
> @@ -196,7 +196,7 @@ switch_to_scratch_context(struct intel_engine_cs *engine,
>  	else
>  		rq = i915_request_alloc(engine, ctx);
>  
> -	intel_runtime_pm_put(engine->i915);
> +	intel_runtime_pm_put_unchecked(engine->i915);
>  
>  	kernel_context_close(ctx);
>  
> @@ -255,7 +255,7 @@ static int check_whitelist_across_reset(struct intel_engine_cs *engine,
>  
>  	intel_runtime_pm_get(i915);
>  	err = reset(engine);
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  
>  	if (want_spin) {
>  		igt_spinner_end(&spin);
> @@ -364,7 +364,7 @@ live_gpu_reset_gt_engine_workarounds(void *arg)
>  	ok = verify_gt_engine_wa(i915, "after reset");
>  
>  out:
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	igt_global_reset_unlock(i915);
>  
>  	return ok ? 0 : -ESRCH;
> @@ -443,7 +443,7 @@ live_engine_reset_gt_engine_workarounds(void *arg)
>  	}
>  
>  err:
> -	intel_runtime_pm_put(i915);
> +	intel_runtime_pm_put_unchecked(i915);
>  	igt_global_reset_unlock(i915);
>  	kernel_context_close(ctx);
>  
> -- 
> 2.20.1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2019-01-08 16:24 UTC|newest]

Thread overview: 111+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-07 11:54 [PATCH 01/46] drm/i915: Return immediately if trylock fails for direct-reclaim Chris Wilson
2019-01-07 11:54 ` [PATCH 02/46] drm/i915: Report the number of closed vma held by each context in debugfs Chris Wilson
2019-01-07 12:35   ` Mika Kuoppala
2019-01-07 11:54 ` [PATCH 03/46] drm/i915: Track all held rpm wakerefs Chris Wilson
2019-01-07 13:14   ` Mika Kuoppala
2019-01-07 13:22     ` Chris Wilson
2019-01-08 11:45   ` [PATCH v2] " Chris Wilson
2019-01-08 12:22   ` [PATCH v3] " Chris Wilson
2019-01-08 12:49     ` Mika Kuoppala
2019-01-08 20:05     ` kbuild test robot
2019-01-07 11:54 ` [PATCH 04/46] drm/i915: Markup paired operations on wakerefs Chris Wilson
2019-01-08 16:23   ` Mika Kuoppala [this message]
2019-01-08 16:41     ` Chris Wilson
2019-01-09  9:23       ` Mika Kuoppala
2019-01-09 11:51         ` Chris Wilson
2019-01-09 23:33           ` John Harrison
2019-01-07 11:54 ` [PATCH 05/46] drm/i915: Track GT wakeref Chris Wilson
2019-01-09  9:52   ` Mika Kuoppala
2019-01-07 11:54 ` [PATCH 06/46] drm/i915: Track the rpm wakerefs for error handling Chris Wilson
2019-01-09 10:12   ` Mika Kuoppala
2019-01-07 11:54 ` [PATCH 07/46] drm/i915: Mark up sysfs with rpm wakeref tracking Chris Wilson
2019-01-09 10:13   ` Mika Kuoppala
2019-01-07 11:54 ` [PATCH 08/46] drm/i915: Mark up debugfs " Chris Wilson
2019-01-09 10:20   ` Mika Kuoppala
2019-01-09 11:49     ` Chris Wilson
2019-01-07 11:54 ` [PATCH 09/46] drm/i915/perf: Track the rpm wakeref Chris Wilson
2019-01-09 10:30   ` Mika Kuoppala
2019-01-09 11:45     ` Chris Wilson
2019-01-07 11:54 ` [PATCH 10/46] drm/i915/pmu: Track " Chris Wilson
2019-01-09 10:37   ` Mika Kuoppala
2019-01-07 11:54 ` [PATCH 11/46] drm/i915/guc: Track the " Chris Wilson
2019-01-09 10:53   ` Mika Kuoppala
2019-01-07 11:54 ` [PATCH 12/46] drm/i915/gem: Track the rpm wakerefs Chris Wilson
2019-01-09 11:16   ` Mika Kuoppala
2019-01-09 23:45     ` John Harrison
2019-01-07 11:54 ` [PATCH 13/46] drm/i915/fb: Track " Chris Wilson
2019-01-09 11:39   ` Mika Kuoppala
2019-01-07 11:54 ` [PATCH 14/46] drm/i915/hotplug: Track temporary rpm wakeref Chris Wilson
2019-01-09 11:40   ` Mika Kuoppala
2019-01-07 11:54 ` [PATCH 15/46] drm/i915/panel: " Chris Wilson
2019-01-09 11:41   ` Mika Kuoppala
2019-01-07 11:54 ` [PATCH 16/46] drm/i915/selftests: Mark up rpm wakerefs Chris Wilson
2019-01-09 12:54   ` Mika Kuoppala
2019-01-07 11:54 ` [PATCH 17/46] drm/i915: Syntatic sugar for using intel_runtime_pm Chris Wilson
2019-01-09 14:30   ` Mika Kuoppala
2019-01-10  0:24   ` John Harrison
2019-01-10  1:10     ` John Harrison
2019-01-10  9:59       ` Chris Wilson
2019-01-07 11:54 ` [PATCH 18/46] drm/i915: Markup paired operations on display power domains Chris Wilson
2019-01-10  0:55   ` John Harrison
2019-01-10 10:00     ` Chris Wilson
2019-01-07 11:54 ` [PATCH 19/46] drm/i915: Track the wakeref used to initialise " Chris Wilson
2019-01-07 11:54 ` [PATCH 20/46] drm/i915: Combined gt.awake/gt.power wakerefs Chris Wilson
2019-01-07 11:54 ` [PATCH 21/46] drm/i915/dp: Markup pps lock power well Chris Wilson
2019-01-07 11:54 ` [PATCH 22/46] drm/i915: Complain if hsw_get_pipe_config acquires the same power well twice Chris Wilson
2019-01-07 11:54 ` [PATCH 23/46] drm/i915: Mark up Ironlake ips with rpm wakerefs Chris Wilson
2019-01-07 11:54 ` [PATCH 24/46] drm/i915: Serialise concurrent calls to i915_gem_set_wedged() Chris Wilson
2019-01-07 11:54 ` [PATCH 25/46] drm/i915: Differentiate between ggtt->mutex and ppgtt->mutex Chris Wilson
2019-01-08  9:00   ` Tvrtko Ursulin
2019-01-07 11:54 ` [PATCH 26/46] drm/i915: Pull all the reset functionality together into i915_reset.c Chris Wilson
2019-01-07 11:54 ` [PATCH 27/46] drm/i915: Make all GPU resets atomic Chris Wilson
2019-01-07 11:54 ` [PATCH 28/46] drm/i915/guc: Disable global reset Chris Wilson
2019-01-07 11:54 ` [PATCH 29/46] drm/i915: Remove GPU reset dependence on struct_mutex Chris Wilson
2019-01-07 11:54 ` [PATCH 30/46] drm/i915: Issue engine resets onto idle engines Chris Wilson
2019-01-07 11:54 ` [PATCH 31/46] drm/i915: Stop tracking MRU activity on VMA Chris Wilson
2019-01-16 16:27   ` Tvrtko Ursulin
2019-01-16 16:37     ` Chris Wilson
2019-01-07 11:54 ` [PATCH 32/46] drm/i915: Pull VM lists under the VM mutex Chris Wilson
2019-01-16 16:47   ` Tvrtko Ursulin
2019-01-16 17:01     ` Chris Wilson
2019-01-17 16:23       ` Tvrtko Ursulin
2019-01-17 23:20         ` Chris Wilson
2019-01-07 11:54 ` [PATCH 33/46] drm/i915: Move vma lookup to its own lock Chris Wilson
2019-01-07 11:54 ` [PATCH 34/46] drm/i915: Move intel_execlists_show_requests() aside Chris Wilson
2019-01-07 11:54 ` [PATCH 35/46] drm/i915: Use b->irq_enable() as predicate for mock engine Chris Wilson
2019-01-07 11:54 ` [PATCH 36/46] drm/i915/selftests: Allocate mock ring/timeline per context Chris Wilson
2019-01-07 11:55 ` [PATCH 37/46] drm/i915/selftests: Make evict tolerant of foreign objects Chris Wilson
2019-01-07 11:55 ` [PATCH 38/46] drm/i915: Remove the intel_engine_notify tracepoint Chris Wilson
2019-01-07 11:55 ` [PATCH 39/46] drm/i915: Always allocate an object/vma for the HWSP Chris Wilson
2019-01-10 10:52   ` Matthew Auld
2019-01-10 11:07     ` Chris Wilson
2019-01-10 11:24   ` Matthew Auld
2019-01-07 11:55 ` [PATCH 40/46] drm/i915: Move list of timelines under its own lock Chris Wilson
2019-01-07 11:55 ` [PATCH 41/46] drm/i915: Introduce concept of per-timeline (context) HWSP Chris Wilson
2019-01-15  0:55   ` John Harrison
2019-01-15  9:14     ` Chris Wilson
2019-01-15 15:40       ` Chris Wilson
2019-01-15 17:56         ` John Harrison
2019-01-07 11:55 ` [PATCH 42/46] drm/i915: Enlarge vma->pin_count Chris Wilson
2019-01-15 19:57   ` John Harrison
2019-01-15 20:17     ` Chris Wilson
2019-01-16  0:18       ` John Harrison
2019-01-07 11:55 ` [PATCH 43/46] drm/i915: Allocate a status page for each timeline Chris Wilson
2019-01-15  0:56   ` John Harrison
2019-01-15  9:50     ` Chris Wilson
2019-01-15 18:17       ` John Harrison
2019-01-15 18:43         ` Chris Wilson
2019-01-16 21:06           ` John Harrison
2019-01-16 21:15             ` Chris Wilson
2019-01-07 11:55 ` [PATCH 44/46] drm/i915: Track the context's seqno in its own timeline HWSP Chris Wilson
2019-01-07 11:55 ` [PATCH 45/46] drm/i915: Identify active requests Chris Wilson
2019-01-07 11:55 ` [PATCH 46/46] drm/i915: Replace global breadcrumbs with per-context interrupt tracking Chris Wilson
2019-01-07 12:45 ` ✗ Fi.CI.CHECKPATCH: warning for series starting with [01/46] drm/i915: Return immediately if trylock fails for direct-reclaim Patchwork
2019-01-07 13:02 ` ✗ Fi.CI.SPARSE: " Patchwork
2019-01-07 13:05 ` ✓ Fi.CI.BAT: success " Patchwork
2019-01-07 14:00 ` [PATCH 01/46] " Tvrtko Ursulin
2019-01-07 14:07   ` Chris Wilson
2019-01-08  8:58     ` Tvrtko Ursulin
2019-01-07 17:10 ` ✗ Fi.CI.IGT: failure for series starting with [01/46] " Patchwork
2019-01-07 17:19   ` Chris Wilson
2019-01-08 13:50 ` ✗ Fi.CI.BAT: failure for series starting with [01/46] drm/i915: Return immediately if trylock fails for direct-reclaim (rev3) Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87k1jf2k5l.fsf@gaia.fi.intel.com \
    --to=mika.kuoppala@linux.intel.com \
    --cc=chris@chris-wilson.co.uk \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=jani.nikula@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.