Skip to content

Commit 6a5884f

Browse files
committed
Merge tag 'drm-xe-fixes-2025-02-27' of https://gitlab.freedesktop.org/drm/xe/kernel into drm-fixes
uAPI: - OA uapi fix (Umesh) Driver: - Userptr related fixes (Auld) - Remove a duplicated register entry (Mingong) - Scheduler related fix to prevent exec races when freeing it (Tejas) Signed-off-by: Dave Airlie <[email protected]> From: Rodrigo Vivi <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
2 parents c98c94d + 12c2f96 commit 6a5884f

File tree

4 files changed

+38
-10
lines changed

4 files changed

+38
-10
lines changed

drivers/gpu/drm/xe/regs/xe_engine_regs.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353

5454
#define RING_CTL(base) XE_REG((base) + 0x3c)
5555
#define RING_CTL_SIZE(size) ((size) - PAGE_SIZE) /* in bytes -> pages */
56-
#define RING_CTL_SIZE(size) ((size) - PAGE_SIZE) /* in bytes -> pages */
5756

5857
#define RING_START_UDW(base) XE_REG((base) + 0x48)
5958

drivers/gpu/drm/xe/xe_guc_submit.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1248,6 +1248,8 @@ static void __guc_exec_queue_fini_async(struct work_struct *w)
12481248

12491249
if (xe_exec_queue_is_lr(q))
12501250
cancel_work_sync(&ge->lr_tdr);
1251+
/* Confirm no work left behind accessing device structures */
1252+
cancel_delayed_work_sync(&ge->sched.base.work_tdr);
12511253
release_guc_id(guc, q);
12521254
xe_sched_entity_fini(&ge->entity);
12531255
xe_sched_fini(&ge->sched);

drivers/gpu/drm/xe/xe_oa.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1689,7 +1689,7 @@ static int xe_oa_stream_init(struct xe_oa_stream *stream,
16891689
stream->oa_buffer.format = &stream->oa->oa_formats[param->oa_format];
16901690

16911691
stream->sample = param->sample;
1692-
stream->periodic = param->period_exponent > 0;
1692+
stream->periodic = param->period_exponent >= 0;
16931693
stream->period_exponent = param->period_exponent;
16941694
stream->no_preempt = param->no_preempt;
16951695
stream->wait_num_reports = param->wait_num_reports;
@@ -1970,6 +1970,7 @@ int xe_oa_stream_open_ioctl(struct drm_device *dev, u64 data, struct drm_file *f
19701970
}
19711971

19721972
param.xef = xef;
1973+
param.period_exponent = -1;
19731974
ret = xe_oa_user_extensions(oa, XE_OA_USER_EXTN_FROM_OPEN, data, 0, &param);
19741975
if (ret)
19751976
return ret;
@@ -2024,7 +2025,7 @@ int xe_oa_stream_open_ioctl(struct drm_device *dev, u64 data, struct drm_file *f
20242025
goto err_exec_q;
20252026
}
20262027

2027-
if (param.period_exponent > 0) {
2028+
if (param.period_exponent >= 0) {
20282029
u64 oa_period, oa_freq_hz;
20292030

20302031
/* Requesting samples from OAG buffer is a privileged operation */

drivers/gpu/drm/xe/xe_vm.c

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -666,20 +666,33 @@ int xe_vm_userptr_pin(struct xe_vm *vm)
666666

667667
/* Collect invalidated userptrs */
668668
spin_lock(&vm->userptr.invalidated_lock);
669+
xe_assert(vm->xe, list_empty(&vm->userptr.repin_list));
669670
list_for_each_entry_safe(uvma, next, &vm->userptr.invalidated,
670671
userptr.invalidate_link) {
671672
list_del_init(&uvma->userptr.invalidate_link);
672-
list_move_tail(&uvma->userptr.repin_link,
673-
&vm->userptr.repin_list);
673+
list_add_tail(&uvma->userptr.repin_link,
674+
&vm->userptr.repin_list);
674675
}
675676
spin_unlock(&vm->userptr.invalidated_lock);
676677

677-
/* Pin and move to temporary list */
678+
/* Pin and move to bind list */
678679
list_for_each_entry_safe(uvma, next, &vm->userptr.repin_list,
679680
userptr.repin_link) {
680681
err = xe_vma_userptr_pin_pages(uvma);
681682
if (err == -EFAULT) {
682683
list_del_init(&uvma->userptr.repin_link);
684+
/*
685+
* We might have already done the pin once already, but
686+
* then had to retry before the re-bind happened, due
687+
* some other condition in the caller, but in the
688+
* meantime the userptr got dinged by the notifier such
689+
* that we need to revalidate here, but this time we hit
690+
* the EFAULT. In such a case make sure we remove
691+
* ourselves from the rebind list to avoid going down in
692+
* flames.
693+
*/
694+
if (!list_empty(&uvma->vma.combined_links.rebind))
695+
list_del_init(&uvma->vma.combined_links.rebind);
683696

684697
/* Wait for pending binds */
685698
xe_vm_lock(vm, false);
@@ -690,18 +703,30 @@ int xe_vm_userptr_pin(struct xe_vm *vm)
690703
err = xe_vm_invalidate_vma(&uvma->vma);
691704
xe_vm_unlock(vm);
692705
if (err)
693-
return err;
706+
break;
694707
} else {
695-
if (err < 0)
696-
return err;
708+
if (err)
709+
break;
697710

698711
list_del_init(&uvma->userptr.repin_link);
699712
list_move_tail(&uvma->vma.combined_links.rebind,
700713
&vm->rebind_list);
701714
}
702715
}
703716

704-
return 0;
717+
if (err) {
718+
down_write(&vm->userptr.notifier_lock);
719+
spin_lock(&vm->userptr.invalidated_lock);
720+
list_for_each_entry_safe(uvma, next, &vm->userptr.repin_list,
721+
userptr.repin_link) {
722+
list_del_init(&uvma->userptr.repin_link);
723+
list_move_tail(&uvma->userptr.invalidate_link,
724+
&vm->userptr.invalidated);
725+
}
726+
spin_unlock(&vm->userptr.invalidated_lock);
727+
up_write(&vm->userptr.notifier_lock);
728+
}
729+
return err;
705730
}
706731

707732
/**
@@ -1066,6 +1091,7 @@ static void xe_vma_destroy(struct xe_vma *vma, struct dma_fence *fence)
10661091
xe_assert(vm->xe, vma->gpuva.flags & XE_VMA_DESTROYED);
10671092

10681093
spin_lock(&vm->userptr.invalidated_lock);
1094+
xe_assert(vm->xe, list_empty(&to_userptr_vma(vma)->userptr.repin_link));
10691095
list_del(&to_userptr_vma(vma)->userptr.invalidate_link);
10701096
spin_unlock(&vm->userptr.invalidated_lock);
10711097
} else if (!xe_vma_is_null(vma)) {

0 commit comments

Comments
 (0)