[Intel-xe] [PATCH] drm/xe: Only set xe_vma_op.map fields for GPUVA map operations
Welty, Brian
brian.welty at intel.com
Thu Nov 16 19:57:09 UTC 2023
On 11/14/2023 7:15 PM, Matthew Brost wrote:
> XE_VM_BIND_OP_MAP_* IOCTL operations can result in GPUVA unmap, remap,
> or map operations in vm_bind_ioctl_ops_create. The xe_vma_op.map fields
> are blindly set which is incorrect for GPUVA unmap or remap operations.
> Fix this by only setting xe_vma_op.map for GPUVA map operations. Also
> restructure a bit vm_bind_ioctl_ops_create to make the code a bit more
> readable.
>
> Reported-by: Dafna Hirschfeld <dhirschfeld at habana.ai>
> Signec-off-by: Matthew Brost <matthew.brost at intel.com>
Typo in your signed-off !
One comment below.
> ---
> drivers/gpu/drm/xe/xe_vm.c | 59 ++++++++++++--------------------------
> 1 file changed, 18 insertions(+), 41 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
> index d45f4f1d490f..1049869b5a6f 100644
> --- a/drivers/gpu/drm/xe/xe_vm.c
> +++ b/drivers/gpu/drm/xe/xe_vm.c
> @@ -2187,42 +2187,12 @@ vm_bind_ioctl_ops_create(struct xe_vm *vm, struct xe_bo *bo,
Looks like you can trim the arguments to this function....
At a glance, looks like flags, tile_mask, and region no longer need to
be passed.
-Brian
> case XE_VM_BIND_OP_MAP_USERPTR:
> ops = drm_gpuvm_sm_map_ops_create(&vm->gpuvm, addr, range,
> obj, bo_offset_or_userptr);
> - if (IS_ERR(ops))
> - return ops;
> -
> - drm_gpuva_for_each_op(__op, ops) {
> - struct xe_vma_op *op = gpuva_op_to_vma_op(__op);
> -
> - op->tile_mask = tile_mask;
> - op->map.immediate =
> - flags & XE_VM_BIND_FLAG_IMMEDIATE;
> - op->map.read_only =
> - flags & XE_VM_BIND_FLAG_READONLY;
> - op->map.is_null = flags & XE_VM_BIND_FLAG_NULL;
> - }
> break;
> case XE_VM_BIND_OP_UNMAP:
> ops = drm_gpuvm_sm_unmap_ops_create(&vm->gpuvm, addr, range);
> - if (IS_ERR(ops))
> - return ops;
> -
> - drm_gpuva_for_each_op(__op, ops) {
> - struct xe_vma_op *op = gpuva_op_to_vma_op(__op);
> -
> - op->tile_mask = tile_mask;
> - }
> break;
> case XE_VM_BIND_OP_PREFETCH:
> ops = drm_gpuvm_prefetch_ops_create(&vm->gpuvm, addr, range);
> - if (IS_ERR(ops))
> - return ops;
> -
> - drm_gpuva_for_each_op(__op, ops) {
> - struct xe_vma_op *op = gpuva_op_to_vma_op(__op);
> -
> - op->tile_mask = tile_mask;
> - op->prefetch.region = region;
> - }
> break;
> case XE_VM_BIND_OP_UNMAP_ALL:
> xe_assert(vm->xe, bo);
> @@ -2232,19 +2202,13 @@ vm_bind_ioctl_ops_create(struct xe_vm *vm, struct xe_bo *bo,
> return ERR_PTR(err);
> ops = drm_gpuvm_gem_unmap_ops_create(&vm->gpuvm, obj);
> xe_bo_unlock(bo);
> - if (IS_ERR(ops))
> - return ops;
> -
> - drm_gpuva_for_each_op(__op, ops) {
> - struct xe_vma_op *op = gpuva_op_to_vma_op(__op);
> -
> - op->tile_mask = tile_mask;
> - }
> break;
> default:
> drm_warn(&vm->xe->drm, "NOT POSSIBLE");
> ops = ERR_PTR(-EINVAL);
> }
> + if (IS_ERR(ops))
> + return ops;
>
> #ifdef TEST_VM_ASYNC_OPS_ERROR
> if (operation & FORCE_ASYNC_OP_ERROR) {
> @@ -2255,9 +2219,22 @@ vm_bind_ioctl_ops_create(struct xe_vm *vm, struct xe_bo *bo,
> }
> #endif
>
> - if (!IS_ERR(ops))
> - drm_gpuva_for_each_op(__op, ops)
> - print_op(vm->xe, __op);
> + drm_gpuva_for_each_op(__op, ops) {
> + struct xe_vma_op *op = gpuva_op_to_vma_op(__op);
> +
> + op->tile_mask = tile_mask;
> + if (__op->op == DRM_GPUVA_OP_MAP) {
> + op->map.immediate =
> + flags & XE_VM_BIND_FLAG_IMMEDIATE;
> + op->map.read_only =
> + flags & XE_VM_BIND_FLAG_READONLY;
> + op->map.is_null = flags & XE_VM_BIND_FLAG_NULL;
> + } else if (__op->op == DRM_GPUVA_OP_PREFETCH) {
> + op->prefetch.region = region;
> + }
> +
> + print_op(vm->xe, __op);
> + }
>
> return ops;
> }
More information about the Intel-xe
mailing list