Quoting Tvrtko Ursulin (2019-10-25 15:21:30) > +static int busy_add(int id, void *p, void *data) > +{ > + struct busy_ctx *bc = data; > + struct i915_gem_context *ctx = p; > + unsigned int engine_class = bc->engine_class; > + struct i915_gem_engines_iter it; > + struct intel_context *ce; > + uint64_t total = bc->total; > + > + for_each_gem_engine(ce, i915_gem_context_lock_engines(ctx), it) { > + if (ce->engine->uabi_class == engine_class) > + total += ktime_to_ns(intel_context_get_busy_time(ce)); > + } > + i915_gem_context_unlock_engines(ctx); > + > + bc->total = total; > + > + return 0; > +} > + > +static ssize_t > +show_client_busy(struct device *kdev, struct device_attribute *attr, char *buf) > +{ > + struct i915_engine_busy_attribute *i915_attr = > + container_of(attr, typeof(*i915_attr), attr); > + struct drm_i915_file_private *file_priv = i915_attr->file_priv; > + struct busy_ctx bc = { .engine_class = i915_attr->engine_class }; > + int ret; > + > + ret = mutex_lock_interruptible(&file_priv->context_idr_lock); > + if (ret) > + return ret; > + > + idr_for_each(&file_priv->context_idr, busy_add, &bc); If you don a hard hat, this can all be done under rcu_read_lock(). -Chris _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx