drm/amdgpu: add new amdgpu_vm_bo_trace_cs() function v2
authorChristian König <christian.koenig@amd.com>
Fri, 27 Jul 2018 14:56:34 +0000 (16:56 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 31 Jul 2018 21:58:17 +0000 (16:58 -0500)
This allows us to trace all VM ranges which should be valid inside a CS.

v2: dump mappings without BO as well

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
Reviewed-and-tested-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com> (v1)
Reviewed-by: Huang Rui <ray.huang@amd.com> (v1)
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h

index d41cea78e4aa7e565ed8f2a43ec65248ee39e681..0295666968dac7a84af0d3b687ca1ef7254dfa97 100644 (file)
@@ -1223,6 +1223,7 @@ static void amdgpu_cs_post_dependencies(struct amdgpu_cs_parser *p)
 static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
                            union drm_amdgpu_cs *cs)
 {
+       struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
        struct amdgpu_ring *ring = p->ring;
        struct drm_sched_entity *entity = &p->ctx->rings[ring->idx].entity;
        enum drm_sched_priority priority;
@@ -1275,6 +1276,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
        amdgpu_job_free_resources(job);
 
        trace_amdgpu_cs_ioctl(job);
+       amdgpu_vm_bo_trace_cs(&fpriv->vm, &p->ticket);
        priority = job->base.s_priority;
        drm_sched_entity_push_job(&job->base, entity);
 
index 11f262f1520074837458868c91dff59d878da90c..7206a0025b17a1ded6fbe7003dc72396653e62d3 100644 (file)
@@ -314,6 +314,11 @@ DEFINE_EVENT(amdgpu_vm_mapping, amdgpu_vm_bo_mapping,
            TP_ARGS(mapping)
 );
 
+DEFINE_EVENT(amdgpu_vm_mapping, amdgpu_vm_bo_cs,
+           TP_PROTO(struct amdgpu_bo_va_mapping *mapping),
+           TP_ARGS(mapping)
+);
+
 TRACE_EVENT(amdgpu_vm_set_ptes,
            TP_PROTO(uint64_t pe, uint64_t addr, unsigned count,
                     uint32_t incr, uint64_t flags),
index 5d7d7900ccabbb5e6dc56e08b9261ec24843dccf..015613b4f98b67c6eb1135561f5b78b9aac453f5 100644 (file)
@@ -2343,6 +2343,35 @@ struct amdgpu_bo_va_mapping *amdgpu_vm_bo_lookup_mapping(struct amdgpu_vm *vm,
        return amdgpu_vm_it_iter_first(&vm->va, addr, addr);
 }
 
+/**
+ * amdgpu_vm_bo_trace_cs - trace all reserved mappings
+ *
+ * @vm: the requested vm
+ * @ticket: CS ticket
+ *
+ * Trace all mappings of BOs reserved during a command submission.
+ */
+void amdgpu_vm_bo_trace_cs(struct amdgpu_vm *vm, struct ww_acquire_ctx *ticket)
+{
+       struct amdgpu_bo_va_mapping *mapping;
+
+       if (!trace_amdgpu_vm_bo_cs_enabled())
+               return;
+
+       for (mapping = amdgpu_vm_it_iter_first(&vm->va, 0, U64_MAX); mapping;
+            mapping = amdgpu_vm_it_iter_next(mapping, 0, U64_MAX)) {
+               if (mapping->bo_va && mapping->bo_va->base.bo) {
+                       struct amdgpu_bo *bo;
+
+                       bo = mapping->bo_va->base.bo;
+                       if (READ_ONCE(bo->tbo.resv->lock.ctx) != ticket)
+                               continue;
+               }
+
+               trace_amdgpu_vm_bo_cs(mapping);
+       }
+}
+
 /**
  * amdgpu_vm_bo_rmv - remove a bo to a specific vm
  *
index d416f895233d3b89dd0f535ba61006412b30bbb1..67a15d439ac006f97b48ffe7e74544d6688bf452 100644 (file)
@@ -318,6 +318,7 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev,
                                uint64_t saddr, uint64_t size);
 struct amdgpu_bo_va_mapping *amdgpu_vm_bo_lookup_mapping(struct amdgpu_vm *vm,
                                                         uint64_t addr);
+void amdgpu_vm_bo_trace_cs(struct amdgpu_vm *vm, struct ww_acquire_ctx *ticket);
 void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,
                      struct amdgpu_bo_va *bo_va);
 void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t vm_size,