@@ -412,7 +412,9 @@ static void release_shadow_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx)
412412 if (!wa_ctx -> indirect_ctx .obj )
413413 return ;
414414
415+ i915_gem_object_lock (wa_ctx -> indirect_ctx .obj , NULL );
415416 i915_gem_object_unpin_map (wa_ctx -> indirect_ctx .obj );
417+ i915_gem_object_unlock (wa_ctx -> indirect_ctx .obj );
416418 i915_gem_object_put (wa_ctx -> indirect_ctx .obj );
417419
418420 wa_ctx -> indirect_ctx .obj = NULL ;
@@ -520,6 +522,7 @@ static int prepare_shadow_batch_buffer(struct intel_vgpu_workload *workload)
520522 struct intel_gvt * gvt = workload -> vgpu -> gvt ;
521523 const int gmadr_bytes = gvt -> device_info .gmadr_bytes_in_cmd ;
522524 struct intel_vgpu_shadow_bb * bb ;
525+ struct i915_gem_ww_ctx ww ;
523526 int ret ;
524527
525528 list_for_each_entry (bb , & workload -> shadow_bb , list ) {
@@ -544,10 +547,19 @@ static int prepare_shadow_batch_buffer(struct intel_vgpu_workload *workload)
544547 * directly
545548 */
546549 if (!bb -> ppgtt ) {
547- bb -> vma = i915_gem_object_ggtt_pin (bb -> obj ,
548- NULL , 0 , 0 , 0 );
550+ i915_gem_ww_ctx_init (& ww , false);
551+ retry :
552+ i915_gem_object_lock (bb -> obj , & ww );
553+
554+ bb -> vma = i915_gem_object_ggtt_pin_ww (bb -> obj , & ww ,
555+ NULL , 0 , 0 , 0 );
549556 if (IS_ERR (bb -> vma )) {
550557 ret = PTR_ERR (bb -> vma );
558+ if (ret == - EDEADLK ) {
559+ ret = i915_gem_ww_ctx_backoff (& ww );
560+ if (!ret )
561+ goto retry ;
562+ }
551563 goto err ;
552564 }
553565
@@ -561,13 +573,15 @@ static int prepare_shadow_batch_buffer(struct intel_vgpu_workload *workload)
561573 0 );
562574 if (ret )
563575 goto err ;
564- }
565576
566- /* No one is going to touch shadow bb from now on. */
567- i915_gem_object_flush_map (bb -> obj );
577+ /* No one is going to touch shadow bb from now on. */
578+ i915_gem_object_flush_map (bb -> obj );
579+ i915_gem_object_unlock (bb -> obj );
580+ }
568581 }
569582 return 0 ;
570583err :
584+ i915_gem_ww_ctx_fini (& ww );
571585 release_shadow_batch_buffer (workload );
572586 return ret ;
573587}
@@ -594,14 +608,29 @@ static int prepare_shadow_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx)
594608 unsigned char * per_ctx_va =
595609 (unsigned char * )wa_ctx -> indirect_ctx .shadow_va +
596610 wa_ctx -> indirect_ctx .size ;
611+ struct i915_gem_ww_ctx ww ;
612+ int ret ;
597613
598614 if (wa_ctx -> indirect_ctx .size == 0 )
599615 return 0 ;
600616
601- vma = i915_gem_object_ggtt_pin (wa_ctx -> indirect_ctx .obj , NULL ,
602- 0 , CACHELINE_BYTES , 0 );
603- if (IS_ERR (vma ))
604- return PTR_ERR (vma );
617+ i915_gem_ww_ctx_init (& ww , false);
618+ retry :
619+ i915_gem_object_lock (wa_ctx -> indirect_ctx .obj , & ww );
620+
621+ vma = i915_gem_object_ggtt_pin_ww (wa_ctx -> indirect_ctx .obj , & ww , NULL ,
622+ 0 , CACHELINE_BYTES , 0 );
623+ if (IS_ERR (vma )) {
624+ ret = PTR_ERR (vma );
625+ if (ret == - EDEADLK ) {
626+ ret = i915_gem_ww_ctx_backoff (& ww );
627+ if (!ret )
628+ goto retry ;
629+ }
630+ return ret ;
631+ }
632+
633+ i915_gem_object_unlock (wa_ctx -> indirect_ctx .obj );
605634
606635 /* FIXME: we are not tracking our pinned VMA leaving it
607636 * up to the core to fix up the stray pin_count upon
@@ -635,12 +664,14 @@ static void release_shadow_batch_buffer(struct intel_vgpu_workload *workload)
635664
636665 list_for_each_entry_safe (bb , pos , & workload -> shadow_bb , list ) {
637666 if (bb -> obj ) {
667+ i915_gem_object_lock (bb -> obj , NULL );
638668 if (bb -> va && !IS_ERR (bb -> va ))
639669 i915_gem_object_unpin_map (bb -> obj );
640670
641671 if (bb -> vma && !IS_ERR (bb -> vma ))
642672 i915_vma_unpin (bb -> vma );
643673
674+ i915_gem_object_unlock (bb -> obj );
644675 i915_gem_object_put (bb -> obj );
645676 }
646677 list_del (& bb -> list );
@@ -1015,13 +1046,12 @@ void intel_vgpu_clean_workloads(struct intel_vgpu *vgpu,
10151046 intel_engine_mask_t engine_mask )
10161047{
10171048 struct intel_vgpu_submission * s = & vgpu -> submission ;
1018- struct drm_i915_private * dev_priv = vgpu -> gvt -> gt -> i915 ;
10191049 struct intel_engine_cs * engine ;
10201050 struct intel_vgpu_workload * pos , * n ;
10211051 intel_engine_mask_t tmp ;
10221052
10231053 /* free the unsubmited workloads in the queues. */
1024- for_each_engine_masked (engine , & dev_priv -> gt , engine_mask , tmp ) {
1054+ for_each_engine_masked (engine , vgpu -> gvt -> gt , engine_mask , tmp ) {
10251055 list_for_each_entry_safe (pos , n ,
10261056 & s -> workload_q_head [engine -> id ], list ) {
10271057 list_del_init (& pos -> list );
0 commit comments