On 13-10-2026 01:01 pm, Christian König wrote:
On 10/12/26 11:24, Sunil Khatri wrote:
The SPM reserved VMID is fixed now, so retargeting RLC_SPM_VMID to
job->vmid on every submission is dead code. Remove
job->spm_update_needed and the update_spm_vmid() calls in
amdgpu_vm_flush() and amdgpu_ib_schedule().

Signed-off-by: Sunil Khatri <[email protected]>
Suggested-by: Christian König <[email protected]>
Reviewed-by: Christian König <[email protected]>

We should also have another patch which removes the ring parameter from 
adev->gfx.rlc.funcs->update_spm_vmid().
Sure... There is another patch that i kept for the end and will send in the updated v3. This is to set the pagetable for vmid15.


What's left is comming up with an SPM test case and eventually getting it to 
work with user queues (shouldn't be to hard).

sure, here i might need some more input since i am really clear about the exact usecase or how to validate it..

Regards
Sunil Khatri


Regards,
Christian.

---
  drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c  |  7 +------
  drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c |  1 -
  drivers/gpu/drm/amd/amdgpu/amdgpu_job.h |  1 -
  drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c  | 15 +--------------
  drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h  |  3 +--
  5 files changed, 3 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
index 0f8b097001e3c..f98a7c6797b3c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
@@ -126,7 +126,6 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, struct 
amdgpu_job *job,
        struct amdgpu_fence *af;
        struct amdgpu_fence *vm_af;
        bool need_ctx_switch;
-       bool emit_spm_needed = false;
        bool emit_gds_needed = false;
        uint64_t fence_ctx;
        uint32_t status = 0, alloc_size;
@@ -195,8 +194,7 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, struct 
amdgpu_job *job,
/* VM sequence */
        vm_af->ib_wptr = ring->wptr;
-       amdgpu_vm_flush(ring, job, &need_pipe_sync, &emit_spm_needed,
-                       &emit_gds_needed);
+       amdgpu_vm_flush(ring, job, &need_pipe_sync, &emit_gds_needed);
        vm_af->ib_dw_size =
                amdgpu_ring_get_dw_distance(ring, vm_af->ib_wptr, ring->wptr);
@@ -211,9 +209,6 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, struct amdgpu_job *job,
        if (need_pipe_sync)
                amdgpu_ring_emit_pipeline_sync(ring);
- if (emit_spm_needed)
-               adev->gfx.rlc.funcs->update_spm_vmid(adev, ring->xcc_id, ring, 
job->vmid);
-
        if (emit_gds_needed)
                amdgpu_ring_emit_gds_switch(ring, job->vmid, job->gds_base,
                                            job->gds_size, job->gws_base,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
index 3617de2368d5a..85ffa2d28c3fa 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
@@ -372,7 +372,6 @@ static int amdgpu_vmid_grab_reserved(struct amdgpu_vm *vm,
                return r;
job->vm_needs_flush = needs_flush;
-       job->spm_update_needed = true;
        return 0;
  }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
index ae569b4497f6a..f6577f82e6b93 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
@@ -75,7 +75,6 @@ struct amdgpu_job {
        uint32_t                preemption_status;
        bool                    vm_needs_flush;
        bool                    gds_switch_needed;
-       bool                    spm_update_needed;
        uint64_t                vm_pd_addr;
        unsigned                vmid;
        unsigned                pasid;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 7d3659ef11e53..de992405ed718 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -766,14 +766,12 @@ bool amdgpu_vm_need_pipeline_sync(struct amdgpu_ring 
*ring,
   * @ring: ring to use for flush
   * @job:  related job
   * @need_pipe_sync: is pipe sync needed
- * @emit_spm_needed: does the caller need to emit spm
   * @emit_gds_needed: does the caller need to emit gds
   *
   * Emit a VM flush when it is necessary.
   */
  void amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job,
-                    bool *need_pipe_sync, bool *emit_spm_needed,
-                    bool *emit_gds_needed)
+                    bool *need_pipe_sync, bool *emit_gds_needed)
  {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_isolation *isolation =
@@ -782,8 +780,6 @@ void amdgpu_vm_flush(struct amdgpu_ring *ring, struct 
amdgpu_job *job,
        unsigned vmhub = ring->vm_hub;
        struct amdgpu_kq_vmid_mgr *id_mgr = &adev->vm_manager.id_mgr[vmhub];
        struct amdgpu_vmid *id = &id_mgr->ids[job->vmid];
-       bool spm_update_needed = adev->gfx.rlc.funcs->update_spm_vmid &&
-               job->spm_update_needed;
        bool gds_switch_needed = ring->funcs->emit_gds_switch &&
                job->gds_switch_needed;
        bool vm_flush_needed = job->vm_needs_flush;
@@ -797,7 +793,6 @@ void amdgpu_vm_flush(struct amdgpu_ring *ring, struct 
amdgpu_job *job,
                gds_switch_needed = true;
                vm_flush_needed = true;
                pasid_mapping_needed = true;
-               spm_update_needed = true;
        }
mutex_lock(&id_mgr->lock);
@@ -807,7 +802,6 @@ void amdgpu_vm_flush(struct amdgpu_ring *ring, struct 
amdgpu_job *job,
        mutex_unlock(&id_mgr->lock);
gds_switch_needed &= !!ring->funcs->emit_gds_switch;
-       spm_update_needed &= !!adev->gfx.rlc.funcs->update_spm_vmid;
        vm_flush_needed &= !!ring->funcs->emit_vm_flush  &&
                        job->vm_pd_addr != AMDGPU_BO_INVALID_OFFSET;
        pasid_mapping_needed &= adev->gmc.gmc_funcs->emit_pasid_mapping &&
@@ -821,10 +815,6 @@ void amdgpu_vm_flush(struct amdgpu_ring *ring, struct 
amdgpu_job *job,
        emit_fence = vm_flush_needed || pasid_mapping_needed ||
                cleaner_shader_needed;
- *emit_spm_needed = spm_update_needed;
-       if (spm_update_needed && emit_fence)
-               *emit_spm_needed = false;
-
        *emit_gds_needed = gds_switch_needed;
        if (gds_switch_needed && emit_fence)
                *emit_gds_needed = false;
@@ -864,9 +854,6 @@ void amdgpu_vm_flush(struct amdgpu_ring *ring, struct 
amdgpu_job *job,
        if (pasid_mapping_needed)
                amdgpu_gmc_emit_pasid_mapping(ring, job->vmid, job->pasid);
- if (spm_update_needed)
-               adev->gfx.rlc.funcs->update_spm_vmid(adev, ring->xcc_id, ring, 
job->vmid);
-
        if (gds_switch_needed)
                amdgpu_ring_emit_gds_switch(ring, job->vmid, job->gds_base,
                                                    job->gds_size, 
job->gws_base,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
index ddcdc7256ef07..b8aa45db1d844 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -448,8 +448,7 @@ int amdgpu_vm_validate(struct amdgpu_device *adev, struct 
amdgpu_vm *vm,
                       int (*callback)(void *p, struct amdgpu_bo *bo),
                       void *param);
  void amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job,
-                    bool *need_pipe_sync, bool *emit_spm_needed,
-                    bool *emit_gds_needed);
+                    bool *need_pipe_sync, bool *emit_gds_needed);
  int amdgpu_vm_update_pdes(struct amdgpu_device *adev,
                          struct amdgpu_vm *vm, bool immediate);
  int amdgpu_vm_clear_freed(struct amdgpu_device *adev,

Reply via email to