[Intel-xe] [PATCH] drm/xe: Make explicit that exec uAPI expects canonical addresses
Oded Gabbay
ogabbay at kernel.org
Tue Jul 4 08:23:05 UTC 2023
On Mon, Jul 3, 2023 at 10:01 PM José Roberto de Souza
<jose.souza at intel.com> wrote:
>
> The batch buffer address in exec uAPI is used when emitting
> MI_BATCH_BUFFER_START that expect canonical addresses in future
> platforms, for current ones the bits above 57 for PVC and 47 for
> other platforms are ignored.
>
> So the safest approach is to require canonical address for all
> platforms supported by Xe to avoid uAPI breaks.
What do you mean by uAPI break ?
If the user gives a wrong address, won't the device simply issue a
page fault and/or a different error event that will cause the job to
terminate ?
Are you explicitly checking all addresses that are given by the user ?
I don't understand why this check warrants a dedicated check in the driver.
imo, you should never validate user input if it will just cause the
gpu to issue a page fault and/or an error interrupt
Oded
>
> BSpec: 60223 59475 45718
> Cc: Matthew Brost <matthew.brost at intel.com>
> Cc: Thomas Hellström <thomas.hellstrom at linux.intel.com>
> Signed-off-by: José Roberto de Souza <jose.souza at intel.com>
> ---
> drivers/gpu/drm/xe/xe_device.c | 6 ++++++
> drivers/gpu/drm/xe/xe_device.h | 2 ++
> drivers/gpu/drm/xe/xe_exec.c | 8 ++++++++
> include/uapi/drm/xe_drm.h | 4 ++--
> 4 files changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> index 07ae208af809d..887aed80a20e9 100644
> --- a/drivers/gpu/drm/xe/xe_device.c
> +++ b/drivers/gpu/drm/xe/xe_device.c
> @@ -437,3 +437,9 @@ void xe_device_mem_access_put(struct xe_device *xe)
>
> XE_WARN_ON(ref < 0);
> }
> +
> +u64 xe_device_canonical_addr(struct xe_device *xe, u64 address)
> +{
> + const int high_address_bit = xe->info.dma_mask_size > 47 ? 57 : 47;
> + return sign_extend64(address, high_address_bit);
> +}
> diff --git a/drivers/gpu/drm/xe/xe_device.h b/drivers/gpu/drm/xe/xe_device.h
> index 779f71d066e6e..4df4f52f946ea 100644
> --- a/drivers/gpu/drm/xe/xe_device.h
> +++ b/drivers/gpu/drm/xe/xe_device.h
> @@ -140,6 +140,8 @@ static inline struct xe_force_wake * gt_to_fw(struct xe_gt *gt)
> void xe_device_mem_access_get(struct xe_device *xe);
> void xe_device_mem_access_put(struct xe_device *xe);
>
> +u64 xe_device_canonical_addr(struct xe_device *xe, u64 address);
> +
> static inline bool xe_device_mem_access_ongoing(struct xe_device *xe)
> {
> return atomic_read(&xe->mem_access.ref);
> diff --git a/drivers/gpu/drm/xe/xe_exec.c b/drivers/gpu/drm/xe/xe_exec.c
> index c52edff9a3584..ba6e82112e4be 100644
> --- a/drivers/gpu/drm/xe/xe_exec.c
> +++ b/drivers/gpu/drm/xe/xe_exec.c
> @@ -231,6 +231,14 @@ int xe_exec_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
> }
> }
>
> + for (i = 0; i < engine->width; i++) {
> + const u64 canonical_addr = xe_device_canonical_addr(xe, addresses[i]);
> + if (XE_IOCTL_ERR(xe, addresses[i] != canonical_addr)) {
> + err = -EINVAL;
> + goto err_syncs;
> + }
> + }
> +
> /*
> * We can't install a job into the VM dma-resv shared slot before an
> * async VM bind passed in as a fence without the risk of deadlocking as
> diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h
> index e890b131af918..72dc2161fd232 100644
> --- a/include/uapi/drm/xe_drm.h
> +++ b/include/uapi/drm/xe_drm.h
> @@ -811,8 +811,8 @@ struct drm_xe_exec {
> __u64 syncs;
>
> /**
> - * @address: address of batch buffer if num_batch_buffer == 1 or an
> - * array of batch buffer addresses
> + * @address: canonical address of batch buffer if num_batch_buffer == 1
> + * or an array of batch buffer canonical addresses
> */
> __u64 address;
>
> --
> 2.41.0
>
More information about the Intel-xe
mailing list