On Mon,  4 Dec 2023 18:33:00 +0100
Boris Brezillon <boris.brezil...@collabora.com> 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;
> +}

Reply via email to