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