OSDN Git Service

drm/i915/gvt: Factor out intel_vgpu_{get, put}_ppgtt_mm interface
authorChangbin Du <changbin.du@intel.com>
Tue, 30 Jan 2018 11:19:46 +0000 (19:19 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Tue, 6 Mar 2018 05:19:16 +0000 (13:19 +0800)
Factor out these two interfaces so we can kill some duplicated code in
scheduler.c.

v2:
  - rename to intel_vgpu_{get,put}_ppgtt_mm
  - refine handle_g2v_notification

Signed-off-by: Changbin Du <changbin.du@intel.com>
Reviewed-by: Zhi Wang <zhi.a.wang@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
drivers/gpu/drm/i915/gvt/gtt.c
drivers/gpu/drm/i915/gvt/gtt.h
drivers/gpu/drm/i915/gvt/handlers.c
drivers/gpu/drm/i915/gvt/scheduler.c

index 162daad..a6a84cc 100644 (file)
@@ -2292,19 +2292,17 @@ struct intel_vgpu_mm *intel_vgpu_find_ppgtt_mm(struct intel_vgpu *vgpu,
 }
 
 /**
- * intel_vgpu_g2v_create_ppgtt_mm - create a PPGTT mm object from
- * g2v notification
+ * intel_vgpu_get_ppgtt_mm - get or create a PPGTT mm object.
  * @vgpu: a vGPU
  * @root_entry_type: ppgtt root entry type
  * @pdps: guest pdps
  *
- * This function is used to create a PPGTT mm object from a guest to GVT-g
- * notification.
+ * This function is used to find or create a PPGTT mm object from a guest.
  *
  * Returns:
  * Zero on success, negative error code if failed.
  */
-int intel_vgpu_g2v_create_ppgtt_mm(struct intel_vgpu *vgpu,
+struct intel_vgpu_mm *intel_vgpu_get_ppgtt_mm(struct intel_vgpu *vgpu,
                intel_gvt_gtt_type_t root_entry_type, u64 pdps[])
 {
        struct intel_vgpu_mm *mm;
@@ -2314,28 +2312,23 @@ int intel_vgpu_g2v_create_ppgtt_mm(struct intel_vgpu *vgpu,
                intel_vgpu_mm_get(mm);
        } else {
                mm = intel_vgpu_create_ppgtt_mm(vgpu, root_entry_type, pdps);
-               if (IS_ERR(mm)) {
+               if (IS_ERR(mm))
                        gvt_vgpu_err("fail to create mm\n");
-                       return PTR_ERR(mm);
-               }
        }
-       return 0;
+       return mm;
 }
 
 /**
- * intel_vgpu_g2v_destroy_ppgtt_mm - destroy a PPGTT mm object from
- * g2v notification
+ * intel_vgpu_put_ppgtt_mm - find and put a PPGTT mm object.
  * @vgpu: a vGPU
  * @pdps: guest pdps
  *
- * This function is used to create a PPGTT mm object from a guest to GVT-g
- * notification.
+ * This function is used to find a PPGTT mm object from a guest and destroy it.
  *
  * Returns:
  * Zero on success, negative error code if failed.
  */
-int intel_vgpu_g2v_destroy_ppgtt_mm(struct intel_vgpu *vgpu,
-               u64 pdps[])
+int intel_vgpu_put_ppgtt_mm(struct intel_vgpu *vgpu, u64 pdps[])
 {
        struct intel_vgpu_mm *mm;
 
index 3bef5c9..652a76e 100644 (file)
@@ -275,10 +275,10 @@ unsigned long intel_vgpu_gma_to_gpa(struct intel_vgpu_mm *mm,
 struct intel_vgpu_mm *intel_vgpu_find_ppgtt_mm(struct intel_vgpu *vgpu,
                u64 pdps[]);
 
-int intel_vgpu_g2v_create_ppgtt_mm(struct intel_vgpu *vgpu,
+struct intel_vgpu_mm *intel_vgpu_get_ppgtt_mm(struct intel_vgpu *vgpu,
                intel_gvt_gtt_type_t root_entry_type, u64 pdps[]);
 
-int intel_vgpu_g2v_destroy_ppgtt_mm(struct intel_vgpu *vgpu, u64 pdps[]);
+int intel_vgpu_put_ppgtt_mm(struct intel_vgpu *vgpu, u64 pdps[]);
 
 int intel_vgpu_emulate_ggtt_mmio_read(struct intel_vgpu *vgpu,
        unsigned int off, void *p_data, unsigned int bytes);
index c51a5bd..fbb908e 100644 (file)
@@ -1139,28 +1139,21 @@ static int pvinfo_mmio_read(struct intel_vgpu *vgpu, unsigned int offset,
 
 static int handle_g2v_notification(struct intel_vgpu *vgpu, int notification)
 {
+       intel_gvt_gtt_type_t root_entry_type = GTT_TYPE_PPGTT_ROOT_L4_ENTRY;
+       struct intel_vgpu_mm *mm;
        u64 *pdps;
-       int ret = 0;
 
        pdps = (u64 *)&vgpu_vreg64_t(vgpu, vgtif_reg(pdp[0]));
 
        switch (notification) {
        case VGT_G2V_PPGTT_L3_PAGE_TABLE_CREATE:
-               ret = intel_vgpu_g2v_create_ppgtt_mm(vgpu,
-                               GTT_TYPE_PPGTT_ROOT_L3_ENTRY,
-                               pdps);
-               break;
-       case VGT_G2V_PPGTT_L3_PAGE_TABLE_DESTROY:
-               ret = intel_vgpu_g2v_destroy_ppgtt_mm(vgpu, pdps);
-               break;
+               root_entry_type = GTT_TYPE_PPGTT_ROOT_L3_ENTRY;
        case VGT_G2V_PPGTT_L4_PAGE_TABLE_CREATE:
-               ret = intel_vgpu_g2v_create_ppgtt_mm(vgpu,
-                               GTT_TYPE_PPGTT_ROOT_L4_ENTRY,
-                               pdps);
-               break;
+               mm = intel_vgpu_get_ppgtt_mm(vgpu, root_entry_type, pdps);
+               return PTR_ERR_OR_ZERO(mm);
+       case VGT_G2V_PPGTT_L3_PAGE_TABLE_DESTROY:
        case VGT_G2V_PPGTT_L4_PAGE_TABLE_DESTROY:
-               ret = intel_vgpu_g2v_destroy_ppgtt_mm(vgpu, pdps);
-               break;
+               return intel_vgpu_put_ppgtt_mm(vgpu, pdps);
        case VGT_G2V_EXECLIST_CONTEXT_CREATE:
        case VGT_G2V_EXECLIST_CONTEXT_DESTROY:
        case 1: /* Remove this in guest driver. */
@@ -1168,7 +1161,7 @@ static int handle_g2v_notification(struct intel_vgpu *vgpu, int notification)
        default:
                gvt_vgpu_err("Invalid PV notification %d\n", notification);
        }
-       return ret;
+       return 0;
 }
 
 static int send_display_ready_uevent(struct intel_vgpu *vgpu, int ready)
index 989304e..f4765ed 100644 (file)
@@ -1198,18 +1198,10 @@ static int prepare_mm(struct intel_vgpu_workload *workload)
 
        read_guest_pdps(workload->vgpu, workload->ring_context_gpa, (void *)pdps);
 
-       mm = intel_vgpu_find_ppgtt_mm(workload->vgpu, pdps);
-       if (mm) {
-               intel_vgpu_mm_get(mm);
-       } else {
-
-               mm = intel_vgpu_create_ppgtt_mm(workload->vgpu, root_entry_type,
-                                               pdps);
-               if (IS_ERR(mm)) {
-                       gvt_vgpu_err("fail to create mm object.\n");
-                       return PTR_ERR(mm);
-               }
-       }
+       mm = intel_vgpu_get_ppgtt_mm(workload->vgpu, root_entry_type, pdps);
+       if (IS_ERR(mm))
+               return PTR_ERR(mm);
+
        workload->shadow_mm = mm;
        return 0;
 }