Original idea is from Monk which only update spm vmid
at first time which can release the frequent r/w register
burden under virtualization.

v2: set spm_vmid_updated to false when job timedout

Signed-off-by: Yintian Tao <yt...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 3 +++
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c  | 8 ++++++--
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h  | 2 ++
 3 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
index 35c381ec0423..3bf59dfef05d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
@@ -50,6 +50,9 @@ static void amdgpu_job_timedout(struct drm_sched_job *s_job)
        DRM_ERROR("Process information: process %s pid %d thread %s pid %d\n",
                  ti.process_name, ti.tgid, ti.task_name, ti.pid);
 
+       if (job->vm)
+               job->vm->spm_vmid_updated = false;
+
        if (amdgpu_device_should_recover_gpu(ring->adev)) {
                amdgpu_device_gpu_recover(ring->adev, job);
        } else {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index accbb34ea670..636a6d23fd96 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -1080,11 +1080,14 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct 
amdgpu_job *job,
        struct dma_fence *fence = NULL;
        bool pasid_mapping_needed = false;
        unsigned patch_offset = 0;
-       bool update_spm_vmid_needed = (job->vm && 
(job->vm->reserved_vmid[vmhub] != NULL));
+       bool update_spm_vmid_needed = (job->vm && 
(job->vm->reserved_vmid[vmhub] != NULL) &&
+                                      !job->vm->spm_vmid_updated);
        int r;
 
-       if (update_spm_vmid_needed && adev->gfx.rlc.funcs->update_spm_vmid)
+       if (update_spm_vmid_needed && adev->gfx.rlc.funcs->update_spm_vmid) {
                adev->gfx.rlc.funcs->update_spm_vmid(adev, job->vmid);
+               job->vm->spm_vmid_updated = true;
+       }
 
        if (amdgpu_vmid_had_gpu_reset(adev, id)) {
                gds_switch_needed = true;
@@ -2797,6 +2800,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct 
amdgpu_vm *vm,
        int r, i;
 
        vm->va = RB_ROOT_CACHED;
+       vm->spm_vmid_updated = false;
        for (i = 0; i < AMDGPU_MAX_VMHUBS; i++)
                vm->reserved_vmid[i] = NULL;
        INIT_LIST_HEAD(&vm->evicted);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
index ea771d84bf2b..02409e0ecf2c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -319,6 +319,8 @@ struct amdgpu_vm {
        bool                    bulk_moveable;
        /* Flag to indicate if VM is used for compute */
        bool                    is_compute_context;
+       /* flag to represent whether spm vmid has been updated */
+       bool                    spm_vmid_updated;
 };
 
 struct amdgpu_vm_manager {
-- 
2.17.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to