Re: [PATCH v2] drm/i915/gvt: emit init breadcrumb for gvt request

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2019.05.10 15:57:20 +0800, Weinan wrote:
> "To track whether a request has started on HW, we can emit a breadcrumb at
> the beginning of the request and check its timeline's HWSP to see if the
> breadcrumb has advanced past the start of this request." It means all the
> request which timeline's has_init_breadcrumb is true, then the
> emit_init_breadcrumb process must have before emitting the real commands,
> otherwise, the scheduler might get a wrong state of this request during
> reset. If the request is exactly the guilty one, the scheduler won't
> terminate it with the wrong state. To avoid this, do emit_init_breadcrumb
> for all the requests from gvt.
> 
> v2: cc to stable kernel
> 
> Fixes: 8547444137ec ("drm/i915: Identify active requests")
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Weinan <weinan.z.li@xxxxxxxxx>

Thanks for the fix!

Acked-by: Zhenyu Wang <zhenyuw@xxxxxxxxxxxxxxx>

> ---
>  drivers/gpu/drm/i915/gvt/scheduler.c | 19 +++++++++++++++++++
>  1 file changed, 19 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c
> index 7c99bbc3e2b8..ccd71152c9bc 100644
> --- a/drivers/gpu/drm/i915/gvt/scheduler.c
> +++ b/drivers/gpu/drm/i915/gvt/scheduler.c
> @@ -298,12 +298,31 @@ static int copy_workload_to_ring_buffer(struct intel_vgpu_workload *workload)
>  	struct i915_request *req = workload->req;
>  	void *shadow_ring_buffer_va;
>  	u32 *cs;
> +	int err;
>  
>  	if ((IS_KABYLAKE(req->i915) || IS_BROXTON(req->i915)
>  		|| IS_COFFEELAKE(req->i915))
>  		&& is_inhibit_context(req->hw_context))
>  		intel_vgpu_restore_inhibit_context(vgpu, req);
>  
> +	/*
> +	 * To track whether a request has started on HW, we can emit a
> +	 * breadcrumb at the beginning of the request and check its
> +	 * timeline's HWSP to see if the breadcrumb has advanced past the
> +	 * start of this request. Actually, the request must have the
> +	 * init_breadcrumb if its timeline set has_init_bread_crumb, or the
> +	 * scheduler might get a wrong state of it during reset. Since the
> +	 * requests from gvt always set the has_init_breadcrumb flag, here
> +	 * need to do the emit_init_breadcrumb for all the requests.
> +	 */
> +	if (req->engine->emit_init_breadcrumb) {
> +		err = req->engine->emit_init_breadcrumb(req);
> +		if (err) {
> +			gvt_vgpu_err("fail to emit init breadcrumb\n");
> +			return err;
> +		}
> +	}
> +
>  	/* allocate shadow ring buffer */
>  	cs = intel_ring_begin(workload->req, workload->rb_len / sizeof(u32));
>  	if (IS_ERR(cs)) {
> -- 
> 2.17.1
> 
> _______________________________________________
> intel-gvt-dev mailing list
> intel-gvt-dev@xxxxxxxxxxxxxxxxxxxxx
> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev

-- 
Open Source Technology Center, Intel ltd.

$gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux