mirror of
https://github.com/torvalds/linux.git
synced 2024-11-29 07:31:29 +00:00
drm/xe: Only allow 1 ufence per exec / bind IOCTL
The way exec ufences are coded only 1 ufence per IOCTL will be signaled.
It is possible to fix this but for current use cases 1 ufence per IOCTL
is sufficient. Enforce a limit of 1 ufence per IOCTL (both exec and bind
to be uniform).
v2:
- Add fixes tag (Thomas)
Fixes: dd08ebf6c3
("drm/xe: Introduce a new DRM driver for Intel GPUs")
Cc: Mika Kahola <mika.kahola@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Brian Welty <brian.welty@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240124234413.1640825-1-matthew.brost@intel.com
This commit is contained in:
parent
be7d51c5b4
commit
d1df9bfbf6
@ -150,7 +150,7 @@ int xe_exec_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
|
||||
u64 addresses[XE_HW_ENGINE_MAX_INSTANCE];
|
||||
struct drm_gpuvm_exec vm_exec = {.extra.fn = xe_exec_fn};
|
||||
struct drm_exec *exec = &vm_exec.exec;
|
||||
u32 i, num_syncs = 0;
|
||||
u32 i, num_syncs = 0, num_ufence = 0;
|
||||
struct xe_sched_job *job;
|
||||
struct dma_fence *rebind_fence;
|
||||
struct xe_vm *vm;
|
||||
@ -196,6 +196,14 @@ int xe_exec_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
|
||||
SYNC_PARSE_FLAG_LR_MODE : 0));
|
||||
if (err)
|
||||
goto err_syncs;
|
||||
|
||||
if (xe_sync_is_ufence(&syncs[i]))
|
||||
num_ufence++;
|
||||
}
|
||||
|
||||
if (XE_IOCTL_DBG(xe, num_ufence > 1)) {
|
||||
err = -EINVAL;
|
||||
goto err_syncs;
|
||||
}
|
||||
|
||||
if (xe_exec_queue_is_parallel(q)) {
|
||||
|
@ -33,4 +33,9 @@ struct dma_fence *
|
||||
xe_sync_in_fence_get(struct xe_sync_entry *sync, int num_sync,
|
||||
struct xe_exec_queue *q, struct xe_vm *vm);
|
||||
|
||||
static inline bool xe_sync_is_ufence(struct xe_sync_entry *sync)
|
||||
{
|
||||
return !!sync->ufence;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -2851,7 +2851,7 @@ int xe_vm_bind_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
|
||||
struct drm_gpuva_ops **ops = NULL;
|
||||
struct xe_vm *vm;
|
||||
struct xe_exec_queue *q = NULL;
|
||||
u32 num_syncs;
|
||||
u32 num_syncs, num_ufence = 0;
|
||||
struct xe_sync_entry *syncs = NULL;
|
||||
struct drm_xe_vm_bind_op *bind_ops;
|
||||
LIST_HEAD(ops_list);
|
||||
@ -2988,6 +2988,14 @@ int xe_vm_bind_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
|
||||
SYNC_PARSE_FLAG_DISALLOW_USER_FENCE : 0));
|
||||
if (err)
|
||||
goto free_syncs;
|
||||
|
||||
if (xe_sync_is_ufence(&syncs[num_syncs]))
|
||||
num_ufence++;
|
||||
}
|
||||
|
||||
if (XE_IOCTL_DBG(xe, num_ufence > 1)) {
|
||||
err = -EINVAL;
|
||||
goto free_syncs;
|
||||
}
|
||||
|
||||
if (!args->num_binds) {
|
||||
|
Loading…
Reference in New Issue
Block a user