OSDN Git Service

drm/i915/gvt: Move workload cache init/clean into intel_vgpu_{setup, clean}_submission()
authorZhi Wang <zhi.a.wang@intel.com>
Sun, 10 Sep 2017 12:28:09 +0000 (20:28 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Thu, 16 Nov 2017 03:46:08 +0000 (11:46 +0800)
Move vGPU workload cache initialization/de-initialization into
intel_vgpu_{setup, clean}_submission() since they are not specific to
execlist stuffs.

Signed-off-by: Zhi Wang <zhi.a.wang@intel.com>
drivers/gpu/drm/i915/gvt/execlist.c
drivers/gpu/drm/i915/gvt/scheduler.c

index 9f02072..0ee40a5 100644 (file)
@@ -856,14 +856,12 @@ void intel_vgpu_clean_execlist(struct intel_vgpu *vgpu)
        struct intel_engine_cs *engine;
 
        clean_workloads(vgpu, ALL_ENGINES);
-       kmem_cache_destroy(vgpu->workloads);
 
        for_each_engine(engine, vgpu->gvt->dev_priv, i) {
                kfree(vgpu->reserve_ring_buffer_va[i]);
                vgpu->reserve_ring_buffer_va[i] = NULL;
                vgpu->reserve_ring_buffer_size[i] = 0;
        }
-
 }
 
 #define RESERVE_RING_BUFFER_SIZE               ((1 * PAGE_SIZE)/8)
@@ -872,19 +870,8 @@ int intel_vgpu_init_execlist(struct intel_vgpu *vgpu)
        enum intel_engine_id i;
        struct intel_engine_cs *engine;
 
-       /* each ring has a virtual execlist engine */
-       for_each_engine(engine, vgpu->gvt->dev_priv, i) {
+       for_each_engine(engine, vgpu->gvt->dev_priv, i)
                init_vgpu_execlist(vgpu, i);
-               INIT_LIST_HEAD(&vgpu->workload_q_head[i]);
-       }
-
-       vgpu->workloads = kmem_cache_create("gvt-g_vgpu_workload",
-                       sizeof(struct intel_vgpu_workload), 0,
-                       SLAB_HWCACHE_ALIGN,
-                       NULL);
-
-       if (!vgpu->workloads)
-               return -ENOMEM;
 
        /* each ring has a shadow ring buffer until vgpu destroyed */
        for_each_engine(engine, vgpu->gvt->dev_priv, i) {
index 5913bcb..8195213 100644 (file)
@@ -719,6 +719,7 @@ err:
 void intel_vgpu_clean_submission(struct intel_vgpu *vgpu)
 {
        i915_gem_context_put(vgpu->shadow_ctx);
+       kmem_cache_destroy(vgpu->workloads);
 }
 
 /**
@@ -733,7 +734,9 @@ void intel_vgpu_clean_submission(struct intel_vgpu *vgpu)
  */
 int intel_vgpu_setup_submission(struct intel_vgpu *vgpu)
 {
-       atomic_set(&vgpu->running_workload_num, 0);
+       enum intel_engine_id i;
+       struct intel_engine_cs *engine;
+       int ret;
 
        vgpu->shadow_ctx = i915_gem_context_create_gvt(
                        &vgpu->gvt->dev_priv->drm);
@@ -742,5 +745,24 @@ int intel_vgpu_setup_submission(struct intel_vgpu *vgpu)
 
        bitmap_zero(vgpu->shadow_ctx_desc_updated, I915_NUM_ENGINES);
 
+       vgpu->workloads = kmem_cache_create("gvt-g_vgpu_workload",
+                       sizeof(struct intel_vgpu_workload), 0,
+                       SLAB_HWCACHE_ALIGN,
+                       NULL);
+
+       if (!vgpu->workloads) {
+               ret = -ENOMEM;
+               goto out_shadow_ctx;
+       }
+
+       for_each_engine(engine, vgpu->gvt->dev_priv, i)
+               INIT_LIST_HEAD(&vgpu->workload_q_head[i]);
+
+       atomic_set(&vgpu->running_workload_num, 0);
+
        return 0;
+
+out_shadow_ctx:
+       i915_gem_context_put(vgpu->shadow_ctx);
+       return ret;
 }