Handle the special case of a MAP op simply updating the va flags by detecting the special case, and skip pgtable updates.
Signed-off-by: Rob Clark <robin.cl...@oss.qualcomm.com> --- drivers/gpu/drm/msm/msm_gem_vma.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_gem_vma.c b/drivers/gpu/drm/msm/msm_gem_vma.c index dc54c693b28d..d4b1cfb3aa03 100644 --- a/drivers/gpu/drm/msm/msm_gem_vma.c +++ b/drivers/gpu/drm/msm/msm_gem_vma.c @@ -519,9 +519,10 @@ msm_gem_vm_sm_step_map(struct drm_gpuva_op *op, void *arg) } static int -msm_gem_vm_sm_step_remap(struct drm_gpuva_op *op, void *arg) +msm_gem_vm_sm_step_remap(struct drm_gpuva_op *op, void *_arg) { - struct msm_vm_bind_job *job = ((struct op_arg *)arg)->job; + struct op_arg *arg = _arg; + struct msm_vm_bind_job *job = arg->job; struct drm_gpuvm *vm = job->vm; struct drm_gpuva *orig_vma = op->remap.unmap->va; struct drm_gpuva *prev_vma = NULL, *next_vma = NULL; @@ -529,6 +530,18 @@ msm_gem_vm_sm_step_remap(struct drm_gpuva_op *op, void *arg) bool mapped = to_msm_vma(orig_vma)->mapped; unsigned flags; + /* Special case for in-place updates: */ + if (op->remap.unmap->keep && arg->flags && + op->remap.next && !op->remap.prev && + (orig_vma->gem.obj == op->remap.next->gem.obj) && + (orig_vma->gem.offset == op->remap.next->gem.offset) && + (orig_vma->va.addr == op->remap.next->va.addr) && + (orig_vma->va.range == op->remap.next->va.range)) { + /* Only flags are changing, so update that in-place: */ + unsigned orig_flags = orig_vma->flags & (DRM_GPUVA_USERBITS - 1); + orig_vma->flags |= orig_flags | arg->flags; + } + vm_dbg("orig_vma: %p:%p:%p: %016llx %016llx", vm, orig_vma, orig_vma->gem.obj, orig_vma->va.addr, orig_vma->va.range); -- 2.50.1