On Mon, 4 Dec 2023 18:33:00 +0100 Boris Brezillon <boris.brezillon@xxxxxxxxxxxxx> wrote: > +static int panthor_gpuva_sm_step_remap(struct drm_gpuva_op *op, > + void *priv) > +{ > + struct panthor_vma *unmap_vma = container_of(op->remap.unmap->va, struct panthor_vma, base); > + struct panthor_vm *vm = priv; > + struct panthor_vm_op_ctx *op_ctx = vm->op_ctx; > + struct drm_gpuva *prev_va = NULL, *next_va = NULL; > + u64 unmap_start, unmap_range; > + int ret; > + > + drm_gpuva_op_remap_to_unmap_range(&op->remap, &unmap_start, &unmap_range); > + ret = panthor_vm_unmap_pages(vm, unmap_start, unmap_range); > + if (ret) > + return ret; > + > + if (op->remap.prev) { > + panthor_vma_init(op_ctx->map.prev_vma, unmap_vma->flags); > + prev_va = &op_ctx->map.prev_vma->base; > + } > + > + if (op->remap.next) { > + panthor_vma_init(op_ctx->map.next_vma, unmap_vma->flags); > + next_va = &op_ctx->map.next_vma->base; > + } > + > + drm_gpuva_remap(prev_va, next_va, &op->remap); > + > + if (prev_va) { > + panthor_vma_link(vm, op_ctx->map.prev_vma, op->remap.unmap->va->vm_bo); panthor_vma_link() transfers the vm_bo ownership to the vma object, we need to take a reference if we want to keep vm_bo's refcount balanced. > + op_ctx->map.prev_vma = NULL; > + } > + > + if (next_va) { > + panthor_vma_link(vm, op_ctx->map.next_vma, op->remap.unmap->va->vm_bo); > + op_ctx->map.next_vma = NULL; > + } > + > + panthor_vma_unlink(vm, unmap_vma); > + return 0; > +}