[Intel-gfx] [PATCH v5 4/8] drm/i915: vgpu context submission pv optimization
Chris Wilson
chris at chris-wilson.co.uk
Mon Apr 29 10:02:35 UTC 2019
Quoting Xiaolin Zhang (2019-04-29 04:10:54)
> +static void pv_submit(struct intel_engine_cs *engine)
> +{
> + struct intel_engine_execlists * const execlists = &engine->execlists;
> + struct execlist_port *port = execlists->port;
> + unsigned int n;
> + struct gvt_shared_page *shared_page = engine->i915->vgpu.shared_page;
> + u64 descs[2];
> +
> + for (n = 0; n < execlists_num_ports(execlists); n++) {
> + struct i915_request *rq;
> + unsigned int count = 0;
> +
> + descs[n] = 0;
> + rq = port_unpack(&port[n], &count);
> + if (rq && count == 0) {
> + port_set(&port[n], port_pack(rq, ++count));
> + descs[n] = execlists_update_context(rq);
> + }
> + }
> +
> + spin_lock(&engine->i915->vgpu.shared_page_lock[engine->id]);
Only one engine at a time now accesses that portion of pv_elsp, so the
spin lock is not required per-se, aiui.
The problem is that there is no coordination between pv_submit and the
other side of the pipe, as far as I can see. So it seems very possible
for us to overwrite entries before they have been read. I expect to see
some ack mechanism for VGT_G2V_PV_SUBMISSION.
> + for (n = 0; n < execlists_num_ports(execlists); n++)
> + shared_page->pv_elsp[engine->id].descs[n] = descs[n];
I'd recommend not using engine->id, that's just our internal id and may
vary between host/guest. Use engine->hw_id? Or negotiate using pv setup
and store pv_id?
But starting to look more solid over all. We just need to finish
splitting out the various similar-but-quite-different-really submission
backends. :)
-Chris
More information about the Intel-gfx
mailing list