@@ -551,6 +551,32 @@ static int live_pin_rewind(void *arg)
551
551
return err ;
552
552
}
553
553
554
+ static int engine_lock_reset_tasklet (struct intel_engine_cs * engine )
555
+ {
556
+ tasklet_disable (& engine -> execlists .tasklet );
557
+ local_bh_disable ();
558
+
559
+ if (test_and_set_bit (I915_RESET_ENGINE + engine -> id ,
560
+ & engine -> gt -> reset .flags )) {
561
+ local_bh_enable ();
562
+ tasklet_enable (& engine -> execlists .tasklet );
563
+
564
+ intel_gt_set_wedged (engine -> gt );
565
+ return - EBUSY ;
566
+ }
567
+
568
+ return 0 ;
569
+ }
570
+
571
+ static void engine_unlock_reset_tasklet (struct intel_engine_cs * engine )
572
+ {
573
+ clear_and_wake_up_bit (I915_RESET_ENGINE + engine -> id ,
574
+ & engine -> gt -> reset .flags );
575
+
576
+ local_bh_enable ();
577
+ tasklet_enable (& engine -> execlists .tasklet );
578
+ }
579
+
554
580
static int live_hold_reset (void * arg )
555
581
{
556
582
struct intel_gt * gt = arg ;
@@ -598,15 +624,9 @@ static int live_hold_reset(void *arg)
598
624
599
625
/* We have our request executing, now remove it and reset */
600
626
601
- local_bh_disable ();
602
- if (test_and_set_bit (I915_RESET_ENGINE + id ,
603
- & gt -> reset .flags )) {
604
- local_bh_enable ();
605
- intel_gt_set_wedged (gt );
606
- err = - EBUSY ;
627
+ err = engine_lock_reset_tasklet (engine );
628
+ if (err )
607
629
goto out ;
608
- }
609
- tasklet_disable (& engine -> execlists .tasklet );
610
630
611
631
engine -> execlists .tasklet .callback (& engine -> execlists .tasklet );
612
632
GEM_BUG_ON (execlists_active (& engine -> execlists ) != rq );
@@ -618,10 +638,7 @@ static int live_hold_reset(void *arg)
618
638
__intel_engine_reset_bh (engine , NULL );
619
639
GEM_BUG_ON (rq -> fence .error != - EIO );
620
640
621
- tasklet_enable (& engine -> execlists .tasklet );
622
- clear_and_wake_up_bit (I915_RESET_ENGINE + id ,
623
- & gt -> reset .flags );
624
- local_bh_enable ();
641
+ engine_unlock_reset_tasklet (engine );
625
642
626
643
/* Check that we do not resubmit the held request */
627
644
if (!i915_request_wait (rq , 0 , HZ / 5 )) {
@@ -4585,15 +4602,9 @@ static int reset_virtual_engine(struct intel_gt *gt,
4585
4602
GEM_BUG_ON (engine == ve -> engine );
4586
4603
4587
4604
/* Take ownership of the reset and tasklet */
4588
- local_bh_disable ();
4589
- if (test_and_set_bit (I915_RESET_ENGINE + engine -> id ,
4590
- & gt -> reset .flags )) {
4591
- local_bh_enable ();
4592
- intel_gt_set_wedged (gt );
4593
- err = - EBUSY ;
4605
+ err = engine_lock_reset_tasklet (engine );
4606
+ if (err )
4594
4607
goto out_heartbeat ;
4595
- }
4596
- tasklet_disable (& engine -> execlists .tasklet );
4597
4608
4598
4609
engine -> execlists .tasklet .callback (& engine -> execlists .tasklet );
4599
4610
GEM_BUG_ON (execlists_active (& engine -> execlists ) != rq );
@@ -4612,9 +4623,7 @@ static int reset_virtual_engine(struct intel_gt *gt,
4612
4623
GEM_BUG_ON (rq -> fence .error != - EIO );
4613
4624
4614
4625
/* Release our grasp on the engine, letting CS flow again */
4615
- tasklet_enable (& engine -> execlists .tasklet );
4616
- clear_and_wake_up_bit (I915_RESET_ENGINE + engine -> id , & gt -> reset .flags );
4617
- local_bh_enable ();
4626
+ engine_unlock_reset_tasklet (engine );
4618
4627
4619
4628
/* Check that we do not resubmit the held request */
4620
4629
i915_request_get (rq );
0 commit comments