drm/i915: Pull unpin map into vma release
authorChris Wilson <chris@chris-wilson.co.uk>
Sat, 21 Jul 2018 12:50:37 +0000 (13:50 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 24 Jul 2018 08:55:12 +0000 (09:55 +0100)
A reasonably common operation is to pin the map of the vma alongside the
vma itself for the lifetime of the vma, and so release both pins at the
same time as destroying the vma. It is common enough to pull into the
release function, making that central function more attractive to a
couple of other callsites.

The continual ulterior motive is to sweep over errors on module load
aborting...

Testcase: igt/drv_module_reload/basic-reload-inject
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Michał Winiarski <michal.winiarski@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: Michał Winiarski <michal.winiarski@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180721125037.20127-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_perf.c
drivers/gpu/drm/i915/i915_vma.c
drivers/gpu/drm/i915/i915_vma.h
drivers/gpu/drm/i915/intel_engine_cs.c
drivers/gpu/drm/i915/intel_guc.c
drivers/gpu/drm/i915/intel_guc_ads.c
drivers/gpu/drm/i915/intel_guc_ct.c
drivers/gpu/drm/i915/intel_guc_log.c
drivers/gpu/drm/i915/intel_guc_submission.c
drivers/gpu/drm/i915/intel_lrc.c

index 6bf10952c7240363fdcd2df907979ef9aef0d247..0376338d1f8d90978fd7674bcd9f0b22d7fff5d2 100644 (file)
@@ -1338,14 +1338,12 @@ free_oa_buffer(struct drm_i915_private *i915)
 {
        mutex_lock(&i915->drm.struct_mutex);
 
-       i915_gem_object_unpin_map(i915->perf.oa.oa_buffer.vma->obj);
-       i915_vma_unpin(i915->perf.oa.oa_buffer.vma);
-       i915_gem_object_put(i915->perf.oa.oa_buffer.vma->obj);
-
-       i915->perf.oa.oa_buffer.vma = NULL;
-       i915->perf.oa.oa_buffer.vaddr = NULL;
+       i915_vma_unpin_and_release(&i915->perf.oa.oa_buffer.vma,
+                                  I915_VMA_RELEASE_MAP);
 
        mutex_unlock(&i915->drm.struct_mutex);
+
+       i915->perf.oa.oa_buffer.vaddr = NULL;
 }
 
 static void i915_oa_stream_destroy(struct i915_perf_stream *stream)
index 11d834f942205f37c10c1a95a345b8908cb3411f..274fd2a7bcb66ad7fec27adc93407c93b145183b 100644 (file)
@@ -406,7 +406,7 @@ void i915_vma_unpin_iomap(struct i915_vma *vma)
        i915_vma_unpin(vma);
 }
 
-void i915_vma_unpin_and_release(struct i915_vma **p_vma)
+void i915_vma_unpin_and_release(struct i915_vma **p_vma, unsigned int flags)
 {
        struct i915_vma *vma;
        struct drm_i915_gem_object *obj;
@@ -421,6 +421,9 @@ void i915_vma_unpin_and_release(struct i915_vma **p_vma)
        i915_vma_unpin(vma);
        i915_vma_close(vma);
 
+       if (flags & I915_VMA_RELEASE_MAP)
+               i915_gem_object_unpin_map(obj);
+
        __i915_gem_object_release_unless_active(obj);
 }
 
index f06d663771070a66cb3df27f81d7f58298bb3708..af5296b015f5356df6cf24b7bb4be6859831b037 100644 (file)
@@ -138,7 +138,8 @@ i915_vma_instance(struct drm_i915_gem_object *obj,
                  struct i915_address_space *vm,
                  const struct i915_ggtt_view *view);
 
