[Intel-xe] [PATCH] drm/xe: Only set xe_vma_op.map fields for GPUVA map operations

Matthew Brost matthew.brost at intel.com
Fri Nov 17 08:31:54 UTC 2023


On Thu, Nov 16, 2023 at 11:57:09AM -0800, Welty, Brian wrote:
> 
> 
> 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 !
> 

Yep, will fix.

> 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.
>

These are still used at the bottom of the function...
 
> -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;
> > +		}

Here is the use od flags, tile_mask, and region.

Matt

> > +
> > +		print_op(vm->xe, __op);
> > +	}
> >   	return ops;
> >   }


More information about the Intel-xe mailing list