[Intel-gfx] [PATCH] drm/i915/gvt: Fix relocation of shadow bb

Zhenyu Wang zhenyuw at linux.intel.com
Mon Jan 9 02:36:11 UTC 2017


On 2017.01.06 19:58:16 +0000, Chris Wilson wrote:
> set_gma_to_bb_cmd() is completely bogus - it is (incorrectly) applying
> the rules to read a GTT offset from a command as opposed to writing the
> GTT offset. And to cap it all set_gma_to_bb_cmd() is called within a list
> iterator of the most strange construction.
>

Looks fine to me. I'll pick up this after validating with batch buffer scan on.

Thanks.

> Fixes: be1da7070aea ("drm/i915/gvt: vGPU command scanner")
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Zhenyu Wang <zhenyuw at linux.intel.com>
> Cc: Zhi Wang <zhi.a.wang at intel.com>
> Cc: Yulei Zhang <yulei.zhang at intel.com>
> Cc: <drm-intel-fixes at lists.freedesktop.org> # v4.10-rc1+
> ---
>  drivers/gpu/drm/i915/gvt/execlist.c  | 64 ++++++++++--------------------------
>  drivers/gpu/drm/i915/gvt/scheduler.h |  2 +-
>  2 files changed, 19 insertions(+), 47 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gvt/execlist.c b/drivers/gpu/drm/i915/gvt/execlist.c
> index 9a98553ad742..4b8454b445cd 100644
> --- a/drivers/gpu/drm/i915/gvt/execlist.c
> +++ b/drivers/gpu/drm/i915/gvt/execlist.c
> @@ -364,58 +364,30 @@ static void free_workload(struct intel_vgpu_workload *workload)
>  #define get_desc_from_elsp_dwords(ed, i) \
>  	((struct execlist_ctx_descriptor_format *)&((ed)->data[i * 2]))
>  
> -
> -#define BATCH_BUFFER_ADDR_MASK ((1UL << 32) - (1U << 2))
> -#define BATCH_BUFFER_ADDR_HIGH_MASK ((1UL << 16) - (1U))
> -static int set_gma_to_bb_cmd(struct intel_shadow_bb_entry *entry_obj,
> -			     unsigned long add, int gmadr_bytes)
> -{
> -	if (WARN_ON(gmadr_bytes != 4 && gmadr_bytes != 8))
> -		return -1;
> -
> -	*((u32 *)(entry_obj->bb_start_cmd_va + (1 << 2))) = add &
> -		BATCH_BUFFER_ADDR_MASK;
> -	if (gmadr_bytes == 8) {
> -		*((u32 *)(entry_obj->bb_start_cmd_va + (2 << 2))) =
> -			add & BATCH_BUFFER_ADDR_HIGH_MASK;
> -	}
> -
> -	return 0;
> -}
> -
>  static void prepare_shadow_batch_buffer(struct intel_vgpu_workload *workload)
>  {
> -	int gmadr_bytes = workload->vgpu->gvt->device_info.gmadr_bytes_in_cmd;
> +	const int gmadr_bytes = workload->vgpu->gvt->device_info.gmadr_bytes_in_cmd;
> +	struct intel_shadow_bb_entry *entry_obj;
>  
>  	/* pin the gem object to ggtt */
> -	if (!list_empty(&workload->shadow_bb)) {
> -		struct intel_shadow_bb_entry *entry_obj =
> -			list_first_entry(&workload->shadow_bb,
> -					 struct intel_shadow_bb_entry,
> -					 list);
> -		struct intel_shadow_bb_entry *temp;
> +	list_for_each_entry(entry_obj, &workload->shadow_bb, list) {
> +		struct i915_vma *vma;
>  
> -		list_for_each_entry_safe(entry_obj, temp, &workload->shadow_bb,
> -				list) {
> -			struct i915_vma *vma;
> -
> -			vma = i915_gem_object_ggtt_pin(entry_obj->obj, NULL, 0,
> -						       4, 0);
> -			if (IS_ERR(vma)) {
> -				gvt_err("Cannot pin\n");
> -				return;
> -			}
> -
> -			/* FIXME: we are not tracking our pinned VMA leaving it
> -			 * up to the core to fix up the stray pin_count upon
> -			 * free.
> -			 */
> -
> -			/* update the relocate gma with shadow batch buffer*/
> -			set_gma_to_bb_cmd(entry_obj,
> -					  i915_ggtt_offset(vma),
> -					  gmadr_bytes);
> +		vma = i915_gem_object_ggtt_pin(entry_obj->obj, NULL, 0, 4, 0);
> +		if (IS_ERR(vma)) {
> +			gvt_err("Cannot pin\n");
> +			return;
>  		}
> +
> +		/* FIXME: we are not tracking our pinned VMA leaving it
> +		 * up to the core to fix up the stray pin_count upon
> +		 * free.
> +		 */
> +
> +		/* update the relocate gma with shadow batch buffer*/
> +		entry_obj->bb_start_cmd_va[1] = i915_ggtt_offset(vma);
> +		if (gmadr_bytes == 8)
> +			entry_obj->bb_start_cmd_va[2] = 0;
>  	}
>  }
>  
> diff --git a/drivers/gpu/drm/i915/gvt/scheduler.h b/drivers/gpu/drm/i915/gvt/scheduler.h
> index 3b30c28bff51..2833dfa8c9ae 100644
> --- a/drivers/gpu/drm/i915/gvt/scheduler.h
> +++ b/drivers/gpu/drm/i915/gvt/scheduler.h
> @@ -113,7 +113,7 @@ struct intel_shadow_bb_entry {
>  	struct drm_i915_gem_object *obj;
>  	void *va;
>  	unsigned long len;
> -	void *bb_start_cmd_va;
> +	u32 *bb_start_cmd_va;
>  };
>  
>  #define workload_q_head(vgpu, ring_id) \
> -- 
> 2.11.0
> 

-- 
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: 163 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/intel-gfx/attachments/20170109/9f98056d/attachment.sig>


More information about the Intel-gfx mailing list