-void i915_vma_unpin_and_release(struct i915_vma **p_vma);
+void i915_vma_unpin_and_release(struct i915_vma **p_vma, unsigned int flags);
+#define I915_VMA_RELEASE_MAP BIT(0)
 
 static inline bool i915_vma_is_active(struct i915_vma *vma)
 {
index 2d1952849d69ffec45b64360cc7d1baf78e0b0ba..734a789688da0be757673e288ba3ccff3c9895c5 100644 (file)
@@ -527,7 +527,7 @@ err_unref:
 
 void intel_engine_cleanup_scratch(struct intel_engine_cs *engine)
 {
-       i915_vma_unpin_and_release(&engine->scratch);
+       i915_vma_unpin_and_release(&engine->scratch, 0);
 }
 
 static void cleanup_phys_status_page(struct intel_engine_cs *engine)
@@ -543,20 +543,8 @@ static void cleanup_phys_status_page(struct intel_engine_cs *engine)
 
 static void cleanup_status_page(struct intel_engine_cs *engine)
 {
-       struct i915_vma *vma;
-       struct drm_i915_gem_object *obj;
-
-       vma = fetch_and_zero(&engine->status_page.vma);
-       if (!vma)
-               return;
-
-       obj = vma->obj;
-
-       i915_vma_unpin(vma);
-       i915_vma_close(vma);
-
-       i915_gem_object_unpin_map(obj);
-       __i915_gem_object_release_unless_active(obj);
+       i915_vma_unpin_and_release(&engine->status_page.vma,
+                                  I915_VMA_RELEASE_MAP);
 }
 
 static int init_status_page(struct intel_engine_cs *engine)
index 560c7406ae406e5df1d2b083024ea7ae983db4e8..846d693ecb53cd059afb949d40c53611f779d880 100644 (file)
@@ -170,7 +170,7 @@ static int guc_shared_data_create(struct intel_guc *guc)
 
        vaddr = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
        if (IS_ERR(vaddr)) {
-               i915_vma_unpin_and_release(&vma);
+               i915_vma_unpin_and_release(&vma, 0);
                return PTR_ERR(vaddr);
        }
 
@@ -182,8 +182,7 @@ static int guc_shared_data_create(struct intel_guc *guc)
 
 static void guc_shared_data_destroy(struct intel_guc *guc)
 {
-       i915_gem_object_unpin_map(guc->shared_data->obj);
-       i915_vma_unpin_and_release(&guc->shared_data);
+       i915_vma_unpin_and_release(&guc->shared_data, I915_VMA_RELEASE_MAP);
 }
 
 int intel_guc_init(struct intel_guc *guc)
index dcaa3fb71765e2f6f2a7b02b00768dfe97ea3c9a..f0db62887f5098f3a72433b6f838cb0e2744babd 100644 (file)
@@ -148,5 +148,5 @@ int intel_guc_ads_create(struct intel_guc *guc)
 
 void intel_guc_ads_destroy(struct intel_guc *guc)
 {
-       i915_vma_unpin_and_release(&guc->ads_vma);
+       i915_vma_unpin_and_release(&guc->ads_vma, 0);
 }
index 371b6005954aab09b69c15704343153c73e8d5a5..a52883e9146f273237bf9c259c3bcfa6f224a3ea 100644 (file)
@@ -204,7 +204,7 @@ static int ctch_init(struct intel_guc *guc,
        return 0;
 
 err_vma:
-       i915_vma_unpin_and_release(&ctch->vma);
+       i915_vma_unpin_and_release(&ctch->vma, 0);
 err_out:
        CT_DEBUG_DRIVER("CT: channel %d initialization failed; err=%d\n",
                        ctch->owner, err);
@@ -214,10 +214,7 @@ err_out:
 static void ctch_fini(struct intel_guc *guc,
                      struct intel_guc_ct_channel *ctch)
 {
-       GEM_BUG_ON(!ctch->vma);
-
-       i915_gem_object_unpin_map(ctch->vma->obj);
-       i915_vma_unpin_and_release(&ctch->vma);
+       i915_vma_unpin_and_release(&ctch->vma, I915_VMA_RELEASE_MAP);
 }
 
 static int ctch_open(struct intel_guc *guc,
index 6da61a71d28f69835c589bbdf5acc48f19b69197..d3ebdbc0182e745b0d94611b862a6f03afbb8550 100644 (file)
@@ -498,7 +498,7 @@ err:
 
 void intel_guc_log_destroy(struct intel_guc_log *log)
 {
-       i915_vma_unpin_and_release(&log->vma);
+       i915_vma_unpin_and_release(&log->vma, 0);
 }
 
 int intel_guc_log_set_level(struct intel_guc_log *log, u32 level)
index 4aa5e6463e7b70d47fa459b072e6d93e670f9b25..195adbd0ebf7d3a580990c779cacd966d2257e53 100644 (file)
@@ -317,7 +317,7 @@ static int guc_stage_desc_pool_create(struct intel_guc *guc)
 
        vaddr = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
        if (IS_ERR(vaddr)) {
-               i915_vma_unpin_and_release(&vma);
+               i915_vma_unpin_and_release(&vma, 0);
                return PTR_ERR(vaddr);
        }
 
@@ -331,8 +331,7 @@ static int guc_stage_desc_pool_create(struct intel_guc *guc)
 static void guc_stage_desc_pool_destroy(struct intel_guc *guc)
 {
        ida_destroy(&guc->stage_ids);
-       i915_gem_object_unpin_map(guc->stage_desc_pool->obj);
-       i915_vma_unpin_and_release(&guc->stage_desc_pool);
+       i915_vma_unpin_and_release(&guc->stage_desc_pool, I915_VMA_RELEASE_MAP);
 }
 
 /*
@@ -1008,7 +1007,7 @@ guc_client_alloc(struct drm_i915_private *dev_priv,
 err_vaddr:
        i915_gem_object_unpin_map(client->vma->obj);
 err_vma:
-       i915_vma_unpin_and_release(&client->vma);
+       i915_vma_unpin_and_release(&client->vma, 0);
 err_id:
        ida_simple_remove(&guc->stage_ids, client->stage_id);
 err_client:
@@ -1020,8 +1019,7 @@ static void guc_client_free(struct intel_guc_client *client)
 {
        unreserve_doorbell(client);
        guc_stage_desc_fini(client->guc, client);
-       i915_gem_object_unpin_map(client->vma->obj);
-       i915_vma_unpin_and_release(&client->vma);
+       i915_vma_unpin_and_release(&client->vma, I915_VMA_RELEASE_MAP);
        ida_simple_remove(&client->guc->stage_ids, client->stage_id);
        kfree(client);
 }
index 174479232e94312bc232a7792ded191e960fee49..c52ef2817c968bef8c5588cac32fe79599349150 100644 (file)
@@ -1657,7 +1657,7 @@ err:
 
 static void lrc_destroy_wa_ctx(struct intel_engine_cs *engine)
 {
-       i915_vma_unpin_and_release(&engine->wa_ctx.vma);
+       i915_vma_unpin_and_release(&engine->wa_ctx.vma, 0);
 }
 
 typedef u32 *(*wa_bb_func_t)(struct intel_engine_cs *engine, u32 *batch);