@@ -393,6 +393,9 @@ static int xe_gpuvm_validate(struct drm_gpuvm_bo *vm_bo, struct drm_exec *exec)
393393 list_move_tail (& gpuva_to_vma (gpuva )-> combined_links .rebind ,
394394 & vm -> rebind_list );
395395
396+ if (!try_wait_for_completion (& vm -> xe -> pm_block ))
397+ return - EAGAIN ;
398+
396399 ret = xe_bo_validate (gem_to_xe_bo (vm_bo -> obj ), vm , false);
397400 if (ret )
398401 return ret ;
@@ -479,6 +482,33 @@ static int xe_preempt_work_begin(struct drm_exec *exec, struct xe_vm *vm,
479482 return xe_vm_validate_rebind (vm , exec , vm -> preempt .num_exec_queues );
480483}
481484
485+ static bool vm_suspend_rebind_worker (struct xe_vm * vm )
486+ {
487+ struct xe_device * xe = vm -> xe ;
488+ bool ret = false;
489+
490+ mutex_lock (& xe -> rebind_resume_lock );
491+ if (!try_wait_for_completion (& vm -> xe -> pm_block )) {
492+ ret = true;
493+ list_move_tail (& vm -> preempt .pm_activate_link , & xe -> rebind_resume_list );
494+ }
495+ mutex_unlock (& xe -> rebind_resume_lock );
496+
497+ return ret ;
498+ }
499+
500+ /**
501+ * xe_vm_resume_rebind_worker() - Resume the rebind worker.
502+ * @vm: The vm whose preempt worker to resume.
503+ *
504+ * Resume a preempt worker that was previously suspended by
505+ * vm_suspend_rebind_worker().
506+ */
507+ void xe_vm_resume_rebind_worker (struct xe_vm * vm )
508+ {
509+ queue_work (vm -> xe -> ordered_wq , & vm -> preempt .rebind_work );
510+ }
511+
482512static void preempt_rebind_work_func (struct work_struct * w )
483513{
484514 struct xe_vm * vm = container_of (w , struct xe_vm , preempt .rebind_work );
@@ -502,6 +532,11 @@ static void preempt_rebind_work_func(struct work_struct *w)
502532 }
503533
504534retry :
535+ if (!try_wait_for_completion (& vm -> xe -> pm_block ) && vm_suspend_rebind_worker (vm )) {
536+ up_write (& vm -> lock );
537+ return ;
538+ }
539+
505540 if (xe_vm_userptr_check_repin (vm )) {
506541 err = xe_vm_userptr_pin (vm );
507542 if (err )
@@ -1714,6 +1749,7 @@ struct xe_vm *xe_vm_create(struct xe_device *xe, u32 flags, struct xe_file *xef)
17141749 if (flags & XE_VM_FLAG_LR_MODE ) {
17151750 INIT_WORK (& vm -> preempt .rebind_work , preempt_rebind_work_func );
17161751 xe_pm_runtime_get_noresume (xe );
1752+ INIT_LIST_HEAD (& vm -> preempt .pm_activate_link );
17171753 }
17181754
17191755 if (flags & XE_VM_FLAG_FAULT_MODE ) {
@@ -1895,8 +1931,12 @@ void xe_vm_close_and_put(struct xe_vm *vm)
18951931 xe_assert (xe , !vm -> preempt .num_exec_queues );
18961932
18971933 xe_vm_close (vm );
1898- if (xe_vm_in_preempt_fence_mode (vm ))
1934+ if (xe_vm_in_preempt_fence_mode (vm )) {
1935+ mutex_lock (& xe -> rebind_resume_lock );
1936+ list_del_init (& vm -> preempt .pm_activate_link );
1937+ mutex_unlock (& xe -> rebind_resume_lock );
18991938 flush_work (& vm -> preempt .rebind_work );
1939+ }
19001940 if (xe_vm_in_fault_mode (vm ))
19011941 xe_svm_close (vm );
19021942
0 commit comments