[PATCH 6/8] drm/i915/gvt: Introduce vGPU submission ops

Zhenyu Wang zhenyuw at linux.intel.com
Fri Sep 15 06:12:32 UTC 2017


On 2017.09.14 02:50:46 +0800, Zhi Wang wrote:
> Introduce vGPU submission ops to support easy switching submission mode
> of one vGPU between different OSes.
> 
> Signed-off-by: Zhi Wang <zhi.a.wang at intel.com>
> ---
>  drivers/gpu/drm/i915/gvt/execlist.c  | 10 +++++--
>  drivers/gpu/drm/i915/gvt/gvt.h       | 14 ++++++++++
>  drivers/gpu/drm/i915/gvt/handlers.c  | 16 +++++++++--
>  drivers/gpu/drm/i915/gvt/scheduler.c | 53 ++++++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/i915/gvt/scheduler.h |  6 ++++
>  drivers/gpu/drm/i915/gvt/vgpu.c      | 13 ++-------
>  6 files changed, 98 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gvt/execlist.c b/drivers/gpu/drm/i915/gvt/execlist.c
> index 22c7edf..e608b39 100644
> --- a/drivers/gpu/drm/i915/gvt/execlist.c
> +++ b/drivers/gpu/drm/i915/gvt/execlist.c
> @@ -553,7 +553,7 @@ static void clean_workloads(struct intel_vgpu *vgpu, unsigned long engine_mask)
>  	}
>  }
>  
> -void intel_vgpu_clean_execlist(struct intel_vgpu *vgpu)
> +void clean_execlist(struct intel_vgpu *vgpu)
>  {
>  	enum intel_engine_id i;
>  	struct intel_engine_cs *engine;
> @@ -569,7 +569,7 @@ void intel_vgpu_clean_execlist(struct intel_vgpu *vgpu)
>  	}
>  }
>  
> -int intel_vgpu_init_execlist(struct intel_vgpu *vgpu)
> +int init_execlist(struct intel_vgpu *vgpu)
>  {
>  	enum intel_engine_id i;
>  	struct intel_engine_cs *engine;
> @@ -591,3 +591,9 @@ void intel_vgpu_reset_execlist(struct intel_vgpu *vgpu,
>  	for_each_engine_masked(engine, dev_priv, engine_mask, tmp)
>  		init_vgpu_execlist(vgpu, engine->id);
>  }
> +
> +const struct intel_vgpu_submission_ops intel_vgpu_execlist_submission_ops = {
> +	.name = "execlist",
> +	.init = init_execlist,
> +	.clean = clean_execlist,
> +};
> diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h
> index 7a770b1..c619728 100644
> --- a/drivers/gpu/drm/i915/gvt/gvt.h
> +++ b/drivers/gpu/drm/i915/gvt/gvt.h
> @@ -142,6 +142,17 @@ struct vgpu_sched_ctl {
>  	int weight;
>  };
>  
> +enum {
> +	INTEL_VGPU_EXECLIST_SUBMISSION = 1,
> +	INTEL_VGPU_GUC_SUBMISSION,
> +};
> +
> +struct intel_vgpu_submission_ops {
> +	const char *name;
> +	int (*init)(struct intel_vgpu *vgpu);
> +	void (*clean)(struct intel_vgpu *vgpu);
> +};

I think moving submission layer operation on workload into
this ops is also better, e.g prepare/complete, etc.

> +
>  struct intel_vgpu_submission {
>  	struct intel_vgpu_execlist execlist[I915_NUM_ENGINES];
>  	struct list_head workload_q_head[I915_NUM_ENGINES];
> @@ -152,6 +163,9 @@ struct intel_vgpu_submission {
>  	DECLARE_BITMAP(tlb_handle_pending, I915_NUM_ENGINES);
>  	void *ring_scan_buffer[I915_NUM_ENGINES];
>  	int ring_scan_buffer_size[I915_NUM_ENGINES];
> +	const struct intel_vgpu_submission_ops *ops;
> +	int virtual_submission_interface;
> +	bool active;
>  };
>  
>  struct intel_vgpu {
> diff --git a/drivers/gpu/drm/i915/gvt/handlers.c b/drivers/gpu/drm/i915/gvt/handlers.c
> index 2ee494b..aad6f46 100644
> --- a/drivers/gpu/drm/i915/gvt/handlers.c
> +++ b/drivers/gpu/drm/i915/gvt/handlers.c
> @@ -1480,9 +1480,11 @@ static int elsp_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
>  static int ring_mode_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
>  		void *p_data, unsigned int bytes)
>  {
> +	struct intel_vgpu_submission *s = &vgpu->submission;
>  	u32 data = *(u32 *)p_data;
>  	int ring_id = render_mmio_to_ring_id(vgpu->gvt, offset);
>  	bool enable_execlist;
> +	int ret;
>  
>  	write_vreg(vgpu, offset, p_data, bytes);
>  
> @@ -1504,8 +1506,18 @@ static int ring_mode_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
>  				(enable_execlist ? "enabling" : "disabling"),
>  				ring_id);
>  
> -		if (enable_execlist)
> -			intel_vgpu_start_schedule(vgpu);
> +		if (!enable_execlist)
> +			return 0;
> +
> +		if (s->active)
> +			return 0;
> +
> +		ret = intel_vgpu_select_submission_ops(vgpu,
> +				INTEL_VGPU_EXECLIST_SUBMISSION);
> +		if (ret)
> +			return ret;
> +
> +		intel_vgpu_start_schedule(vgpu);
>  	}
>  	return 0;
>  }
> diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c
> index 544a887..d979c4f 100644
> --- a/drivers/gpu/drm/i915/gvt/scheduler.c
> +++ b/drivers/gpu/drm/i915/gvt/scheduler.c
> @@ -881,6 +881,7 @@ void intel_vgpu_clean_submission(struct intel_vgpu *vgpu)
>  {
>  	struct intel_vgpu_submission *s = &vgpu->submission;
>  
> +	intel_vgpu_select_submission_ops(vgpu, 0);
>  	i915_gem_context_put(s->shadow_ctx);
>  	kmem_cache_destroy(s->workloads);
>  }
> @@ -935,6 +936,58 @@ int intel_vgpu_setup_submission(struct intel_vgpu *vgpu)
>  }
>  
>  /**
> + * intel_vgpu_select_submission_ops - select virtual submission interface
> + * @vgpu: a vGPU
> + * @interface: expected vGPU virtual submission interface
> + *
> + * This function is called when guest configures submission interface.
> + *
> + * Returns:
> + * Zero on success, negative error code if failed.
> + *
> + */
> +int intel_vgpu_select_submission_ops(struct intel_vgpu *vgpu,
> +				     unsigned int interface)
> +{
> +	struct intel_vgpu_submission *s = &vgpu->submission;
> +	const struct intel_vgpu_submission_ops *ops[] = {
> +		[INTEL_VGPU_EXECLIST_SUBMISSION] =
> +			&intel_vgpu_execlist_submission_ops,
> +	};
> +	int ret;
> +
> +	if (WARN_ON(interface >= ARRAY_SIZE(ops)))
> +		return -EINVAL;
> +
> +	if (s->active) {
> +		s->ops->clean(vgpu);
> +		s->active = false;
> +		gvt_dbg_core("vgpu%d: de-select ops [ %s ] \n",
> +				vgpu->id, s->ops->name);
> +	}
> +
> +	if (interface == 0) {
> +		s->ops = NULL;
> +		s->virtual_submission_interface = 0;
> +		gvt_dbg_core("vgpu%d: no submission ops\n", vgpu->id);
> +		return 0;
> +	}
> +
> +	ret = ops[interface]->init(vgpu);
> +	if (ret)
> +		return ret;
> +
> +	s->ops = ops[interface];
> +	s->virtual_submission_interface = interface;
> +	s->active = true;
> +
> +	gvt_dbg_core("vgpu%d: activate ops [ %s ]\n",
> +			vgpu->id, s->ops->name);
> +
> +	return 0;
> +}
> +
> +/**
>   * intel_vgpu_destroy_workload - destroy a vGPU workload
>   * @vgpu: a vGPU
>   *
> diff --git a/drivers/gpu/drm/i915/gvt/scheduler.h b/drivers/gpu/drm/i915/gvt/scheduler.h
> index b56b6de..5aa28fb 100644
> --- a/drivers/gpu/drm/i915/gvt/scheduler.h
> +++ b/drivers/gpu/drm/i915/gvt/scheduler.h
> @@ -140,6 +140,12 @@ int intel_vgpu_setup_submission(struct intel_vgpu *vgpu);
>  
>  void intel_vgpu_clean_submission(struct intel_vgpu *vgpu);
>  
> +int intel_vgpu_select_submission_ops(struct intel_vgpu *vgpu,
> +				     unsigned int interface);
> +
> +extern const struct intel_vgpu_submission_ops
> +intel_vgpu_execlist_submission_ops;
> +
>  struct intel_vgpu_workload *
>  intel_vgpu_create_workload(struct intel_vgpu *vgpu, int ring_id,
>  			   struct execlist_ctx_descriptor_format *desc);
> diff --git a/drivers/gpu/drm/i915/gvt/vgpu.c b/drivers/gpu/drm/i915/gvt/vgpu.c
> index 1c9818d..e63abd4 100644
> --- a/drivers/gpu/drm/i915/gvt/vgpu.c
> +++ b/drivers/gpu/drm/i915/gvt/vgpu.c
> @@ -255,7 +255,6 @@ void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu)
>  	idr_remove(&gvt->vgpu_idr, vgpu->id);
>  	intel_vgpu_clean_sched_policy(vgpu);
>  	intel_vgpu_clean_submission(vgpu);
> -	intel_vgpu_clean_execlist(vgpu);
>  	intel_vgpu_clean_display(vgpu);
>  	intel_vgpu_clean_opregion(vgpu);
>  	intel_vgpu_clean_gtt(vgpu);
> @@ -371,26 +370,20 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt,
>  	if (ret)
>  		goto out_clean_gtt;
>  
> -	ret = intel_vgpu_init_execlist(vgpu);
> -	if (ret)
> -		goto out_clean_display;
> -
>  	ret = intel_vgpu_setup_submission(vgpu);
>  	if (ret)
> -		goto out_clean_execlist;
> +		goto out_clean_display;
>  
>  	ret = intel_vgpu_init_sched_policy(vgpu);
>  	if (ret)
> -		goto out_clean_shadow_ctx;
> +		goto out_clean_submission;
>  
>  	mutex_unlock(&gvt->lock);
>  
>  	return vgpu;
>  
> -out_clean_shadow_ctx:
> +out_clean_submission:
>  	intel_vgpu_clean_submission(vgpu);
> -out_clean_execlist:
> -	intel_vgpu_clean_execlist(vgpu);
>  out_clean_display:
>  	intel_vgpu_clean_display(vgpu);
>  out_clean_gtt:
> -- 
> 2.7.4
> 
> _______________________________________________
> intel-gvt-dev mailing list
> intel-gvt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev

-- 
Open Source Technology Center, Intel ltd.

$gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/intel-gvt-dev/attachments/20170915/0bcc95ab/attachment.sig>


More information about the intel-gvt-dev mailing list