Explorar el Código

drm/i915/gvt: Use common mapping routines for shadow_bb object

We have the ability to map an object, so use it rather than opencode it
badly. Note that the object remains permanently pinned, this is poor
practise.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Chris Wilson hace 8 años
padre
commit
a28615041e
Se han modificado 2 ficheros con 7 adiciones y 16 borrados
  1. 6 15
      drivers/gpu/drm/i915/gvt/cmd_parser.c
  2. 1 1
      drivers/gpu/drm/i915/gvt/execlist.c

+ 6 - 15
drivers/gpu/drm/i915/gvt/cmd_parser.c

@@ -1650,18 +1650,10 @@ static int perform_bb_shadow(struct parser_exec_state *s)
 	entry_obj->len = bb_size;
 	entry_obj->len = bb_size;
 	INIT_LIST_HEAD(&entry_obj->list);
 	INIT_LIST_HEAD(&entry_obj->list);
 
 
-	ret = i915_gem_object_get_pages(entry_obj->obj);
-	if (ret)
+	dst = i915_gem_object_pin_map(entry_obj->obj, I915_MAP_WB);
+	if (IS_ERR(dst)) {
+		ret = PTR_ERR(dst);
 		goto put_obj;
 		goto put_obj;
-
-	i915_gem_object_pin_pages(entry_obj->obj);
-
-	/* get the va of the shadow batch buffer */
-	dst = (void *)vmap_batch(entry_obj->obj, 0, bb_size);
-	if (!dst) {
-		gvt_err("failed to vmap shadow batch\n");
-		ret = -ENOMEM;
-		goto unpin_src;
 	}
 	}
 
 
 	ret = i915_gem_object_set_to_cpu_domain(entry_obj->obj, false);
 	ret = i915_gem_object_set_to_cpu_domain(entry_obj->obj, false);
@@ -1675,7 +1667,8 @@ static int perform_bb_shadow(struct parser_exec_state *s)
 
 
 	/* copy batch buffer to shadow batch buffer*/
 	/* copy batch buffer to shadow batch buffer*/
 	ret = copy_gma_to_hva(s->vgpu, s->vgpu->gtt.ggtt_mm,
 	ret = copy_gma_to_hva(s->vgpu, s->vgpu->gtt.ggtt_mm,
-				gma, gma + bb_size, dst);
+			      gma, gma + bb_size,
+			      dst);
 	if (ret) {
 	if (ret) {
 		gvt_err("fail to copy guest ring buffer\n");
 		gvt_err("fail to copy guest ring buffer\n");
 		goto unmap_src;
 		goto unmap_src;
@@ -1696,9 +1689,7 @@ static int perform_bb_shadow(struct parser_exec_state *s)
 	return 0;
 	return 0;
 
 
 unmap_src:
 unmap_src:
-	vunmap(dst);
-unpin_src:
-	i915_gem_object_unpin_pages(entry_obj->obj);
+	i915_gem_object_unpin_map(entry_obj->obj);
 put_obj:
 put_obj:
 	i915_gem_object_put(entry_obj->obj);
 	i915_gem_object_put(entry_obj->obj);
 free_entry:
 free_entry:

+ 1 - 1
drivers/gpu/drm/i915/gvt/execlist.c

@@ -505,8 +505,8 @@ static void release_shadow_batch_buffer(struct intel_vgpu_workload *workload)
 
 
 		list_for_each_entry_safe(entry_obj, temp, &workload->shadow_bb,
 		list_for_each_entry_safe(entry_obj, temp, &workload->shadow_bb,
 					 list) {
 					 list) {
+			i915_gem_object_unpin_map(entry_obj->obj);
 			i915_gem_object_put(entry_obj->obj);
 			i915_gem_object_put(entry_obj->obj);
-			kvfree(entry_obj->va);
 			list_del(&entry_obj->list);
 			list_del(&entry_obj->list);
 			kfree(entry_obj);
 			kfree(entry_obj);
 		}
 		}