[Intel-gfx] [PATCH 4/5] drm/i915: add a new perf configuration execbuf parameter
Chris Wilson
chris at chris-wilson.co.uk
Tue May 21 17:07:58 UTC 2019
Quoting Lionel Landwerlin (2019-05-21 15:08:54)
> + if (eb->oa_config &&
> + eb->oa_config != eb->i915->perf.oa.exclusive_stream->oa_config) {
But the oa_config is not ordered with respect to requests, and the
registers changed here are not context saved and so may be changed by a
third party before execution. The first party must presumably dropped
the perf_fd before then, so maybe you don't care? Hmm, doesn't even take
a third party as the perf_fd owner may change their mind for different
contexts and be surprised when the wrong set is used.
> + struct i915_vma *oa_vma;
> +
> + oa_vma = i915_vma_instance(eb->oa_bo,
> + &eb->engine->i915->ggtt.vm, NULL);
> + if (unlikely(IS_ERR(oa_vma))) {
> + err = PTR_ERR(oa_vma);
> + return err;
> + }
> +
> + err = i915_vma_pin(oa_vma, 0, 0, PIN_GLOBAL);
> + if (err)
> + return err;
> +
> + err = eb->engine->emit_bb_start(eb->request,
> + oa_vma->node.start,
> + 0, I915_DISPATCH_SECURE);
> + if (err) {
> + i915_vma_unpin(oa_vma);
> + return err;
> + }
> +
> + err = i915_vma_move_to_active(oa_vma, eb->request, 0);
Move to active first, so that the vma is not in use if the move fails.
> + if (err) {
> + i915_vma_unpin(oa_vma);
> + return err;
> + }
> +
> +
> + i915_vma_unpin(oa_vma);
> +
> +
> + swap(eb->oa_config, eb->i915->perf.oa.exclusive_stream->oa_config);
> + }
> +
> err = eb->engine->emit_bb_start(eb->request,
> eb->batch->node.start +
> eb->batch_start_offset,
> @@ -2341,6 +2410,7 @@ i915_gem_do_execbuffer(struct drm_device *dev,
> eb.buffer_count = args->buffer_count;
> eb.batch_start_offset = args->batch_start_offset;
> eb.batch_len = args->batch_len;
> + eb.oa_config = NULL;
>
> eb.batch_flags = 0;
> if (args->flags & I915_EXEC_SECURE) {
> @@ -2385,17 +2455,29 @@ i915_gem_do_execbuffer(struct drm_device *dev,
> */
> intel_gt_pm_get(eb.i915);
>
> - err = i915_mutex_lock_interruptible(dev);
> - if (err)
> - goto err_rpm;
> -
> err = eb_select_engine(&eb, file, args);
Lost the lock.
> if (unlikely(err))
> - goto err_unlock;
> + goto err_rpm;
> +
> + if (args->flags & I915_EXEC_PERF_CONFIG) {
> + if (!intel_engine_has_oa(eb.engine)) {
> + err = -ENODEV;
> + goto err_engine;
> + }
> +
> + err = get_execbuf_oa_config(eb.i915, args->DR1, args->DR4,
> + &eb.oa_config, &eb.oa_bo);
> + if (err)
> + goto err_engine;
> + }
> +
> + err = i915_mutex_lock_interruptible(dev);
> + if (err)
> + goto err_oa;
>
> err = eb_wait_for_ring(&eb); /* may temporarily drop struct_mutex */
> if (unlikely(err))
> - goto err_engine;
> + goto err_unlock;
>
> err = eb_relocate(&eb);
> if (err) {
> @@ -2541,10 +2623,15 @@ i915_gem_do_execbuffer(struct drm_device *dev,
> err_vma:
> if (eb.exec)
> eb_release_vmas(&eb);
> -err_engine:
> - eb_unpin_context(&eb);
> err_unlock:
> mutex_unlock(&dev->struct_mutex);
> +err_oa:
> + if (eb.oa_config) {
> + i915_gem_object_put(eb.oa_bo);
> + i915_oa_config_put(eb.oa_config);
> + }
> +err_engine:
> + eb_unpin_context(&eb);
Lost the lock.
> err_rpm:
> intel_gt_pm_put(eb.i915);
> i915_gem_context_put(eb.gem_context);
More information about the Intel-gfx
mailing list