[Intel-gfx] [PATCH 5/9] drm/i915: Engine busy time tracking

Chris Wilson chris at chris-wilson.co.uk
Wed Nov 15 14:27:13 UTC 2017


Quoting Tvrtko Ursulin (2017-11-13 08:57:22)
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> index b71d9ea5227f..5b5e2bd9b25d 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> @@ -560,6 +560,38 @@ struct intel_engine_cs {
>          * certain bits to encode the command length in the header).
>          */
>         u32 (*get_cmd_length_mask)(u32 cmd_header);
> +
> +       struct {
> +               /**
> +                * @lock: Lock protecting the below fields.
> +                */
> +               spinlock_t lock;
> +               /**
> +                * @enabled: Reference count indicating number of listeners.
> +                */
> +               unsigned int enabled;
> +               /**
> +                * @active: Number of contexts currently scheduled in.
> +                */
> +               unsigned int active;
> +               /**
> +                * @enabled_at: Timestamp when busy stats were enabled.
> +                */
> +               ktime_t enabled_at;
> +               /**
> +                * @start: Timestamp of the last idle to active transition.
> +                *
> +                * Idle is defined as active == 0, active is active > 0.
> +                */
> +               ktime_t start;
> +               /**
> +                * @total: Total time this engine was busy.
> +                *
> +                * Accumulated time not counting the most recent block in cases
> +                * where engine is currently busy (active > 0).
> +                */
> +               ktime_t total;
> +       } stats;
>  };
>  
>  static inline void
> @@ -964,4 +996,64 @@ void intel_engine_dump(struct intel_engine_cs *engine, struct drm_printer *p);
>  struct intel_engine_cs *
>  intel_engine_lookup_user(struct drm_i915_private *i915, u8 class, u8 instance);
>  
> +static inline void intel_engine_context_in(struct intel_engine_cs *engine)
> +{
> +       unsigned long flags;
> +
> +       if (READ_ONCE(engine->stats.enabled) == 0)
> +               return;
> +
> +       spin_lock_irqsave(&engine->stats.lock, flags);
> +
> +       if (engine->stats.enabled > 0) {

Why > 0 for an unsigned int?
-Chris


More information about the Intel-gfx mailing list