[Intel-gfx] [PATCH v7 11/11] drm/i915: Introduce GVT context creation API

Chris Wilson chris at chris-wilson.co.uk
Wed Jun 8 06:59:12 UTC 2016


On Tue, Jun 07, 2016 at 11:18:47AM -0400, Zhi Wang wrote:
> GVT workload scheduler needs special host LRC contexts, the so called
> "shadow LRC context" to submit guest workload to host i915. During the
> guest workload submission, workload scheduler fills the shadow LRC
> context with the content of guest LRC context: engine context is copied
> without changes, ring context is mostly owned by host i915.
> 
> v7:
> 
> - Move chart to a better place. (Joonas)
> 
> v6:
> 
> - Make GVT code as dead code when !CONFIG_DRM_I915_GVT. (Chris)
> 
> v5:
> - Only compile this feature when CONFIG_DRM_I915_GVT is enabled. (Tvrtko)
> - Rebase the code into new repo.
> - Add a comment about the ring buffer size. (Joonas)
> 
> v2:
> 
> Mostly based on Daniel's idea. Call the refactored core logic of GEM
> context creation service and LRC context creation service to create the GVT
> context.
> 
> Signed-off-by: Zhi Wang <zhi.a.wang at intel.com>
> ---
>  drivers/gpu/drm/i915/i915_gem_context.c | 65 +++++++++++++++++++++++++++++++++
>  1 file changed, 65 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
> index b0e82a1..2d8e22a 100644
> --- a/drivers/gpu/drm/i915/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> @@ -343,6 +343,71 @@ i915_gem_create_context(struct drm_device *dev,
>  	return ctx;
>  }
>  
> +/**
> + * i915_gem_create_gvt_context - create a GVT GEM context
> + * @dev: drm device *
> + *
> + * This function is used to create a GVT specific GEM context.
> + *
> + * Returns:
> + * pointer to i915_gem_context on success, error pointer if failed
> + *
> + */
> +/* GVT context usage flow:
> + *
> + *          +-----------+                   +-----------+
> + *          |   vGPU    |                   |   vGPU    |
> + *          +-+-----^---+                   +-+-----^---+
> + *            |     |                         |     |
> + *            |     | GVT-g                   |     | GVT-g
> + * vELSP write|     | emulates     vELSP write|     | emulates
> + *            |     | Execlist/CSB            |     | Execlist/CSB
> + *            |     | Status                  |     | Status
> + *            |     |                         |     |
> + *     +------v-----+-------------------------v-----+---------+
> + *     |           GVT Virtual Execlist Submission            |
> + *     +------+-------------------------------+---------------+
> + *            |                               |
> + *            | Per-VM/Ring Workoad Q         | Per-VM/Ring Workload Q
> + *     +---------------------+--+      +------------------------+
> + *        +---v--------+    ^             +---v--------+
> + *        |GVT Workload|... |             |GVT Workload|...
> + *        +------------+    |             +------------+
> + *                          |
> + *                          | Pick Workload from Q
> + *     +--------------------+---------------------------------+
> + *     |                GVT Workload Scheduler                |
> + *     +--------------------+---------------------------------+
> + *                          |         * Shadow guest LRC context
> + *                   +------v------+  * Shadow guest ring buffer
> + *                   | GVT Context |  * Scan/Patch guest RB instructions
> + *                   +------+------+
> + *                          |
> + *                          v
> + *              Host i915 GEM Submission
> + */

I presume you move this later.

> +struct i915_gem_context *
> +i915_gem_create_gvt_context(struct drm_device *dev)

i915_gem_context_create_gvt

No function declaration in the header, build incomplete. It is worth
making sure that every patch in the series builds and doesn't introduce
new (sparse) warnings.

> +{
> +	struct i915_gem_context *ctx;
> +
> +	if (!IS_ENABLED(CONFIG_DRM_I915_GVT))
> +		return ERR_PTR(-ENODEV);
> +
> +	mutex_lock(&dev->struct_mutex);

User facing? If so, this is the wrong type of mutex_lock.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the Intel-gfx mailing list