Re: [Intel-gfx] [PATCH 09/26] drm/i915/guc: Ensure GuC schedule operations do not operate on child contexts

John Harrison
2021-10-07T20:24:03Z

On 10/4/2021 15:06, Matthew Brost wrote:
> In GuC parent-child contexts the parent context controls the scheduling,
> ensure only the parent does the scheduling operations.
>
> Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: John Harrison <John.C.Harrison@Intel.com>

> ---
> drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c | 13 ++++++++++++-
> 1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
> index ab6d7fc1b0b1..1f2809187513 100644
> --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
> @@ -324,6 +324,12 @@ static inline void decr_context_committed_requests(struct intel_context *ce)
> GEM_BUG_ON(ce->guc_state.number_committed_requests < 0);
> }
>
> +static struct intel_context *
> +request_to_scheduling_context(struct i915_request *rq)
> +{
> + return intel_context_to_parent(rq->context);
> +}
> +
> static inline bool context_guc_id_invalid(struct intel_context *ce)
> {
> return ce->guc_id.id == GUC_INVALID_LRC_ID;
> @@ -1710,6 +1716,7 @@ static void __guc_context_sched_disable(struct intel_guc *guc,
>
> GEM_BUG_ON(guc_id == GUC_INVALID_LRC_ID);
>
> + GEM_BUG_ON(intel_context_is_child(ce));
> trace_intel_context_sched_disable(ce);
>
> guc_submission_send_busy_loop(guc, action, ARRAY_SIZE(action),
> @@ -1935,6 +1942,8 @@ static void guc_context_sched_disable(struct intel_context *ce)
> intel_wakeref_t wakeref;
> u16 guc_id;
>
> + GEM_BUG_ON(intel_context_is_child(ce));
> +
> spin_lock_irqsave(&ce->guc_state.lock, flags);
>
> /*
> @@ -2303,6 +2312,8 @@ static void guc_signal_context_fence(struct intel_context *ce)
> {
> unsigned long flags;
>
> + GEM_BUG_ON(intel_context_is_child(ce));
> +
> spin_lock_irqsave(&ce->guc_state.lock, flags);
> clr_context_wait_for_deregister_to_register(ce);
> __guc_signal_context_fence(ce);
> @@ -2333,7 +2344,7 @@ static void guc_context_init(struct intel_context *ce)
>
> static int guc_request_alloc(struct i915_request *rq)
> {
> - struct intel_context *ce = rq->context;
> + struct intel_context *ce = request_to_scheduling_context(rq);
> struct intel_guc *guc = ce_to_guc(ce);
> unsigned long flags;
> int ret;