i915 PMU and engine busy stats
Subsystems (3)
Tvrtko Ursulin
maintainerv4 cover i915 PMU and engine busy stats
From: Tvrtko Ursulin <[email protected]>
Fourth spin of the i915 PMU series. Now with the RFC tag removed.
This is a cleaned up and bugfixed version with incorporated inital review feedback. Some patches have been dropped for time being.
Patches 1-2 are small refactors to make the following work easier.
Patch 3 is the main bit.
Patch 4 is a small optimisation on top, to only run the sampling timer when it is required. (Depending on GPU awake status and active PMU counters.)
Patches 5-7 add software engine busyness tracking, which is then used from the PMU in patch 7. This allows more efficient and more accurate engine busyness metric.
And finally patch 8 is an additional optimisation which hides the whole cost of the software engine busyness tracking behind a single nop instruction in the off case.
Tvrtko Ursulin (8):
drm/i915: Convert intel_rc6_residency_us to ns drm/i915: Extract intel_get_cagf
drm/i915/pmu: Expose a PMU interface for perf queries drm/i915/pmu: Suspend sampling when GPU is idle drm/i915: Wrap context schedule notification drm/i915: Engine busy time tracking drm/i915/pmu: Wire up engine busy stats to PMU drm/i915: Gate engine stats collection with a static key
drivers/gpu/drm/i915/Makefile | 1 + drivers/gpu/drm/i915/i915_debugfs.c | 9 +- drivers/gpu/drm/i915/i915_drv.c | 2 + drivers/gpu/drm/i915/i915_drv.h | 96 +++- drivers/gpu/drm/i915/i915_gem.c | 1 + drivers/gpu/drm/i915/i915_gem_request.c | 1 + drivers/gpu/drm/i915/i915_pmu.c | 853 ++++++++++++++++++++++++++++++++ drivers/gpu/drm/i915/i915_reg.h | 3 + drivers/gpu/drm/i915/i915_sysfs.c | 20 +- drivers/gpu/drm/i915/intel_engine_cs.c | 111 +++++ drivers/gpu/drm/i915/intel_lrc.c | 19 +- drivers/gpu/drm/i915/intel_pm.c | 41 +- drivers/gpu/drm/i915/intel_ringbuffer.c | 25 + drivers/gpu/drm/i915/intel_ringbuffer.h | 147 ++++++ include/uapi/drm/i915_drm.h | 57 +++ 15 files changed, 1351 insertions(+), 35 deletions(-) create mode 100644 drivers/gpu/drm/i915/i915_pmu.c
Signature · 6 lines
2.9.5 _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Tvrtko Ursulin
maintainerPATCH v4 1/8 drm/i915: Convert intel_rc6_residency_us to ns
From: Tvrtko Ursulin <[email protected]>
Will be used for exposing the PMU counters.
v2:
* Move intel_runtime_pm_get/put to the callers. (Chris Wilson)
* Restore full unit conversion precision.
--- drivers/gpu/drm/i915/i915_drv.h | 8 +++++++- drivers/gpu/drm/i915/i915_sysfs.c | 9 +++++++-- drivers/gpu/drm/i915/intel_pm.c | 27 +++++++++++++-------------- 3 files changed, 27 insertions(+), 17 deletions(-)
drivers/gpu/drm/i915/i915_drv.h +7 -1
@@ -4125,9 +4125,15 @@ void vlv_phy_reset_lanes(struct intel_encoder *encoder);int intel_gpu_freq (struct drm_i915_private *dev_priv,int val);int intel_freq_opcode (struct drm_i915_private *dev_priv,int val); -u64 intel_rc6_residency_us (struct drm_i915_private *dev_priv, +u64 intel_rc6_residency_ns (struct drm_i915_private *dev_priv,const i915_reg_t reg); +static inline u64 intel_rc6_residency_us (struct drm_i915_private *dev_priv, +const i915_reg_t reg) +{ +return DIV_ROUND_UP_ULL (intel_rc6_residency_ns (dev_priv, reg),1000 ); +} +#define I915_READ8 (reg) dev_priv->uncore.funcs.mmio_readb(dev_priv, (reg), true)#define I915_WRITE8 (reg, val) dev_priv->uncore.funcs.mmio_writeb(dev_priv, (reg), (val), true)
drivers/gpu/drm/i915/i915_sysfs.c +7 -2
@@ -42,8 +42,13 @@ static inline struct drm_i915_private *kdev_minor_to_i915(struct device *kdev)static u32 calc_residency (struct drm_i915_private *dev_priv,i915_reg_t reg) { -return DIV_ROUND_CLOSEST_ULL (intel_rc6_residency_us (dev_priv, reg), -1000 ); +u64 res; + +intel_runtime_pm_get (dev_priv); + res =intel_rc6_residency_us (dev_priv, reg); +intel_runtime_pm_put (dev_priv); + +return DIV_ROUND_CLOSEST_ULL (res,1000 ); } static ssize_t
drivers/gpu/drm/i915/intel_pm.c +13 -14
@@ -9342,34 +9342,33 @@ static u64 vlv_residency_raw(struct drm_i915_private *dev_priv,return lower | (u64 )upper <<8 ; } -u64 intel_rc6_residency_us (struct drm_i915_private *dev_priv, +u64 intel_rc6_residency_ns (struct drm_i915_private *dev_priv,const i915_reg_t reg) { -u64 time_hw, units, div; +u64 time_hw; +u32 mul, div;if (!intel_enable_rc6 ())return 0 ; -intel_runtime_pm_get (dev_priv); -/* On VLV and CHV, residency time is in CZ units rather than 1.28us */ if (IS_VALLEYVIEW (dev_priv) ||IS_CHERRYVIEW (dev_priv)) { - units =1000 ; + mul =1000000 ; div = dev_priv->czclk_freq; - time_hw =vlv_residency_raw (dev_priv, reg); - }else if (IS_GEN9_LP (dev_priv)) { - units =1000 ; - div =1200 ;/* 833.33ns */ - time_hw =I915_READ (reg); }else { - units =128000 ;/* 1.28us */ - div =100000 ; +/* 833.33ns units on Gen9LP, 1.28us elsewhere. */ +if (IS_GEN9_LP (dev_priv)) { + mul =10000 ; + div =12 ; + }else { + mul =1280 ; + div =1 ; + } time_hw =I915_READ (reg); } -intel_runtime_pm_put (dev_priv); -return DIV_ROUND_UP_ULL (time_hw * units, div); +return DIV_ROUND_UP_ULL (time_hw * mul, div); }
Signature · 6 lines
2.9.5 _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Tvrtko Ursulin
maintainerPATCH v4 2/8 drm/i915: Extract intel_get_cagf
In reply to Tvrtko UrsulinFrom: Tvrtko Ursulin <[email protected]>
Code to be shared between debugfs and the PMU implementation.
v2: Checkpatch cleanup.
v3: Also consolidate i915_sysfs.c/gt_act_freq_mhz_show.
--- drivers/gpu/drm/i915/i915_debugfs.c | 9 ++------- drivers/gpu/drm/i915/i915_drv.h | 2 ++ drivers/gpu/drm/i915/i915_sysfs.c | 11 +++-------- drivers/gpu/drm/i915/intel_pm.c | 14 ++++++++++++++ 4 files changed, 21 insertions(+), 15 deletions(-)
drivers/gpu/drm/i915/i915_debugfs.c +2 -7
@@ -1113,13 +1113,8 @@ static int i915_frequency_info(struct seq_file *m, void *unused) rpdownei =I915_READ (GEN6_RP_CUR_DOWN_EI ) &GEN6_CURIAVG_MASK ; rpcurdown =I915_READ (GEN6_RP_CUR_DOWN ) &GEN6_CURBSYTAVG_MASK ; rpprevdown =I915_READ (GEN6_RP_PREV_DOWN ) &GEN6_CURBSYTAVG_MASK ; -if (INTEL_GEN (dev_priv) >=9 ) - cagf = (rpstat &GEN9_CAGF_MASK ) >>GEN9_CAGF_SHIFT ; -else if (IS_HASWELL (dev_priv) ||IS_BROADWELL (dev_priv)) - cagf = (rpstat &HSW_CAGF_MASK ) >>HSW_CAGF_SHIFT ; -else - cagf = (rpstat &GEN6_CAGF_MASK ) >>GEN6_CAGF_SHIFT ; - cagf =intel_gpu_freq (dev_priv, cagf); + cagf =intel_gpu_freq (dev_priv, +intel_get_cagf (dev_priv, rpstat));intel_uncore_forcewake_put (dev_priv,FORCEWAKE_ALL );
drivers/gpu/drm/i915/i915_drv.h +2 -0
@@ -4134,6 +4134,8 @@ static inline u64 intel_rc6_residency_us(struct drm_i915_private *dev_priv,return DIV_ROUND_UP_ULL (intel_rc6_residency_ns (dev_priv, reg),1000 ); } +u32 intel_get_cagf (struct drm_i915_private *dev_priv,u32 rpstat1); +#define I915_READ8 (reg) dev_priv->uncore.funcs.mmio_readb(dev_priv, (reg), true)#define I915_WRITE8 (reg, val) dev_priv->uncore.funcs.mmio_writeb(dev_priv, (reg), (val), true)
drivers/gpu/drm/i915/i915_sysfs.c +3 -8
@@ -257,14 +257,9 @@ static ssize_t gt_act_freq_mhz_show(struct device *kdev, freq =vlv_punit_read (dev_priv,PUNIT_REG_GPU_FREQ_STS ); ret =intel_gpu_freq (dev_priv, (freq >>8 ) &0xff ); }else { -u32 rpstat =I915_READ (GEN6_RPSTAT1 ); -if (INTEL_GEN (dev_priv) >=9 ) - ret = (rpstat &GEN9_CAGF_MASK ) >>GEN9_CAGF_SHIFT ; -else if (IS_HASWELL (dev_priv) ||IS_BROADWELL (dev_priv)) - ret = (rpstat &HSW_CAGF_MASK ) >>HSW_CAGF_SHIFT ; -else - ret = (rpstat &GEN6_CAGF_MASK ) >>GEN6_CAGF_SHIFT ; - ret =intel_gpu_freq (dev_priv, ret); + ret =intel_gpu_freq (dev_priv, +intel_get_cagf (dev_priv, +I915_READ (GEN6_RPSTAT1 ))); }mutex_unlock (&dev_priv->rps.hw_lock);
drivers/gpu/drm/i915/intel_pm.c +14 -0
@@ -9372,3 +9372,17 @@ u64 intel_rc6_residency_ns(struct drm_i915_private *dev_priv,return DIV_ROUND_UP_ULL (time_hw * mul, div); } + +u32 intel_get_cagf (struct drm_i915_private *dev_priv,u32 rpstat) +{ +u32 cagf; + +if (INTEL_GEN (dev_priv) >=9 ) + cagf = (rpstat &GEN9_CAGF_MASK ) >>GEN9_CAGF_SHIFT ; +else if (IS_HASWELL (dev_priv) ||IS_BROADWELL (dev_priv)) + cagf = (rpstat &HSW_CAGF_MASK ) >>HSW_CAGF_SHIFT ; +else + cagf = (rpstat &GEN6_CAGF_MASK ) >>GEN6_CAGF_SHIFT ; + +return cagf; +}
Signature · 6 lines
2.9.5 _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Tvrtko Ursulin
maintainerPATCH v4 3/8 drm/i915/pmu: Expose a PMU interface for perf queries
In reply to Tvrtko UrsulinFrom: Tvrtko Ursulin <[email protected]>
From: Chris Wilson <[email protected]>
From: Tvrtko Ursulin <[email protected]>
From: Dmitry Rogozhkin <[email protected]>
The first goal is to be able to measure GPU (and invidual ring) busyness without having to poll registers from userspace. (Which not only incurs holding the forcewake lock indefinitely, perturbing the system, but also runs the risk of hanging the machine.) As an alternative we can use the perf event counter interface to sample the ring registers periodically and send those results to userspace.
To be able to do so, we need to export the two symbols from kernel/events/core.c to register and unregister a PMU device.
v1-v2 (Chris Wilson):
v2: Use a common timer for the ring sampling.
v3: (Tvrtko Ursulin)
* Decouple uAPI from i915 engine ids.
* Complete uAPI defines.
* Refactor some code to helpers for clarity.
* Skip sampling disabled engines.
* Expose counters in sysfs.
* Pass in fake regs to avoid null ptr deref in perf core.
* Convert to class/instance uAPI.
* Use shared driver code for rc6 residency, power and frequency.
v4: (Dmitry Rogozhkin)
* Register PMU with .task_ctx_nr=perf_invalid_context
* Expose cpumask for the PMU with the single CPU in the mask
* Properly support pmu->stop(): it should call pmu->read()
* Properly support pmu->del(): it should call stop(event, PERF_EF_UPDATE)
* Introduce refcounting of event subscriptions.
* Make pmu.busy_stats a refcounter to avoid busy stats going away with some deleted event.
* Expose cpumask for i915 PMU to avoid multiple events creation of the same type followed by counter aggregation by perf-stat.
* Track CPUs getting online/offline to migrate perf context. If (likely) cpumask will initially set CPU0, CONFIG_BOOTPARAM_HOTPLUG_CPU0 will be needed to see effect of CPU status tracking.
* End result is that only global events are supported and perf stat works correctly.
* Deny perf driver level sampling - it is prohibited for uncore PMU.
v5: (Tvrtko Ursulin)
* Don't hardcode number of engine samplers.
* Rewrite event ref-counting for correctness and simplicity.
* Store initial counter value when starting already enabled events to correctly report values to all listeners.
* Fix RC6 residency readout.
* Comments, GPL header.
v6:
* Add missing entry to v4 changelog.
* Fix accounting in CPU hotplug case by copying the approach from arch/x86/events/intel/cstate.c. (Dmitry Rogozhkin)
v7:
* Log failure message only on failure.
* Remove CPU hotplug notification state on unregister.
v8:
* Fix error unwind on failed registration.
* Checkpatch cleanup.
v9:
* Drop the energy metric, it is available via intel_rapl_perf. (Ville Syrjälä)
* Use HAS_RC6(p). (Chris Wilson)
* Handle unsupported non-engine events. (Dmitry Rogozhkin)
* Rebase for intel_rc6_residency_ns needing caller managed runtime pm.
* Drop HAS_RC6 checks from the read callback since creating those events will be rejected at init time already.
* Add counter units to sysfs so perf stat output is nicer.
* Cleanup the attribute tables for brevity and readability.
--- drivers/gpu/drm/i915/Makefile | 1 + drivers/gpu/drm/i915/i915_drv.c | 2 + drivers/gpu/drm/i915/i915_drv.h | 78 ++++ drivers/gpu/drm/i915/i915_pmu.c | 705 ++++++++++++++++++++++++++++++++ drivers/gpu/drm/i915/i915_reg.h | 3 + drivers/gpu/drm/i915/intel_engine_cs.c | 10 + drivers/gpu/drm/i915/intel_ringbuffer.c | 25 ++ drivers/gpu/drm/i915/intel_ringbuffer.h | 25 ++ include/uapi/drm/i915_drm.h | 57 +++ 9 files changed, 906 insertions(+) create mode 100644 drivers/gpu/drm/i915/i915_pmu.c
drivers/gpu/drm/i915/Makefile +1 -0
@@ -26,6 +26,7 @@ i915-y := i915_drv.o \ i915-$(CONFIG_COMPAT) += i915_ioc32.o i915-$(CONFIG_DEBUG_FS) += i915_debugfs.o intel_pipe_crc.o +i915-$(CONFIG_PERF_EVENTS) += i915_pmu.o # GEM code i915-y += i915_cmd_parser.o \
drivers/gpu/drm/i915/i915_drv.c +2 -0
@@ -1196,6 +1196,7 @@ static void i915_driver_register(struct drm_i915_private *dev_priv)struct drm_device *dev = &dev_priv->drm;i915_gem_shrinker_init (dev_priv); +i915_pmu_register (dev_priv);/* * Notify a valid surface after modesetting,
@@ -1250,6 +1251,7 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv)intel_opregion_unregister (dev_priv);i915_perf_unregister (dev_priv); +i915_pmu_unregister (dev_priv);i915_teardown_sysfs (dev_priv);i915_guc_log_unregister (dev_priv);
drivers/gpu/drm/i915/i915_drv.h +78 -0
108 lines not on this page · raw message
drivers/gpu/drm/i915/i915_pmu.c new file +705 -0
705 lines not on this page · raw message
drivers/gpu/drm/i915/i915_reg.h +3 -0
@@ -186,6 +186,9 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)#define VIDEO_ENHANCEMENT_CLASS 2#define COPY_ENGINE_CLASS 3#define OTHER_CLASS 4 +#define MAX_ENGINE_CLASS 4 + +#define MAX_ENGINE_INSTANCE 1/* PCI config space */
drivers/gpu/drm/i915/intel_engine_cs.c +10 -0
@@ -198,6 +198,15 @@ intel_engine_setup(struct drm_i915_private *dev_priv,GEM_BUG_ON (info->class >=ARRAY_SIZE (intel_engine_classes)); class_info = &intel_engine_classes[info->class]; +if (GEM_WARN_ON (info->class >MAX_ENGINE_CLASS )) +return -EINVAL ; + +if (GEM_WARN_ON (info->instance >MAX_ENGINE_INSTANCE )) +return -EINVAL ; + +if (GEM_WARN_ON (dev_priv->engine_class[info->class][info->instance])) +return -EINVAL ; +GEM_BUG_ON (dev_priv->engine[id]); engine =kzalloc (sizeof (*engine),GFP_KERNEL );if (!engine)
@@ -225,6 +234,7 @@ intel_engine_setup(struct drm_i915_private *dev_priv,ATOMIC_INIT_NOTIFIER_HEAD (&engine->context_status_notifier); + dev_priv->engine_class[info->class][info->instance] = engine; dev_priv->engine[id] = engine;return 0 ; }
drivers/gpu/drm/i915/intel_ringbuffer.c +25 -0
@@ -2163,3 +2163,28 @@ int intel_init_vebox_ring_buffer(struct intel_engine_cs *engine)return intel_init_ring_buffer (engine); } + +static u8 user_class_map[I915_ENGINE_CLASS_MAX ] = { + [I915_ENGINE_CLASS_OTHER ] =OTHER_CLASS , + [I915_ENGINE_CLASS_RENDER ] =RENDER_CLASS , + [I915_ENGINE_CLASS_COPY ] =COPY_ENGINE_CLASS , + [I915_ENGINE_CLASS_VIDEO ] =VIDEO_DECODE_CLASS , + [I915_ENGINE_CLASS_VIDEO_ENHANCE ] =VIDEO_ENHANCEMENT_CLASS , +}; + +struct intel_engine_cs * +intel_engine_lookup_user (struct drm_i915_private *i915,u8 class,u8 instance) +{ +if (class >=ARRAY_SIZE (user_class_map)) +return NULL ; + + class = user_class_map[class]; + +if (WARN_ON_ONCE (class >MAX_ENGINE_CLASS )) +return NULL ; + +if (instance >MAX_ENGINE_INSTANCE ) +return NULL ; + +return i915->engine_class[class][instance]; +}
drivers/gpu/drm/i915/intel_ringbuffer.h +25 -0
@@ -245,6 +245,28 @@ struct intel_engine_cs { I915_SELFTEST_DECLARE(bool mock : 1); } breadcrumbs; +struct { +/** +* @enable: Bitmask of enable sample events on this engine. +* +* Bits correspond to sample event types, for instance +* I915_SAMPLE_QUEUED is bit 0 etc. +*/ +u32 enable; +/** +* @enable_count: Reference count for the enabled samplers. +* +* Index number corresponds to the bit number from @enable. +*/ +unsigned int enable_count[I915_PMU_SAMPLE_BITS ]; +/** +* @sample: Counter value for sampling events. +* +* Our internal timer stores the current counter in this field. +*/ +u64 sample[I915_ENGINE_SAMPLE_MAX ]; + } pmu; +/* * A pool of objects to use as shadow copies of client batch buffers * when the command parser is enabled. Prevents the client from
@@ -743,4 +765,7 @@ void intel_engines_reset_default_submission(struct drm_i915_private *i915);bool intel_engine_can_store_dword (struct intel_engine_cs *engine); +struct intel_engine_cs * +intel_engine_lookup_user (struct drm_i915_private *i915,u8 class,u8 instance); +#endif /* _INTEL_RINGBUFFER_H_ */
include/uapi/drm/i915_drm.h +57 -0
63 lines not on this page · raw message
Signature · 6 lines
2.9.5 _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Tvrtko Ursulin
maintainerPATCH v10 3/8 drm/i915/pmu: Expose a PMU interface for perf queries
From: Tvrtko Ursulin <[email protected]>
From: Chris Wilson <[email protected]>
From: Tvrtko Ursulin <[email protected]>
From: Dmitry Rogozhkin <[email protected]>
The first goal is to be able to measure GPU (and invidual ring) busyness without having to poll registers from userspace. (Which not only incurs holding the forcewake lock indefinitely, perturbing the system, but also runs the risk of hanging the machine.) As an alternative we can use the perf event counter interface to sample the ring registers periodically and send those results to userspace.
To be able to do so, we need to export the two symbols from kernel/events/core.c to register and unregister a PMU device.
v1-v2 (Chris Wilson):
v2: Use a common timer for the ring sampling.
v3: (Tvrtko Ursulin)
* Decouple uAPI from i915 engine ids.
* Complete uAPI defines.
* Refactor some code to helpers for clarity.
* Skip sampling disabled engines.
* Expose counters in sysfs.
* Pass in fake regs to avoid null ptr deref in perf core.
* Convert to class/instance uAPI.
* Use shared driver code for rc6 residency, power and frequency.
v4: (Dmitry Rogozhkin)
* Register PMU with .task_ctx_nr=perf_invalid_context
* Expose cpumask for the PMU with the single CPU in the mask
* Properly support pmu->stop(): it should call pmu->read()
* Properly support pmu->del(): it should call stop(event, PERF_EF_UPDATE)
* Introduce refcounting of event subscriptions.
* Make pmu.busy_stats a refcounter to avoid busy stats going away with some deleted event.
* Expose cpumask for i915 PMU to avoid multiple events creation of the same type followed by counter aggregation by perf-stat.
* Track CPUs getting online/offline to migrate perf context. If (likely) cpumask will initially set CPU0, CONFIG_BOOTPARAM_HOTPLUG_CPU0 will be needed to see effect of CPU status tracking.
* End result is that only global events are supported and perf stat works correctly.
* Deny perf driver level sampling - it is prohibited for uncore PMU.
v5: (Tvrtko Ursulin)
* Don't hardcode number of engine samplers.
* Rewrite event ref-counting for correctness and simplicity.
* Store initial counter value when starting already enabled events to correctly report values to all listeners.
* Fix RC6 residency readout.
* Comments, GPL header.
v6:
* Add missing entry to v4 changelog.
* Fix accounting in CPU hotplug case by copying the approach from arch/x86/events/intel/cstate.c. (Dmitry Rogozhkin)
v7:
* Log failure message only on failure.
* Remove CPU hotplug notification state on unregister.
v8:
* Fix error unwind on failed registration.
* Checkpatch cleanup.
v9:
* Drop the energy metric, it is available via intel_rapl_perf. (Ville Syrjälä)
* Use HAS_RC6(p). (Chris Wilson)
* Handle unsupported non-engine events. (Dmitry Rogozhkin)
* Rebase for intel_rc6_residency_ns needing caller managed runtime pm.
* Drop HAS_RC6 checks from the read callback since creating those events will be rejected at init time already.
* Add counter units to sysfs so perf stat output is nicer.
* Cleanup the attribute tables for brevity and readability.
v10:
* Fixed queued accounting.
--- drivers/gpu/drm/i915/Makefile | 1 + drivers/gpu/drm/i915/i915_drv.c | 2 + drivers/gpu/drm/i915/i915_drv.h | 78 ++++ drivers/gpu/drm/i915/i915_pmu.c | 707 ++++++++++++++++++++++++++++++++ drivers/gpu/drm/i915/i915_reg.h | 3 + drivers/gpu/drm/i915/intel_engine_cs.c | 10 + drivers/gpu/drm/i915/intel_ringbuffer.c | 25 ++ drivers/gpu/drm/i915/intel_ringbuffer.h | 25 ++ include/uapi/drm/i915_drm.h | 57 +++ 9 files changed, 908 insertions(+) create mode 100644 drivers/gpu/drm/i915/i915_pmu.c
drivers/gpu/drm/i915/Makefile +1 -0
@@ -26,6 +26,7 @@ i915-y := i915_drv.o \ i915-$(CONFIG_COMPAT) += i915_ioc32.o i915-$(CONFIG_DEBUG_FS) += i915_debugfs.o intel_pipe_crc.o +i915-$(CONFIG_PERF_EVENTS) += i915_pmu.o # GEM code i915-y += i915_cmd_parser.o \
drivers/gpu/drm/i915/i915_drv.c +2 -0
@@ -1196,6 +1196,7 @@ static void i915_driver_register(struct drm_i915_private *dev_priv)struct drm_device *dev = &dev_priv->drm;i915_gem_shrinker_init (dev_priv); +i915_pmu_register (dev_priv);/* * Notify a valid surface after modesetting,
@@ -1250,6 +1251,7 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv)intel_opregion_unregister (dev_priv);i915_perf_unregister (dev_priv); +i915_pmu_unregister (dev_priv);i915_teardown_sysfs (dev_priv);i915_guc_log_unregister (dev_priv);
drivers/gpu/drm/i915/i915_drv.h +78 -0
108 lines not on this page · raw message
drivers/gpu/drm/i915/i915_pmu.c new file +707 -0
707 lines not on this page · raw message
drivers/gpu/drm/i915/i915_reg.h +3 -0
@@ -186,6 +186,9 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)#define VIDEO_ENHANCEMENT_CLASS 2#define COPY_ENGINE_CLASS 3#define OTHER_CLASS 4 +#define MAX_ENGINE_CLASS 4 + +#define MAX_ENGINE_INSTANCE 1/* PCI config space */
drivers/gpu/drm/i915/intel_engine_cs.c +10 -0
@@ -198,6 +198,15 @@ intel_engine_setup(struct drm_i915_private *dev_priv,GEM_BUG_ON (info->class >=ARRAY_SIZE (intel_engine_classes)); class_info = &intel_engine_classes[info->class]; +if (GEM_WARN_ON (info->class >MAX_ENGINE_CLASS )) +return -EINVAL ; + +if (GEM_WARN_ON (info->instance >MAX_ENGINE_INSTANCE )) +return -EINVAL ; + +if (GEM_WARN_ON (dev_priv->engine_class[info->class][info->instance])) +return -EINVAL ; +GEM_BUG_ON (dev_priv->engine[id]); engine =kzalloc (sizeof (*engine),GFP_KERNEL );if (!engine)
@@ -225,6 +234,7 @@ intel_engine_setup(struct drm_i915_private *dev_priv,ATOMIC_INIT_NOTIFIER_HEAD (&engine->context_status_notifier); + dev_priv->engine_class[info->class][info->instance] = engine; dev_priv->engine[id] = engine;return 0 ; }
drivers/gpu/drm/i915/intel_ringbuffer.c +25 -0
@@ -2183,3 +2183,28 @@ int intel_init_vebox_ring_buffer(struct intel_engine_cs *engine)return intel_init_ring_buffer (engine); } + +static u8 user_class_map[I915_ENGINE_CLASS_MAX ] = { + [I915_ENGINE_CLASS_OTHER ] =OTHER_CLASS , + [I915_ENGINE_CLASS_RENDER ] =RENDER_CLASS , + [I915_ENGINE_CLASS_COPY ] =COPY_ENGINE_CLASS , + [I915_ENGINE_CLASS_VIDEO ] =VIDEO_DECODE_CLASS , + [I915_ENGINE_CLASS_VIDEO_ENHANCE ] =VIDEO_ENHANCEMENT_CLASS , +}; + +struct intel_engine_cs * +intel_engine_lookup_user (struct drm_i915_private *i915,u8 class,u8 instance) +{ +if (class >=ARRAY_SIZE (user_class_map)) +return NULL ; + + class = user_class_map[class]; + +if (WARN_ON_ONCE (class >MAX_ENGINE_CLASS )) +return NULL ; + +if (instance >MAX_ENGINE_INSTANCE ) +return NULL ; + +return i915->engine_class[class][instance]; +}
drivers/gpu/drm/i915/intel_ringbuffer.h +25 -0
@@ -245,6 +245,28 @@ struct intel_engine_cs { I915_SELFTEST_DECLARE(bool mock : 1); } breadcrumbs; +struct { +/** +* @enable: Bitmask of enable sample events on this engine. +* +* Bits correspond to sample event types, for instance +* I915_SAMPLE_QUEUED is bit 0 etc. +*/ +u32 enable; +/** +* @enable_count: Reference count for the enabled samplers. +* +* Index number corresponds to the bit number from @enable. +*/ +unsigned int enable_count[I915_PMU_SAMPLE_BITS ]; +/** +* @sample: Counter value for sampling events. +* +* Our internal timer stores the current counter in this field. +*/ +u64 sample[I915_ENGINE_SAMPLE_MAX ]; + } pmu; +/* * A pool of objects to use as shadow copies of client batch buffers * when the command parser is enabled. Prevents the client from
@@ -751,4 +773,7 @@ void intel_engines_reset_default_submission(struct drm_i915_private *i915);bool intel_engine_can_store_dword (struct intel_engine_cs *engine); +struct intel_engine_cs * +intel_engine_lookup_user (struct drm_i915_private *i915,u8 class,u8 instance); +#endif /* _INTEL_RINGBUFFER_H_ */
include/uapi/drm/i915_drm.h +57 -0
63 lines not on this page · raw message
Signature · 6 lines
2.9.5 _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Tvrtko Ursulin
maintainerPATCH v4 4/8 drm/i915/pmu: Suspend sampling when GPU is idle
In reply to Tvrtko UrsulinFrom: Tvrtko Ursulin <[email protected]>
If only a subset of events is enabled we can afford to suspend the sampling timer when the GPU is idle and so save some cycles and power.
v2: Rebase and limit timer even more.
v3: Rebase.
v4: Rebase.
v5: Skip action if perf PMU failed to register.
v6: Checkpatch cleanup.
v7:
* Add a common helper to start the timer if needed. (Chris Wilson)
* Add comment explaining bitwise logic in pmu_needs_timer.
--- drivers/gpu/drm/i915/i915_drv.h | 8 +++ drivers/gpu/drm/i915/i915_gem.c | 1 + drivers/gpu/drm/i915/i915_gem_request.c | 1 + drivers/gpu/drm/i915/i915_pmu.c | 88 +++++++++++++++++++++++++++++---- 4 files changed, 88 insertions(+), 10 deletions(-)
drivers/gpu/drm/i915/i915_drv.h +8 -0
@@ -2252,6 +2252,10 @@ struct i915_pmu {*/ unsigned int enable_count[I915_PMU_MASK_BITS ];/** +* @timer_enabled: Should the internal sampling timer be running. +*/ +bool timer_enabled; +/** * @sample: Current counter value for i915 events which need sampling. * * These counters are updated from the i915 PMU sampling timer.
@@ -4002,9 +4006,13 @@ extern void i915_perf_unregister(struct drm_i915_private *dev_priv);#ifdef CONFIG_PERF_EVENTS void i915_pmu_register (struct drm_i915_private *i915);void i915_pmu_unregister (struct drm_i915_private *i915); +void i915_pmu_gt_idle (struct drm_i915_private *i915); +void i915_pmu_gt_active (struct drm_i915_private *i915);#else static inline void i915_pmu_register (struct drm_i915_private *i915) {}static inline void i915_pmu_unregister (struct drm_i915_private *i915) {} +static inline void i915_pmu_gt_idle (struct drm_i915_private *i915) {} +static inline void i915_pmu_gt_active (struct drm_i915_private *i915) {}#endif /* i915_suspend.c */
drivers/gpu/drm/i915/i915_gem.c +1 -0
@@ -3227,6 +3227,7 @@ i915_gem_idle_work_handler(struct work_struct *work)intel_engines_mark_idle (dev_priv);i915_gem_timelines_mark_idle (dev_priv); +i915_pmu_gt_idle (dev_priv);GEM_BUG_ON (!dev_priv->gt.awake); dev_priv->gt.awake = false;
drivers/gpu/drm/i915/i915_gem_request.c +1 -0
@@ -258,6 +258,7 @@ static void mark_busy(struct drm_i915_private *i915)i915_update_gfx_val (i915);if (INTEL_GEN (i915) >=6 )gen6_rps_busy (i915); +i915_pmu_gt_active (i915); queue_delayed_work(i915->wq, &i915->gt.retire_work,
drivers/gpu/drm/i915/i915_pmu.c +78 -10
119 lines not on this page · raw message
Signature · 6 lines
2.9.5 _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Tvrtko Ursulin
maintainerPATCH v4 5/8 drm/i915: Wrap context schedule notification
In reply to Tvrtko UrsulinFrom: Tvrtko Ursulin <[email protected]>
No functional change just something which will be handy in the following patch.
--- drivers/gpu/drm/i915/intel_lrc.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
drivers/gpu/drm/i915/intel_lrc.c +14 -3
@@ -301,6 +301,18 @@ execlists_context_status_change(struct drm_i915_gem_request *rq, status, rq); } +static inline void +execlists_context_schedule_in (struct drm_i915_gem_request *rq) +{ +execlists_context_status_change (rq,INTEL_CONTEXT_SCHEDULE_IN ); +} + +static inline void +execlists_context_schedule_out (struct drm_i915_gem_request *rq) +{ +execlists_context_status_change (rq,INTEL_CONTEXT_SCHEDULE_OUT ); +} +static void execlists_update_context_pdps (struct i915_hw_ppgtt *ppgtt,u32 *reg_state) {
@@ -346,7 +358,7 @@ static void execlists_submit_ports(struct intel_engine_cs *engine)if (rq) {GEM_BUG_ON (count > !n);if (!count++) -execlists_context_status_change (rq,INTEL_CONTEXT_SCHEDULE_IN ); +execlists_context_schedule_in (rq);port_set (&port[n],port_pack (rq, count)); desc =execlists_update_context (rq);GEM_DEBUG_EXEC (port[n].context_id =upper_32_bits (desc));
@@ -612,8 +624,7 @@ static void intel_lrc_irq_handler(unsigned long data)if (--count ==0 ) {GEM_BUG_ON (status &GEN8_CTX_STATUS_PREEMPTED );GEM_BUG_ON (!i915_gem_request_completed (rq)); -execlists_context_status_change (rq,INTEL_CONTEXT_SCHEDULE_OUT ); - +execlists_context_schedule_out (rq);trace_i915_gem_request_out (rq);i915_gem_request_put (rq);
Signature · 6 lines
2.9.5 _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Tvrtko Ursulin
maintainerPATCH v4 6/8 drm/i915: Engine busy time tracking
In reply to Tvrtko UrsulinFrom: Tvrtko Ursulin <[email protected]>
Track total time requests have been executing on the hardware.
We add new kernel API to allow software tracking of time GPU engines are spending executing requests.
Both per-engine and global API is added with the latter also being exported for use by external users.
v2:
* Squashed with the internal API.
* Dropped static key.
* Made per-engine.
* Store time in monotonic ktime.
v3: Moved stats clearing to disable.
v4:
* Comments.
* Don't export the API just yet.
v5: Whitespace cleanup.
v6:
* Rename ref to active.
* Drop engine aggregate stats for now.
* Account initial busy period after enabling stats.
--- drivers/gpu/drm/i915/intel_engine_cs.c | 84 ++++++++++++++++++++++++++++++ drivers/gpu/drm/i915/intel_lrc.c | 2 + drivers/gpu/drm/i915/intel_ringbuffer.h | 92 +++++++++++++++++++++++++++++++++ 3 files changed, 178 insertions(+)
drivers/gpu/drm/i915/intel_engine_cs.c +84 -0
@@ -232,6 +232,8 @@ intel_engine_setup(struct drm_i915_private *dev_priv,/* Nothing to do here, execute in order of dependencies */ engine->schedule =NULL ; +spin_lock_init (&engine->stats.lock); +ATOMIC_INIT_NOTIFIER_HEAD (&engine->context_status_notifier); dev_priv->engine_class[info->class][info->instance] = engine;
@@ -1556,6 +1558,88 @@ bool intel_engine_can_store_dword(struct intel_engine_cs *engine) } } +/** +* intel_enable_engine_stats() - Enable engine busy tracking on engine +* @engine: engine to enable stats collection +* +* Start collecting the engine busyness data for @engine. +* +* Returns 0 on success or a negative error code. +*/ +int intel_enable_engine_stats (struct intel_engine_cs *engine) +{ +unsigned long flags; + +if (!i915.enable_execlists) +return -ENODEV ; + +spin_lock_irqsave (&engine->stats.lock, flags); +if (engine->stats.enabled == ~0 ) + goto busy; +if (engine->stats.enabled++ ==0 ) + engine->stats.enabled_at =ktime_get (); +spin_unlock_irqrestore (&engine->stats.lock, flags); + +return 0 ; + +busy: +spin_unlock_irqrestore (&engine->stats.lock, flags); + +return -EBUSY ; +} + +/** +* intel_disable_engine_stats() - Disable engine busy tracking on engine +* @engine: engine to disable stats collection +* +* Stops collecting the engine busyness data for @engine. +*/ +void intel_disable_engine_stats (struct intel_engine_cs *engine) +{ +unsigned long flags; + +if (!i915.enable_execlists) +return ; + +spin_lock_irqsave (&engine->stats.lock, flags); +WARN_ON_ONCE (engine->stats.enabled ==0 ); +if (--engine->stats.enabled ==0 ) { + engine->stats.enabled_at =0 ; + engine->stats.active =0 ; + engine->stats.start =0 ; + engine->stats.total =0 ; + } +spin_unlock_irqrestore (&engine->stats.lock, flags); +} + +/** +* intel_engine_get_busy_time() - Return current accumulated engine busyness +* @engine: engine to report on +* +* Returns accumulated time @engine was busy since engine stats were enabled. +*/ +ktime_t intel_engine_get_busy_time (struct intel_engine_cs *engine) +{ +ktime_t total; +unsigned long flags; + +spin_lock_irqsave (&engine->stats.lock, flags); + + total = engine->stats.total; + +/* +* If the engine is executing something at the moment +* add it to the total. +*/ +if (engine->stats.active) + total =ktime_add (total, +ktime_sub (ktime_get (), engine->stats.start)); + +spin_unlock_irqrestore (&engine->stats.lock, flags); + +return total; +} +#if IS_ENABLED (CONFIG_DRM_I915_SELFTEST )#include "selftests/mock_engine.c" #endif
drivers/gpu/drm/i915/intel_lrc.c +2 -0
@@ -304,12 +304,14 @@ execlists_context_status_change(struct drm_i915_gem_request *rq,static inline void execlists_context_schedule_in (struct drm_i915_gem_request *rq) { +intel_engine_context_in (rq->engine);execlists_context_status_change (rq,INTEL_CONTEXT_SCHEDULE_IN ); }static inline void execlists_context_schedule_out (struct drm_i915_gem_request *rq) { +intel_engine_context_out (rq->engine);execlists_context_status_change (rq,INTEL_CONTEXT_SCHEDULE_OUT ); }
drivers/gpu/drm/i915/intel_ringbuffer.h +92 -0
102 lines not on this page · raw message
Signature · 6 lines
2.9.5 _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Tvrtko Ursulin
maintainerPATCH v4 7/8 drm/i915/pmu: Wire up engine busy stats to PMU
In reply to Tvrtko UrsulinFrom: Tvrtko Ursulin <[email protected]>
We can use engine busy stats instead of the MMIO sampling timer for better efficiency.
As minimum this saves period * num_engines / sec mmio reads, and in a better case, when only engine busy samplers are active, it enables us to not kick off the sampling timer at all.
v2: Rebase.
v3:
* Rebase, comments.
* Leave engine busyness controls out of workers.
v4: Checkpatch cleanup.
v5: Added comment to pmu_needs_timer change.
--- drivers/gpu/drm/i915/i915_pmu.c | 40 ++++++++++++++++++++++++++++++--- drivers/gpu/drm/i915/intel_ringbuffer.h | 5 +++++ 2 files changed, 42 insertions(+), 3 deletions(-)
drivers/gpu/drm/i915/i915_pmu.c +37 -3
@@ -90,6 +90,11 @@ static unsigned int event_enabled_bit(struct perf_event *event)return config_enabled_bit (event->attr.config); } +static bool supports_busy_stats (void ) +{ +return i915.enable_execlists; +} +static bool pmu_needs_timer (struct drm_i915_private *i915,bool gpu_active) {u64 enable;
@@ -115,6 +120,12 @@ static bool pmu_needs_timer(struct drm_i915_private *i915, bool gpu_active)*/ if (!gpu_active) enable &= ~ENGINE_SAMPLE_MASK ; +/** +* Also there is software busyness tracking available we do not +* need the timer for I915_SAMPLE_BUSY counter. +*/ +else if (supports_busy_stats ()) + enable &= ~BIT (I915_SAMPLE_BUSY );/** * If some bits remain it means we need the sampling timer running.
@@ -192,7 +203,8 @@ static void engines_sample(struct drm_i915_private *dev_priv)if (enable &BIT (I915_SAMPLE_QUEUED )) engine->pmu.sample[I915_SAMPLE_QUEUED ] +=PERIOD ; -if (enable &BIT (I915_SAMPLE_BUSY )) { +if ((enable &BIT (I915_SAMPLE_BUSY )) && + !engine->pmu.busy_stats) {u32 val; fw =grab_forcewake (dev_priv, fw);
@@ -385,6 +397,9 @@ static u64 __i915_pmu_event_read(struct perf_event *event)if (WARN_ON_ONCE (!engine)) {/* Do nothing */ + }else if (sample ==I915_SAMPLE_BUSY && + engine->pmu.busy_stats) { + val =ktime_to_ns (intel_engine_get_busy_time (engine)); }else { val = engine->pmu.sample[sample]; }
@@ -438,6 +453,12 @@ static void i915_pmu_event_read(struct perf_event *event)local64_add (new - prev, &event->count); } +static bool engine_needs_busy_stats (struct intel_engine_cs *engine) +{ +return supports_busy_stats () && + (engine->pmu.enable &BIT (I915_SAMPLE_BUSY )); +} +static void i915_pmu_enable (struct perf_event *event) { struct drm_i915_private *i915 =
@@ -477,7 +498,14 @@ static void i915_pmu_enable(struct perf_event *event)GEM_BUG_ON (sample >=I915_PMU_SAMPLE_BITS );GEM_BUG_ON (engine->pmu.enable_count[sample] == ~0 ); - engine->pmu.enable_count[sample]++; +if (engine->pmu.enable_count[sample]++ ==0 ) { +if (engine_needs_busy_stats (engine) && + !engine->pmu.busy_stats) { + engine->pmu.busy_stats = +intel_enable_engine_stats (engine) ==0 ; +WARN_ON_ONCE (!engine->pmu.busy_stats); + } + } }/*
@@ -513,8 +541,14 @@ static void i915_pmu_disable(struct perf_event *event)* Decrement the reference count and clear the enabled * bitmask when the last listener on an event goes away. */ -if (--engine->pmu.enable_count[sample] ==0 ) +if (--engine->pmu.enable_count[sample] ==0 ) { engine->pmu.enable &= ~BIT (sample); +if (!engine_needs_busy_stats (engine) && + engine->pmu.busy_stats) { + engine->pmu.busy_stats = false; +intel_disable_engine_stats (engine); + } + } }GEM_BUG_ON (bit >=I915_PMU_MASK_BITS );
drivers/gpu/drm/i915/intel_ringbuffer.h +5 -0
@@ -265,6 +265,11 @@ struct intel_engine_cs {* Our internal timer stores the current counter in this field. */ u64 sample[I915_ENGINE_SAMPLE_MAX ]; +/** +* @busy_stats: Has enablement of engine stats tracking been +* requested. +*/ +bool busy_stats; } pmu;/*
Signature · 6 lines
2.9.5 _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Re: [PATCH 7/8] drm/i915/pmu: Wire up engine busy stats to PMU
Quoting Tvrtko Ursulin (2017-09-18 12:38:13)
Quoted 17 lines
drivers/gpu/drm/i915/i915_pmu.c +5
-0@@ -90,6 +90,11 @@ static unsigned int event_enabled_bit(struct perf_event *event)return config_enabled_bit (event->attr.config); } +static bool supports_busy_stats (void ) +{ +return i915.enable_execlists; +} +static bool pmu_needs_timer (struct drm_i915_private *i915,bool gpu_active) {u64 enable;
drivers/gpu/drm/i915/i915_pmu.c static bool pmu_needs_timer(struct drm_i915_private *i915, bool gpu_active) · line 123
Quoted 4 lines
drivers/gpu/drm/i915/i915_pmu.c +1
-0@@ -115,6 +120,12 @@ static bool pmu_needs_timer(struct drm_i915_private *i915, bool gpu_active)*/ if (!gpu_active) enable &= ~ENGINE_SAMPLE_MASK ; +/**
/** kerneldoc?
-Chris
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Re: [PATCH 7/8] drm/i915/pmu: Wire up engine busy stats to PMU
Quoted 9 lines · Chris Wilson
Quoting Tvrtko Ursulin (2017-09-18 12:38:13)
Quoted 8 lines
drivers/gpu/drm/i915/i915_pmu.c +0
-0@@ -90,6 +90,11 @@ static unsigned int event_enabled_bit(struct perf_event *event)return config_enabled_bit (event->attr.config); }
Quoted 15 lines
drivers/gpu/drm/i915/i915_pmu.c static bool pmu_needs_timer(struct drm_i915_private *i915, bool gpu_active) · line 123
Quoted 13 lines
drivers/gpu/drm/i915/i915_pmu.c +6
-0+static bool supports_busy_stats (void ) +{ +return i915.enable_execlists; +} +static bool pmu_needs_timer (struct drm_i915_private *i915,bool gpu_active) {u64 enable;@@ -115,6 +120,12 @@ static bool pmu_needs_timer(struct drm_i915_private *i915, bool gpu_active)*/ if (!gpu_active) enable &= ~ENGINE_SAMPLE_MASK ; +/** /** kerneldoc?
I've managed to sprinkle quite a few of those around while added comments. Finger memory, what can I say.. Another thing on the todo list.
Regards,
Tvrtko
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Tvrtko Ursulin
maintainerPATCH v4 8/8 drm/i915: Gate engine stats collection with a static key
In reply to Tvrtko UrsulinFrom: Tvrtko Ursulin <[email protected]>
This reduces the cost of the software engine busyness tracking to a single no-op instruction when there are no listeners.
v2: Rebase and some comments.
v3: Rebase.
v4: Checkpatch fixes.
v5: Rebase.
v6: Use system_long_wq to avoid being blocked by struct_mutex
users.
--- drivers/gpu/drm/i915/i915_pmu.c | 54 +++++++++++++++-- drivers/gpu/drm/i915/intel_engine_cs.c | 17 ++++++ drivers/gpu/drm/i915/intel_ringbuffer.h | 101 ++++++++++++++++++++------------ 3 files changed, 130 insertions(+), 42 deletions(-)
drivers/gpu/drm/i915/i915_pmu.c +50 -4
@@ -499,11 +499,17 @@ static void i915_pmu_enable(struct perf_event *event)GEM_BUG_ON (sample >=I915_PMU_SAMPLE_BITS );GEM_BUG_ON (engine->pmu.enable_count[sample] == ~0 );if (engine->pmu.enable_count[sample]++ ==0 ) { +/* +* Enable engine busy stats tracking if needed or +* alternatively cancel the scheduled disabling of the +* same. +*/ if (engine_needs_busy_stats (engine) && !engine->pmu.busy_stats) { - engine->pmu.busy_stats = -intel_enable_engine_stats (engine) ==0 ; -WARN_ON_ONCE (!engine->pmu.busy_stats); + engine->pmu.busy_stats = true; +if (!cancel_delayed_work (&engine->pmu.disable_busy_stats)) +queue_work (system_long_wq, + &engine->pmu.enable_busy_stats); } } }
@@ -546,7 +552,15 @@ static void i915_pmu_disable(struct perf_event *event)if (!engine_needs_busy_stats (engine) && engine->pmu.busy_stats) { engine->pmu.busy_stats = false; -intel_disable_engine_stats (engine); +/* +* We request a delayed disable to handle the +* rapid on/off cycles on events which can +* happen when tools like perf stat start in a +* nicer way. +*/ +queue_delayed_work (system_long_wq, + &engine->pmu.disable_busy_stats, +round_jiffies_up_relative (HZ )); } } }
@@ -737,9 +751,27 @@ static int i915_pmu_cpu_offline(unsigned int cpu, struct hlist_node *node)return 0 ; } +static void __enable_busy_stats (struct work_struct *work) +{ +struct intel_engine_cs *engine = +container_of (work,typeof (*engine), pmu.enable_busy_stats); + +WARN_ON_ONCE (intel_enable_engine_stats (engine)); +} + +static void __disable_busy_stats (struct work_struct *work) +{ +struct intel_engine_cs *engine = +container_of (work,typeof (*engine), pmu.disable_busy_stats.work); + +intel_disable_engine_stats (engine); +} +void i915_pmu_register (struct drm_i915_private *i915) {int ret; +struct intel_engine_cs *engine; +enum intel_engine_id id;if (INTEL_GEN (i915) <=2 ) {DRM_INFO ("PMU not supported for this GPU." );
@@ -773,6 +805,12 @@ void i915_pmu_register(struct drm_i915_private *i915) i915->pmu.timer.function = i915_sample; i915->pmu.enable =0 ; +for_each_engine (engine, i915, id) { +INIT_WORK (&engine->pmu.enable_busy_stats, __enable_busy_stats); +INIT_DELAYED_WORK (&engine->pmu.disable_busy_stats, + __disable_busy_stats); + } + ret =perf_pmu_register (&i915->pmu.base,"i915" ,-1 );if (ret ==0 )return ;
@@ -791,6 +829,9 @@ void i915_pmu_register(struct drm_i915_private *i915)void i915_pmu_unregister (struct drm_i915_private *i915) { +struct intel_engine_cs *engine; +enum intel_engine_id id; +if (!i915->pmu.base.event_init)return ;
@@ -802,6 +843,11 @@ void i915_pmu_unregister(struct drm_i915_private *i915)hrtimer_cancel (&i915->pmu.timer); +for_each_engine (engine, i915, id) { +flush_work (&engine->pmu.enable_busy_stats); +flush_delayed_work (&engine->pmu.disable_busy_stats); + } +perf_pmu_unregister (&i915->pmu.base); i915->pmu.base.event_init =NULL ; }
drivers/gpu/drm/i915/intel_engine_cs.c +17 -0
@@ -21,6 +21,7 @@* IN THE SOFTWARE. * */ +#include <linux/static_key.h> #include "i915_drv.h" #include "intel_ringbuffer.h"
@@ -1558,6 +1559,10 @@ bool intel_engine_can_store_dword(struct intel_engine_cs *engine) } } +DEFINE_STATIC_KEY_FALSE (i915_engine_stats_key); +static DEFINE_MUTEX (i915_engine_stats_mutex); +static int i915_engine_stats_ref; +/** * intel_enable_engine_stats() - Enable engine busy tracking on engine * @engine: engine to enable stats collection
@@ -1573,6 +1578,8 @@ int intel_enable_engine_stats(struct intel_engine_cs *engine)if (!i915.enable_execlists)return -ENODEV ; +mutex_lock (&i915_engine_stats_mutex); +spin_lock_irqsave (&engine->stats.lock, flags);if (engine->stats.enabled == ~0 ) goto busy;
@@ -1580,10 +1587,16 @@ int intel_enable_engine_stats(struct intel_engine_cs *engine) engine->stats.enabled_at =ktime_get ();spin_unlock_irqrestore (&engine->stats.lock, flags); +if (i915_engine_stats_ref++ ==0 ) +static_branch_enable (&i915_engine_stats_key); + +mutex_unlock (&i915_engine_stats_mutex); +return 0 ; busy:spin_unlock_irqrestore (&engine->stats.lock, flags); +mutex_unlock (&i915_engine_stats_mutex);return -EBUSY ; }
@@ -1601,6 +1614,7 @@ void intel_disable_engine_stats(struct intel_engine_cs *engine)if (!i915.enable_execlists)return ; +mutex_lock (&i915_engine_stats_mutex);spin_lock_irqsave (&engine->stats.lock, flags);WARN_ON_ONCE (engine->stats.enabled ==0 );if (--engine->stats.enabled ==0 ) {
@@ -1610,6 +1624,9 @@ void intel_disable_engine_stats(struct intel_engine_cs *engine) engine->stats.total =0 ; }spin_unlock_irqrestore (&engine->stats.lock, flags); +if (--i915_engine_stats_ref ==0 ) +static_branch_disable (&i915_engine_stats_key); +mutex_unlock (&i915_engine_stats_mutex); }/**
drivers/gpu/drm/i915/intel_ringbuffer.h +63 -38
128 lines not on this page · raw message
Signature · 6 lines
2.9.5 _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Re: [PATCH 8/8] drm/i915: Gate engine stats collection with a static key
Quoted 82 lines · Tvrtko Ursulin
static inline void intel_engine_context_out(struct
intel_engine_cs
*engine){ unsigned long flags;drivers/gpu/drm/i915/intel_ringbuffer.h +0
-9-if (READ_ONCE (engine->stats.enabled) ==0 ) -return ; - -spin_lock_irqsave (&engine->stats.lock, flags); - - if (engine->stats.enabled > 0) { - ktime_t last, now = ktime_get(); - - if (engine->stats.active && --engine->stats.active ==0) {
(quoted diff) +0
-2- /* - * Decrement the active context count and incase GPU
drivers/gpu/drm/i915/intel_ringbuffer.h +0
-5-* is now idle add up to the running total. -*/ - last =ktime_sub (now, engine->stats.start); - - engine->stats.total =ktime_add(engine->stats.total,
drivers/gpu/drm/i915/intel_ringbuffer.h +0
-4- last); - }else if (engine->stats.active ==0 ) { -/* -* After turning on engine stats, context out might be
- * the first event in which case we account
from thedrivers/gpu/drm/i915/intel_ringbuffer.h +0
-3-* time stats gathering was turned on. -*/ - last = ktime_sub(now,
engine->stats.enabled_at);(quoted diff) +0
-2- - engine->stats.total =ktime_add(engine->stats.total,
drivers/gpu/drm/i915/intel_ringbuffer.h +13
-1- last); +if (static_branch_unlikely (&i915_engine_stats_key)) { +if (READ_ONCE (engine->stats.enabled) ==0 ) +return ; + +spin_lock_irqsave (&engine->stats.lock, flags); + +if (engine->stats.enabled >0 ) { +ktime_t last, now =ktime_get (); + +if (engine->stats.active && + --engine->stats.active ==0 ) { +/* +* Decrement the active context count and in
+ * case GPU is now idle add up to the
runningdrivers/gpu/drm/i915/intel_ringbuffer.h +3
-0+* total. +*/ + last = ktime_sub(now,
engine->stats.start);drivers/gpu/drm/i915/intel_ringbuffer.h +3
-0+ + engine->stats.total = + ktime_add(engine->stats.total,last);
drivers/gpu/drm/i915/intel_ringbuffer.h +3
-0+ }else if (engine->stats.active ==0 ) { +/* +* After turning on engine stats, context out
+ * might be the first event in which
case we
+ * account from the time stats
gathering wasdrivers/gpu/drm/i915/intel_ringbuffer.h +3
-0+* turned on. +*/ + last = ktime_sub(now,
engine->stats.enabled_at);drivers/gpu/drm/i915/intel_ringbuffer.h +3
-0+ + engine->stats.total = + ktime_add(engine->stats.total,last);
drivers/gpu/drm/i915/i915_pmu.c +3
-0+ } + + spin_unlock_irqrestore(&engine->stats.lock,
Quoted 1 line
flags);
This irqrestore looks placed asymmetric with irqsave.
drivers/gpu/drm/i915/intel_ringbuffer.h bool intel_engine_can_store_dword(struct intel_engine_cs *engine); · line 886
Quoted 5 lines
} }drivers/gpu/drm/i915/intel_ringbuffer.h +0
-2- -spin_unlock_irqrestore (&engine->stats.lock, flags); }
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Tvrtko Ursulin
maintainerPATCH v7 8/8 drm/i915: Gate engine stats collection with a static key
From: Tvrtko Ursulin <[email protected]>
This reduces the cost of the software engine busyness tracking to a single no-op instruction when there are no listeners.
v2: Rebase and some comments.
v3: Rebase.
v4: Checkpatch fixes.
v5: Rebase.
v6: Use system_long_wq to avoid being blocked by struct_mutex
users.
v7: Fix bad conflict resolution from last rebase. (Dmitry Rogozhkin)
--- drivers/gpu/drm/i915/i915_pmu.c | 54 +++++++++++++++-- drivers/gpu/drm/i915/intel_engine_cs.c | 17 ++++++ drivers/gpu/drm/i915/intel_ringbuffer.h | 101 ++++++++++++++++++++------------ 3 files changed, 130 insertions(+), 42 deletions(-)
drivers/gpu/drm/i915/i915_pmu.c +50 -4
@@ -499,11 +499,17 @@ static void i915_pmu_enable(struct perf_event *event)GEM_BUG_ON (sample >=I915_PMU_SAMPLE_BITS );GEM_BUG_ON (engine->pmu.enable_count[sample] == ~0 );if (engine->pmu.enable_count[sample]++ ==0 ) { +/* +* Enable engine busy stats tracking if needed or +* alternatively cancel the scheduled disabling of the +* same. +*/ if (engine_needs_busy_stats (engine) && !engine->pmu.busy_stats) { - engine->pmu.busy_stats = -intel_enable_engine_stats (engine) ==0 ; -WARN_ON_ONCE (!engine->pmu.busy_stats); + engine->pmu.busy_stats = true; +if (!cancel_delayed_work (&engine->pmu.disable_busy_stats)) +queue_work (system_long_wq, + &engine->pmu.enable_busy_stats); } } }
@@ -546,7 +552,15 @@ static void i915_pmu_disable(struct perf_event *event)if (!engine_needs_busy_stats (engine) && engine->pmu.busy_stats) { engine->pmu.busy_stats = false; -intel_disable_engine_stats (engine); +/* +* We request a delayed disable to handle the +* rapid on/off cycles on events which can +* happen when tools like perf stat start in a +* nicer way. +*/ +queue_delayed_work (system_long_wq, + &engine->pmu.disable_busy_stats, +round_jiffies_up_relative (HZ )); } } }
@@ -737,9 +751,27 @@ static int i915_pmu_cpu_offline(unsigned int cpu, struct hlist_node *node)return 0 ; } +static void __enable_busy_stats (struct work_struct *work) +{ +struct intel_engine_cs *engine = +container_of (work,typeof (*engine), pmu.enable_busy_stats); + +WARN_ON_ONCE (intel_enable_engine_stats (engine)); +} + +static void __disable_busy_stats (struct work_struct *work) +{ +struct intel_engine_cs *engine = +container_of (work,typeof (*engine), pmu.disable_busy_stats.work); + +intel_disable_engine_stats (engine); +} +void i915_pmu_register (struct drm_i915_private *i915) {int ret; +struct intel_engine_cs *engine; +enum intel_engine_id id;if (INTEL_GEN (i915) <=2 ) {DRM_INFO ("PMU not supported for this GPU." );
@@ -773,6 +805,12 @@ void i915_pmu_register(struct drm_i915_private *i915) i915->pmu.timer.function = i915_sample; i915->pmu.enable =0 ; +for_each_engine (engine, i915, id) { +INIT_WORK (&engine->pmu.enable_busy_stats, __enable_busy_stats); +INIT_DELAYED_WORK (&engine->pmu.disable_busy_stats, + __disable_busy_stats); + } + ret =perf_pmu_register (&i915->pmu.base,"i915" ,-1 );if (ret ==0 )return ;
@@ -791,6 +829,9 @@ void i915_pmu_register(struct drm_i915_private *i915)void i915_pmu_unregister (struct drm_i915_private *i915) { +struct intel_engine_cs *engine; +enum intel_engine_id id; +if (!i915->pmu.base.event_init)return ;
@@ -802,6 +843,11 @@ void i915_pmu_unregister(struct drm_i915_private *i915)hrtimer_cancel (&i915->pmu.timer); +for_each_engine (engine, i915, id) { +flush_work (&engine->pmu.enable_busy_stats); +flush_delayed_work (&engine->pmu.disable_busy_stats); + } +perf_pmu_unregister (&i915->pmu.base); i915->pmu.base.event_init =NULL ; }
drivers/gpu/drm/i915/intel_engine_cs.c +17 -0
@@ -21,6 +21,7 @@* IN THE SOFTWARE. * */ +#include <linux/static_key.h> #include "i915_drv.h" #include "intel_ringbuffer.h"
@@ -1558,6 +1559,10 @@ bool intel_engine_can_store_dword(struct intel_engine_cs *engine) } } +DEFINE_STATIC_KEY_FALSE (i915_engine_stats_key); +static DEFINE_MUTEX (i915_engine_stats_mutex); +static int i915_engine_stats_ref; +/** * intel_enable_engine_stats() - Enable engine busy tracking on engine * @engine: engine to enable stats collection
@@ -1573,6 +1578,8 @@ int intel_enable_engine_stats(struct intel_engine_cs *engine)if (!i915.enable_execlists)return -ENODEV ; +mutex_lock (&i915_engine_stats_mutex); +spin_lock_irqsave (&engine->stats.lock, flags);if (engine->stats.enabled == ~0 ) goto busy;
@@ -1580,10 +1587,16 @@ int intel_enable_engine_stats(struct intel_engine_cs *engine) engine->stats.enabled_at =ktime_get ();spin_unlock_irqrestore (&engine->stats.lock, flags); +if (i915_engine_stats_ref++ ==0 ) +static_branch_enable (&i915_engine_stats_key); + +mutex_unlock (&i915_engine_stats_mutex); +return 0 ; busy:spin_unlock_irqrestore (&engine->stats.lock, flags); +mutex_unlock (&i915_engine_stats_mutex);return -EBUSY ; }
@@ -1601,6 +1614,7 @@ void intel_disable_engine_stats(struct intel_engine_cs *engine)if (!i915.enable_execlists)return ; +mutex_lock (&i915_engine_stats_mutex);spin_lock_irqsave (&engine->stats.lock, flags);WARN_ON_ONCE (engine->stats.enabled ==0 );if (--engine->stats.enabled ==0 ) {
@@ -1610,6 +1624,9 @@ void intel_disable_engine_stats(struct intel_engine_cs *engine) engine->stats.total =0 ; }spin_unlock_irqrestore (&engine->stats.lock, flags); +if (--i915_engine_stats_ref ==0 ) +static_branch_disable (&i915_engine_stats_key); +mutex_unlock (&i915_engine_stats_mutex); }/**
drivers/gpu/drm/i915/intel_ringbuffer.h +63 -38
128 lines not on this page · raw message
Signature · 6 lines
2.9.5 _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Patchwork
CI✓ Fi.CI.BAT: success for i915 PMU and engine busy stats (rev9)
In reply to Tvrtko Ursulin== Series Details ==
== Series Details ==
Series: i915 PMU and engine busy stats (rev9)
URL : https://patchwork.freedesktop.org/series/27488/
State : success
== Summary ==
Series 27488v9 i915 PMU and engine busy stats
https://patchwork.freedesktop.org/api/1.0/series/27488/revisions/9/mbox/
Test kms_cursor_legacy:
Subgroup basic-busy-flip-before-cursor-atomic:
pass -> FAIL (fi-snb-2600) fdo#100215 +1
Test pm_rpm:
Subgroup basic-rte:
pass -> DMESG-WARN (fi-cfl-s) fdo#102294fdo#100215 https://bugs.freedesktop.org/show_bug.cgi?id=100215
fdo#102294 https://bugs.freedesktop.org/show_bug.cgi?id=102294
fi-bdw-5557u total:289 pass:268 dwarn:0 dfail:0 fail:0 skip:21 time:445s fi-bdw-gvtdvm total:289 pass:265 dwarn:0 dfail:0 fail:0 skip:24 time:460s fi-blb-e6850 total:289 pass:224 dwarn:1 dfail:0 fail:0 skip:64 time:377s fi-bsw-n3050 total:289 pass:243 dwarn:0 dfail:0 fail:0 skip:46 time:537s fi-bwr-2160 total:289 pass:184 dwarn:0 dfail:0 fail:0 skip:105 time:271s fi-bxt-j4205 total:289 pass:260 dwarn:0 dfail:0 fail:0 skip:29 time:512s fi-byt-j1900 total:289 pass:254 dwarn:1 dfail:0 fail:0 skip:34 time:506s fi-byt-n2820 total:289 pass:250 dwarn:1 dfail:0 fail:0 skip:38 time:502s fi-cfl-s total:289 pass:222 dwarn:35 dfail:0 fail:0 skip:32 time:546s fi-elk-e7500 total:289 pass:230 dwarn:0 dfail:0 fail:0 skip:59 time:449s fi-glk-2a total:289 pass:260 dwarn:0 dfail:0 fail:0 skip:29 time:596s fi-hsw-4770 total:289 pass:263 dwarn:0 dfail:0 fail:0 skip:26 time:434s fi-hsw-4770r total:289 pass:263 dwarn:0 dfail:0 fail:0 skip:26 time:409s fi-ilk-650 total:289 pass:229 dwarn:0 dfail:0 fail:0 skip:60 time:440s fi-ivb-3520m total:289 pass:261 dwarn:0 dfail:0 fail:0 skip:28 time:485s fi-ivb-3770 total:289 pass:261 dwarn:0 dfail:0 fail:0 skip:28 time:469s fi-kbl-7500u total:289 pass:264 dwarn:1 dfail:0 fail:0 skip:24 time:490s fi-kbl-7560u total:289 pass:270 dwarn:0 dfail:0 fail:0 skip:19 time:584s fi-kbl-r total:289 pass:262 dwarn:0 dfail:0 fail:0 skip:27 time:591s fi-pnv-d510 total:289 pass:223 dwarn:1 dfail:0 fail:0 skip:65 time:549s fi-skl-6260u total:289 pass:269 dwarn:0 dfail:0 fail:0 skip:20 time:455s fi-skl-6700k total:289 pass:265 dwarn:0 dfail:0 fail:0 skip:24 time:524s fi-skl-6770hq total:289 pass:269 dwarn:0 dfail:0 fail:0 skip:20 time:507s fi-skl-gvtdvm total:289 pass:266 dwarn:0 dfail:0 fail:0 skip:23 time:458s fi-snb-2520m total:289 pass:251 dwarn:0 dfail:0 fail:0 skip:38 time:574s fi-snb-2600 total:289 pass:249 dwarn:0 dfail:0 fail:1 skip:39 time:430s
2fc9cff0b670ddda64f5de27b137f0ee9b8d3f4b drm-tip: 2017y-09m-18d-12h-26m-04s UTC integration manifest 8f9cb14934ff drm/i915: Gate engine stats collection with a static key7e1acab5b0bc drm/i915/pmu: Wire up engine busy stats to PMU4f8337b50f17 drm/i915: Engine busy time tracking6023c9cdd7a0 drm/i915: Wrap context schedule notification8a0f7b93de83 drm/i915/pmu: Suspend sampling when GPU is idle3f9f41ba111e drm/i915/pmu: Expose a PMU interface for perf queriesc928eecdb02b drm/i915: Extract intel_get_cagf9a324fdc25b8 drm/i915: Convert intel_rc6_residency_us to ns
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_5730/
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Quoting Tvrtko Ursulin (2017-09-18 12:38:06)
Quoted 3 lines
From: Tvrtko Ursulin <[email protected]>
Fourth spin of the i915 PMU series. Now with the RFC tag removed.
Just to dump one idea that I wanted to report in the overlay: rate of object allocation, deallocation; pages pinned, unpinned; vma bind, unbind. They tend to be the other things I find of interest in reading traces. Now the problem with vma is that it would be nice if it were tied to a context/process. Pid filtering might be interesting...
-Chris
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Quoted 8 lines · Chris Wilson
Quoting Tvrtko Ursulin (2017-09-18 12:38:06)
Quoted 3 lines
From: Tvrtko Ursulin <[email protected]>
Fourth spin of the i915 PMU series. Now with the RFC tag removed.
Just to dump one idea that I wanted to report in the overlay: rate of object allocation, deallocation; pages pinned, unpinned; vma bind, unbind. They tend to be the other things I find of interest in reading traces.
If getting these rates via tracepoints like today is not good enough we could add that at a later point.
Quoted 2 lines
Now the problem with vma is that it would be nice if it were tied to a context/process. Pid filtering might be interesting...
And in fact there are already feature requests from customers to provide engine busyness per context, with per pid probably being good enough. This as well I said we are going to leave for the 2nd stage.
I am hoping you are not proposing to cram everything from the above into v1?
Regards,
Tvrtko
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Patchwork
CI✓ Fi.CI.IGT: success for i915 PMU and engine busy stats (rev9)
In reply to Tvrtko Ursulin== Series Details ==
== Series Details ==
Series: i915 PMU and engine busy stats (rev9)
URL : https://patchwork.freedesktop.org/series/27488/
State : success
== Summary ==
Test perf:
Subgroup polling:
fail -> PASS (shard-hsw) fdo#102252
Test kms_atomic_transition:
Subgroup plane-all-transition-nonblocking:
fail -> PASS (shard-hsw) fdo#102671fdo#102252 https://bugs.freedesktop.org/show_bug.cgi?id=102252
fdo#102671 https://bugs.freedesktop.org/show_bug.cgi?id=102671
shard-hsw total:2313 pass:1246 dwarn:0 dfail:0 fail:12 skip:1055 time:9478s
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_5730/shards.html
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Patchwork
CI✓ Fi.CI.BAT: success for i915 PMU and engine busy stats (rev10)
In reply to Tvrtko Ursulin== Series Details ==
== Series Details ==
Series: i915 PMU and engine busy stats (rev10)
URL : https://patchwork.freedesktop.org/series/27488/
State : success
== Summary ==
Series 27488v10 i915 PMU and engine busy stats
https://patchwork.freedesktop.org/api/1.0/series/27488/revisions/10/mbox/
Test chamelium:
Subgroup dp-crc-fast:
pass -> FAIL (fi-kbl-7500u) fdo#102514
Test kms_cursor_legacy:
Subgroup basic-busy-flip-before-cursor-legacy:
pass -> FAIL (fi-snb-2600) fdo#100215
Test kms_frontbuffer_tracking:
Subgroup basic:
dmesg-warn -> PASS (fi-kbl-7500u)
Test kms_pipe_crc_basic:
Subgroup hang-read-crc-pipe-b:
incomplete -> DMESG-WARN (fi-cfl-s) fdo#102294
Subgroup suspend-read-crc-pipe-a:
incomplete -> PASS (fi-kbl-7500u)
Test drv_module_reload:
Subgroup basic-reload:
pass -> DMESG-WARN (fi-glk-1) fdo#102777fdo#102514 https://bugs.freedesktop.org/show_bug.cgi?id=102514
fdo#100215 https://bugs.freedesktop.org/show_bug.cgi?id=100215
fdo#102294 https://bugs.freedesktop.org/show_bug.cgi?id=102294
fdo#102777 https://bugs.freedesktop.org/show_bug.cgi?id=102777
fi-bdw-5557u total:289 pass:268 dwarn:0 dfail:0 fail:0 skip:21 time:437s fi-bdw-gvtdvm total:289 pass:265 dwarn:0 dfail:0 fail:0 skip:24 time:473s fi-blb-e6850 total:289 pass:224 dwarn:1 dfail:0 fail:0 skip:64 time:420s fi-bsw-n3050 total:289 pass:243 dwarn:0 dfail:0 fail:0 skip:46 time:510s fi-bwr-2160 total:289 pass:184 dwarn:0 dfail:0 fail:0 skip:105 time:280s fi-bxt-j4205 total:289 pass:260 dwarn:0 dfail:0 fail:0 skip:29 time:509s fi-byt-j1900 total:289 pass:254 dwarn:1 dfail:0 fail:0 skip:34 time:495s fi-byt-n2820 total:289 pass:250 dwarn:1 dfail:0 fail:0 skip:38 time:495s fi-cfl-s total:289 pass:223 dwarn:34 dfail:0 fail:0 skip:32 time:541s fi-elk-e7500 total:289 pass:230 dwarn:0 dfail:0 fail:0 skip:59 time:419s fi-glk-1 total:289 pass:259 dwarn:1 dfail:0 fail:0 skip:29 time:567s fi-hsw-4770 total:289 pass:263 dwarn:0 dfail:0 fail:0 skip:26 time:426s fi-hsw-4770r total:289 pass:263 dwarn:0 dfail:0 fail:0 skip:26 time:405s fi-ilk-650 total:289 pass:229 dwarn:0 dfail:0 fail:0 skip:60 time:422s fi-ivb-3520m total:289 pass:261 dwarn:0 dfail:0 fail:0 skip:28 time:483s fi-ivb-3770 total:289 pass:261 dwarn:0 dfail:0 fail:0 skip:28 time:463s fi-kbl-7500u total:289 pass:263 dwarn:1 dfail:0 fail:1 skip:24 time:461s fi-kbl-7560u total:289 pass:270 dwarn:0 dfail:0 fail:0 skip:19 time:575s fi-kbl-r total:289 pass:262 dwarn:0 dfail:0 fail:0 skip:27 time:586s fi-pnv-d510 total:289 pass:223 dwarn:1 dfail:0 fail:0 skip:65 time:539s fi-skl-6260u total:289 pass:269 dwarn:0 dfail:0 fail:0 skip:20 time:453s fi-skl-6700k total:289 pass:265 dwarn:0 dfail:0 fail:0 skip:24 time:748s fi-skl-6770hq total:289 pass:269 dwarn:0 dfail:0 fail:0 skip:20 time:489s fi-skl-gvtdvm total:289 pass:266 dwarn:0 dfail:0 fail:0 skip:23 time:474s fi-snb-2520m total:289 pass:251 dwarn:0 dfail:0 fail:0 skip:38 time:568s fi-snb-2600 total:289 pass:249 dwarn:0 dfail:0 fail:1 skip:39 time:422s
bf6ecf6d25c1c45e576643b7d7a65e8b1e6b4f01 drm-tip: 2017y-09m-19d-17h-23m-04s UTC integration manifest 5fee33211526 drm/i915: Gate engine stats collection with a static key6fd166bf3f7a drm/i915/pmu: Wire up engine busy stats to PMU5af6d7183c9a drm/i915: Engine busy time trackinga2bcdfd1a9fc drm/i915: Wrap context schedule notificationdafaeae6847c drm/i915/pmu: Suspend sampling when GPU is idle9aa4b74f8ca3 drm/i915/pmu: Expose a PMU interface for perf queries808c73b2abb2 drm/i915: Extract intel_get_cagffa5db5906dea drm/i915: Convert intel_rc6_residency_us to ns
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_5747/
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Patchwork
CI✓ Fi.CI.IGT: success for i915 PMU and engine busy stats (rev10)
In reply to Tvrtko Ursulin== Series Details ==
== Series Details ==
Series: i915 PMU and engine busy stats (rev10)
URL : https://patchwork.freedesktop.org/series/27488/
State : success
== Summary ==
Test kms_flip:
Subgroup rcs-wf_vblank-vs-dpms:
dmesg-warn -> PASS (shard-hsw)
Test perf:
Subgroup polling:
fail -> PASS (shard-hsw) fdo#102252 +1fdo#102252 https://bugs.freedesktop.org/show_bug.cgi?id=102252
shard-hsw total:2317 pass:1245 dwarn:3 dfail:0 fail:12 skip:1057 time:9592s
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_5747/shards.html
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Patchwork
CI✗ Fi.CI.BAT: warning for i915 PMU and engine busy stats (rev11)
In reply to Tvrtko Ursulin== Series Details ==
== Series Details ==
Series: i915 PMU and engine busy stats (rev11)
URL : https://patchwork.freedesktop.org/series/27488/
State : warning
== Summary ==
Series 27488v11 i915 PMU and engine busy stats
https://patchwork.freedesktop.org/api/1.0/series/27488/revisions/11/mbox/
Test chamelium:
Subgroup dp-crc-fast:
pass -> FAIL (fi-kbl-7500u) fdo#102514
Subgroup hdmi-crc-fast:
pass -> DMESG-WARN (fi-skl-6700k)
Test kms_cursor_legacy:
Subgroup basic-busy-flip-before-cursor-legacy:
fail -> PASS (fi-snb-2600) fdo#100215
Test kms_force_connector_basic:
Subgroup force-connector-state:
skip -> PASS (fi-ivb-3520m)
Subgroup force-edid:
skip -> PASS (fi-ivb-3520m)
Subgroup force-load-detect:
skip -> PASS (fi-ivb-3520m)
Subgroup prune-stale-modes:
skip -> PASS (fi-ivb-3520m)
Test kms_frontbuffer_tracking:
Subgroup basic:
pass -> DMESG-WARN (fi-bdw-5557u) fdo#102473fdo#102514 https://bugs.freedesktop.org/show_bug.cgi?id=102514
fdo#100215 https://bugs.freedesktop.org/show_bug.cgi?id=100215
fdo#102473 https://bugs.freedesktop.org/show_bug.cgi?id=102473
fi-bdw-5557u total:289 pass:267 dwarn:1 dfail:0 fail:0 skip:21 time:437s fi-bdw-gvtdvm total:289 pass:265 dwarn:0 dfail:0 fail:0 skip:24 time:473s fi-blb-e6850 total:289 pass:224 dwarn:1 dfail:0 fail:0 skip:64 time:416s fi-bsw-n3050 total:289 pass:243 dwarn:0 dfail:0 fail:0 skip:46 time:514s fi-bwr-2160 total:289 pass:184 dwarn:0 dfail:0 fail:0 skip:105 time:278s fi-bxt-j4205 total:289 pass:260 dwarn:0 dfail:0 fail:0 skip:29 time:498s fi-byt-j1900 total:289 pass:254 dwarn:1 dfail:0 fail:0 skip:34 time:489s fi-byt-n2820 total:289 pass:250 dwarn:1 dfail:0 fail:0 skip:38 time:482s fi-cfl-s total:289 pass:222 dwarn:35 dfail:0 fail:0 skip:32 time:545s fi-elk-e7500 total:289 pass:230 dwarn:0 dfail:0 fail:0 skip:59 time:416s fi-glk-1 total:289 pass:260 dwarn:0 dfail:0 fail:0 skip:29 time:565s fi-hsw-4770 total:289 pass:263 dwarn:0 dfail:0 fail:0 skip:26 time:425s fi-hsw-4770r total:289 pass:263 dwarn:0 dfail:0 fail:0 skip:26 time:404s fi-ilk-650 total:289 pass:229 dwarn:0 dfail:0 fail:0 skip:60 time:433s fi-ivb-3520m total:289 pass:261 dwarn:0 dfail:0 fail:0 skip:28 time:478s fi-ivb-3770 total:289 pass:261 dwarn:0 dfail:0 fail:0 skip:28 time:461s fi-kbl-7500u total:118 pass:99 dwarn:1 dfail:0 fail:1 skip:16 fi-kbl-7560u total:289 pass:270 dwarn:0 dfail:0 fail:0 skip:19 time:582s fi-kbl-r total:289 pass:262 dwarn:0 dfail:0 fail:0 skip:27 time:586s fi-pnv-d510 total:289 pass:223 dwarn:1 dfail:0 fail:0 skip:65 time:542s fi-skl-6260u total:289 pass:269 dwarn:0 dfail:0 fail:0 skip:20 time:449s fi-skl-6700k total:289 pass:264 dwarn:1 dfail:0 fail:0 skip:24 time:750s fi-skl-6770hq total:289 pass:269 dwarn:0 dfail:0 fail:0 skip:20 time:488s fi-skl-gvtdvm total:289 pass:266 dwarn:0 dfail:0 fail:0 skip:23 time:480s fi-snb-2520m total:289 pass:251 dwarn:0 dfail:0 fail:0 skip:38 time:562s fi-snb-2600 total:289 pass:250 dwarn:0 dfail:0 fail:0 skip:39 time:415s
ed7a99bf23cea2276e77ba26d219e58e069d1e32 drm-tip: 2017y-09m-20d-11h-03m-37s UTC integration manifest d36bbe6311d5 drm/i915: Gate engine stats collection with a static key1673147befe1 drm/i915/pmu: Wire up engine busy stats to PMU034aa97921b4 drm/i915: Engine busy time tracking99ed43be4f06 drm/i915: Wrap context schedule notificationb357130dbdb3 drm/i915/pmu: Suspend sampling when GPU is idleca3894412465 drm/i915/pmu: Expose a PMU interface for perf queriesf9d3637a269a drm/i915: Extract intel_get_cagf88319bdc951c drm/i915: Convert intel_rc6_residency_us to ns
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_5769/
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx