@@ -1493,63 +1493,55 @@ static int __igt_switch_to_kernel_context(struct drm_i915_private *i915,
1493
1493
{
1494
1494
struct intel_engine_cs * engine ;
1495
1495
unsigned int tmp ;
1496
- int err ;
1496
+ int pass ;
1497
1497
1498
1498
GEM_TRACE ("Testing %s\n" , __engine_name (i915 , engines ));
1499
- for_each_engine_masked (engine , i915 , engines , tmp ) {
1500
- struct i915_request * rq ;
1499
+ for (pass = 0 ; pass < 4 ; pass ++ ) { /* Once busy; once idle; repeat */
1500
+ bool from_idle = pass & 1 ;
1501
+ int err ;
1501
1502
1502
- rq = i915_request_alloc ( engine , ctx );
1503
- if ( IS_ERR ( rq ))
1504
- return PTR_ERR ( rq ) ;
1503
+ if (! from_idle ) {
1504
+ for_each_engine_masked ( engine , i915 , engines , tmp ) {
1505
+ struct i915_request * rq ;
1505
1506
1506
- i915_request_add (rq );
1507
- }
1507
+ rq = i915_request_alloc (engine , ctx );
1508
+ if (IS_ERR (rq ))
1509
+ return PTR_ERR (rq );
1508
1510
1509
- err = i915_gem_switch_to_kernel_context (i915 );
1510
- if (err )
1511
- return err ;
1512
-
1513
- for_each_engine_masked (engine , i915 , engines , tmp ) {
1514
- if (!engine_has_kernel_context_barrier (engine )) {
1515
- pr_err ("kernel context not last on engine %s!\n" ,
1516
- engine -> name );
1517
- return - EINVAL ;
1511
+ i915_request_add (rq );
1512
+ }
1518
1513
}
1519
- }
1520
1514
1521
- err = i915_gem_wait_for_idle (i915 ,
1522
- I915_WAIT_LOCKED ,
1523
- MAX_SCHEDULE_TIMEOUT );
1524
- if (err )
1525
- return err ;
1515
+ err = i915_gem_switch_to_kernel_context (i915 );
1516
+ if (err )
1517
+ return err ;
1526
1518
1527
- GEM_BUG_ON (i915 -> gt .active_requests );
1528
- for_each_engine_masked (engine , i915 , engines , tmp ) {
1529
- if (engine -> last_retired_context -> gem_context != i915 -> kernel_context ) {
1530
- pr_err ("engine %s not idling in kernel context!\n" ,
1531
- engine -> name );
1519
+ if (!from_idle ) {
1520
+ err = i915_gem_wait_for_idle (i915 ,
1521
+ I915_WAIT_LOCKED ,
1522
+ MAX_SCHEDULE_TIMEOUT );
1523
+ if (err )
1524
+ return err ;
1525
+ }
1526
+
1527
+ if (i915 -> gt .active_requests ) {
1528
+ pr_err ("%d active requests remain after switching to kernel context, pass %d (%s) on %s engine%s\n" ,
1529
+ i915 -> gt .active_requests ,
1530
+ pass , from_idle ? "idle" : "busy" ,
1531
+ __engine_name (i915 , engines ),
1532
+ is_power_of_2 (engines ) ? "" : "s" );
1532
1533
return - EINVAL ;
1533
1534
}
1534
- }
1535
1535
1536
- err = i915_gem_switch_to_kernel_context (i915 );
1537
- if (err )
1538
- return err ;
1536
+ /* XXX Bonus points for proving we are the kernel context! */
1539
1537
1540
- if (i915 -> gt .active_requests ) {
1541
- pr_err ("switch-to-kernel-context emitted %d requests even though it should already be idling in the kernel context\n" ,
1542
- i915 -> gt .active_requests );
1543
- return - EINVAL ;
1538
+ mutex_unlock (& i915 -> drm .struct_mutex );
1539
+ drain_delayed_work (& i915 -> gt .idle_work );
1540
+ mutex_lock (& i915 -> drm .struct_mutex );
1544
1541
}
1545
1542
1546
- for_each_engine_masked (engine , i915 , engines , tmp ) {
1547
- if (!intel_engine_has_kernel_context (engine )) {
1548
- pr_err ("kernel context not last on engine %s!\n" ,
1549
- engine -> name );
1550
- return - EINVAL ;
1551
- }
1552
- }
1543
+ if (igt_flush_test (i915 , I915_WAIT_LOCKED ))
1544
+ return - EIO ;
1553
1545
1554
1546
return 0 ;
1555
1547
}
@@ -1593,8 +1585,6 @@ static int igt_switch_to_kernel_context(void *arg)
1593
1585
1594
1586
out_unlock :
1595
1587
GEM_TRACE_DUMP_ON (err );
1596
- if (igt_flush_test (i915 , I915_WAIT_LOCKED ))
1597
- err = - EIO ;
1598
1588
1599
1589
intel_runtime_pm_put (i915 , wakeref );
1600
1590
mutex_unlock (& i915 -> drm .struct_mutex );
0 commit comments