This source file includes following definitions.
- i915_fence_get_driver_name
- i915_fence_get_timeline_name
- i915_fence_signaled
- i915_fence_enable_signaling
- i915_fence_wait
- i915_fence_release
- irq_execute_cb
- irq_execute_cb_hook
- __notify_execute_cb
- remove_from_client
- free_capture_list
- remove_from_engine
- i915_request_retire
- i915_request_retire_upto
- __i915_request_await_execution
- __i915_request_submit
- i915_request_submit
- __i915_request_unsubmit
- i915_request_unsubmit
- submit_notify
- irq_semaphore_cb
- semaphore_notify
- retire_requests
- request_alloc_slow
- __i915_request_create
- i915_request_create
- i915_request_await_start
- already_busywaiting
- emit_semaphore_wait
- i915_request_await_request
- i915_request_await_dma_fence
- i915_request_await_execution
- i915_request_await_object
- i915_request_skip
- __i915_request_add_to_timeline
- __i915_request_commit
- __i915_request_queue
- i915_request_add
- local_clock_us
- busywait_stop
- __i915_spin_request
- request_wait_wake
- i915_request_wait
- i915_retire_requests
- i915_global_request_shrink
- i915_global_request_exit
- i915_global_request_init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 #include <linux/dma-fence-array.h>
26 #include <linux/irq_work.h>
27 #include <linux/prefetch.h>
28 #include <linux/sched.h>
29 #include <linux/sched/clock.h>
30 #include <linux/sched/signal.h>
31
32 #include "gem/i915_gem_context.h"
33 #include "gt/intel_context.h"
34
35 #include "i915_active.h"
36 #include "i915_drv.h"
37 #include "i915_globals.h"
38 #include "i915_trace.h"
39 #include "intel_pm.h"
40
41 struct execute_cb {
42 struct list_head link;
43 struct irq_work work;
44 struct i915_sw_fence *fence;
45 void (*hook)(struct i915_request *rq, struct dma_fence *signal);
46 struct i915_request *signal;
47 };
48
49 static struct i915_global_request {
50 struct i915_global base;
51 struct kmem_cache *slab_requests;
52 struct kmem_cache *slab_dependencies;
53 struct kmem_cache *slab_execute_cbs;
54 } global;
55
56 static const char *i915_fence_get_driver_name(struct dma_fence *fence)
57 {
58 return "i915";
59 }
60
61 static const char *i915_fence_get_timeline_name(struct dma_fence *fence)
62 {
63
64
65
66
67
68
69
70
71
72 if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
73 return "signaled";
74
75 return to_request(fence)->gem_context->name ?: "[i915]";
76 }
77
78 static bool i915_fence_signaled(struct dma_fence *fence)
79 {
80 return i915_request_completed(to_request(fence));
81 }
82
83 static bool i915_fence_enable_signaling(struct dma_fence *fence)
84 {
85 return i915_request_enable_breadcrumb(to_request(fence));
86 }
87
88 static signed long i915_fence_wait(struct dma_fence *fence,
89 bool interruptible,
90 signed long timeout)
91 {
92 return i915_request_wait(to_request(fence),
93 interruptible | I915_WAIT_PRIORITY,
94 timeout);
95 }
96
97 static void i915_fence_release(struct dma_fence *fence)
98 {
99 struct i915_request *rq = to_request(fence);
100
101
102
103
104
105
106
107
108 i915_sw_fence_fini(&rq->submit);
109 i915_sw_fence_fini(&rq->semaphore);
110
111 kmem_cache_free(global.slab_requests, rq);
112 }
113
114 const struct dma_fence_ops i915_fence_ops = {
115 .get_driver_name = i915_fence_get_driver_name,
116 .get_timeline_name = i915_fence_get_timeline_name,
117 .enable_signaling = i915_fence_enable_signaling,
118 .signaled = i915_fence_signaled,
119 .wait = i915_fence_wait,
120 .release = i915_fence_release,
121 };
122
123 static void irq_execute_cb(struct irq_work *wrk)
124 {
125 struct execute_cb *cb = container_of(wrk, typeof(*cb), work);
126
127 i915_sw_fence_complete(cb->fence);
128 kmem_cache_free(global.slab_execute_cbs, cb);
129 }
130
131 static void irq_execute_cb_hook(struct irq_work *wrk)
132 {
133 struct execute_cb *cb = container_of(wrk, typeof(*cb), work);
134
135 cb->hook(container_of(cb->fence, struct i915_request, submit),
136 &cb->signal->fence);
137 i915_request_put(cb->signal);
138
139 irq_execute_cb(wrk);
140 }
141
142 static void __notify_execute_cb(struct i915_request *rq)
143 {
144 struct execute_cb *cb;
145
146 lockdep_assert_held(&rq->lock);
147
148 if (list_empty(&rq->execute_cb))
149 return;
150
151 list_for_each_entry(cb, &rq->execute_cb, link)
152 irq_work_queue(&cb->work);
153
154
155
156
157
158
159
160
161
162
163
164 INIT_LIST_HEAD(&rq->execute_cb);
165 }
166
167 static inline void
168 remove_from_client(struct i915_request *request)
169 {
170 struct drm_i915_file_private *file_priv;
171
172 file_priv = READ_ONCE(request->file_priv);
173 if (!file_priv)
174 return;
175
176 spin_lock(&file_priv->mm.lock);
177 if (request->file_priv) {
178 list_del(&request->client_link);
179 request->file_priv = NULL;
180 }
181 spin_unlock(&file_priv->mm.lock);
182 }
183
184 static void free_capture_list(struct i915_request *request)
185 {
186 struct i915_capture_list *capture;
187
188 capture = request->capture_list;
189 while (capture) {
190 struct i915_capture_list *next = capture->next;
191
192 kfree(capture);
193 capture = next;
194 }
195 }
196
197 static void remove_from_engine(struct i915_request *rq)
198 {
199 struct intel_engine_cs *engine, *locked;
200
201
202
203
204
205
206
207 locked = READ_ONCE(rq->engine);
208 spin_lock(&locked->active.lock);
209 while (unlikely(locked != (engine = READ_ONCE(rq->engine)))) {
210 spin_unlock(&locked->active.lock);
211 spin_lock(&engine->active.lock);
212 locked = engine;
213 }
214 list_del(&rq->sched.link);
215 spin_unlock(&locked->active.lock);
216 }
217
218 static bool i915_request_retire(struct i915_request *rq)
219 {
220 struct i915_active_request *active, *next;
221
222 lockdep_assert_held(&rq->timeline->mutex);
223 if (!i915_request_completed(rq))
224 return false;
225
226 GEM_TRACE("%s fence %llx:%lld, current %d\n",
227 rq->engine->name,
228 rq->fence.context, rq->fence.seqno,
229 hwsp_seqno(rq));
230
231 GEM_BUG_ON(!i915_sw_fence_signaled(&rq->submit));
232 trace_i915_request_retire(rq);
233
234
235
236
237
238
239
240
241
242
243 GEM_BUG_ON(!list_is_first(&rq->link, &rq->timeline->requests));
244 rq->ring->head = rq->postfix;
245
246
247
248
249
250
251
252
253
254
255
256 list_for_each_entry_safe(active, next, &rq->active_list, link) {
257
258
259
260
261
262
263
264
265
266
267 prefetchw(next);
268
269 INIT_LIST_HEAD(&active->link);
270 RCU_INIT_POINTER(active->request, NULL);
271
272 active->retire(active, rq);
273 }
274
275 local_irq_disable();
276
277
278
279
280
281
282
283 remove_from_engine(rq);
284
285 spin_lock(&rq->lock);
286 i915_request_mark_complete(rq);
287 if (!i915_request_signaled(rq))
288 dma_fence_signal_locked(&rq->fence);
289 if (test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &rq->fence.flags))
290 i915_request_cancel_breadcrumb(rq);
291 if (i915_request_has_waitboost(rq)) {
292 GEM_BUG_ON(!atomic_read(&rq->i915->gt_pm.rps.num_waiters));
293 atomic_dec(&rq->i915->gt_pm.rps.num_waiters);
294 }
295 if (!test_bit(I915_FENCE_FLAG_ACTIVE, &rq->fence.flags)) {
296 set_bit(I915_FENCE_FLAG_ACTIVE, &rq->fence.flags);
297 __notify_execute_cb(rq);
298 }
299 GEM_BUG_ON(!list_empty(&rq->execute_cb));
300 spin_unlock(&rq->lock);
301
302 local_irq_enable();
303
304 remove_from_client(rq);
305 list_del(&rq->link);
306
307 intel_context_exit(rq->hw_context);
308 intel_context_unpin(rq->hw_context);
309
310 free_capture_list(rq);
311 i915_sched_node_fini(&rq->sched);
312 i915_request_put(rq);
313
314 return true;
315 }
316
317 void i915_request_retire_upto(struct i915_request *rq)
318 {
319 struct intel_timeline * const tl = rq->timeline;
320 struct i915_request *tmp;
321
322 GEM_TRACE("%s fence %llx:%lld, current %d\n",
323 rq->engine->name,
324 rq->fence.context, rq->fence.seqno,
325 hwsp_seqno(rq));
326
327 lockdep_assert_held(&tl->mutex);
328 GEM_BUG_ON(!i915_request_completed(rq));
329
330 do {
331 tmp = list_first_entry(&tl->requests, typeof(*tmp), link);
332 } while (i915_request_retire(tmp) && tmp != rq);
333 }
334
335 static int
336 __i915_request_await_execution(struct i915_request *rq,
337 struct i915_request *signal,
338 void (*hook)(struct i915_request *rq,
339 struct dma_fence *signal),
340 gfp_t gfp)
341 {
342 struct execute_cb *cb;
343
344 if (i915_request_is_active(signal)) {
345 if (hook)
346 hook(rq, &signal->fence);
347 return 0;
348 }
349
350 cb = kmem_cache_alloc(global.slab_execute_cbs, gfp);
351 if (!cb)
352 return -ENOMEM;
353
354 cb->fence = &rq->submit;
355 i915_sw_fence_await(cb->fence);
356 init_irq_work(&cb->work, irq_execute_cb);
357
358 if (hook) {
359 cb->hook = hook;
360 cb->signal = i915_request_get(signal);
361 cb->work.func = irq_execute_cb_hook;
362 }
363
364 spin_lock_irq(&signal->lock);
365 if (i915_request_is_active(signal)) {
366 if (hook) {
367 hook(rq, &signal->fence);
368 i915_request_put(signal);
369 }
370 i915_sw_fence_complete(cb->fence);
371 kmem_cache_free(global.slab_execute_cbs, cb);
372 } else {
373 list_add_tail(&cb->link, &signal->execute_cb);
374 }
375 spin_unlock_irq(&signal->lock);
376
377 return 0;
378 }
379
380 bool __i915_request_submit(struct i915_request *request)
381 {
382 struct intel_engine_cs *engine = request->engine;
383 bool result = false;
384
385 GEM_TRACE("%s fence %llx:%lld, current %d\n",
386 engine->name,
387 request->fence.context, request->fence.seqno,
388 hwsp_seqno(request));
389
390 GEM_BUG_ON(!irqs_disabled());
391 lockdep_assert_held(&engine->active.lock);
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409 if (i915_request_completed(request))
410 goto xfer;
411
412 if (i915_gem_context_is_banned(request->gem_context))
413 i915_request_skip(request, -EIO);
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431 if (request->sched.semaphores &&
432 i915_sw_fence_signaled(&request->semaphore))
433 engine->saturated |= request->sched.semaphores;
434
435 engine->emit_fini_breadcrumb(request,
436 request->ring->vaddr + request->postfix);
437
438 trace_i915_request_execute(request);
439 engine->serial++;
440 result = true;
441
442 xfer:
443 spin_lock_nested(&request->lock, SINGLE_DEPTH_NESTING);
444
445 if (!test_and_set_bit(I915_FENCE_FLAG_ACTIVE, &request->fence.flags))
446 list_move_tail(&request->sched.link, &engine->active.requests);
447
448 if (test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &request->fence.flags) &&
449 !test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &request->fence.flags) &&
450 !i915_request_enable_breadcrumb(request))
451 intel_engine_queue_breadcrumbs(engine);
452
453 __notify_execute_cb(request);
454
455 spin_unlock(&request->lock);
456
457 return result;
458 }
459
460 void i915_request_submit(struct i915_request *request)
461 {
462 struct intel_engine_cs *engine = request->engine;
463 unsigned long flags;
464
465
466 spin_lock_irqsave(&engine->active.lock, flags);
467
468 __i915_request_submit(request);
469
470 spin_unlock_irqrestore(&engine->active.lock, flags);
471 }
472
473 void __i915_request_unsubmit(struct i915_request *request)
474 {
475 struct intel_engine_cs *engine = request->engine;
476
477 GEM_TRACE("%s fence %llx:%lld, current %d\n",
478 engine->name,
479 request->fence.context, request->fence.seqno,
480 hwsp_seqno(request));
481
482 GEM_BUG_ON(!irqs_disabled());
483 lockdep_assert_held(&engine->active.lock);
484
485
486
487
488
489
490
491 spin_lock_nested(&request->lock, SINGLE_DEPTH_NESTING);
492
493 if (test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &request->fence.flags))
494 i915_request_cancel_breadcrumb(request);
495
496 GEM_BUG_ON(!test_bit(I915_FENCE_FLAG_ACTIVE, &request->fence.flags));
497 clear_bit(I915_FENCE_FLAG_ACTIVE, &request->fence.flags);
498
499 spin_unlock(&request->lock);
500
501
502 if (request->sched.semaphores && i915_request_started(request)) {
503 request->sched.attr.priority |= I915_PRIORITY_NOSEMAPHORE;
504 request->sched.semaphores = 0;
505 }
506
507
508
509
510
511
512
513
514 }
515
516 void i915_request_unsubmit(struct i915_request *request)
517 {
518 struct intel_engine_cs *engine = request->engine;
519 unsigned long flags;
520
521
522 spin_lock_irqsave(&engine->active.lock, flags);
523
524 __i915_request_unsubmit(request);
525
526 spin_unlock_irqrestore(&engine->active.lock, flags);
527 }
528
529 static int __i915_sw_fence_call
530 submit_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state)
531 {
532 struct i915_request *request =
533 container_of(fence, typeof(*request), submit);
534
535 switch (state) {
536 case FENCE_COMPLETE:
537 trace_i915_request_submit(request);
538
539 if (unlikely(fence->error))
540 i915_request_skip(request, fence->error);
541
542
543
544
545
546
547
548
549
550 rcu_read_lock();
551 request->engine->submit_request(request);
552 rcu_read_unlock();
553 break;
554
555 case FENCE_FREE:
556 i915_request_put(request);
557 break;
558 }
559
560 return NOTIFY_DONE;
561 }
562
563 static void irq_semaphore_cb(struct irq_work *wrk)
564 {
565 struct i915_request *rq =
566 container_of(wrk, typeof(*rq), semaphore_work);
567
568 i915_schedule_bump_priority(rq, I915_PRIORITY_NOSEMAPHORE);
569 i915_request_put(rq);
570 }
571
572 static int __i915_sw_fence_call
573 semaphore_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state)
574 {
575 struct i915_request *rq = container_of(fence, typeof(*rq), semaphore);
576
577 switch (state) {
578 case FENCE_COMPLETE:
579 if (!(READ_ONCE(rq->sched.attr.priority) & I915_PRIORITY_NOSEMAPHORE)) {
580 i915_request_get(rq);
581 init_irq_work(&rq->semaphore_work, irq_semaphore_cb);
582 irq_work_queue(&rq->semaphore_work);
583 }
584 break;
585
586 case FENCE_FREE:
587 i915_request_put(rq);
588 break;
589 }
590
591 return NOTIFY_DONE;
592 }
593
594 static void retire_requests(struct intel_timeline *tl)
595 {
596 struct i915_request *rq, *rn;
597
598 list_for_each_entry_safe(rq, rn, &tl->requests, link)
599 if (!i915_request_retire(rq))
600 break;
601 }
602
603 static noinline struct i915_request *
604 request_alloc_slow(struct intel_timeline *tl, gfp_t gfp)
605 {
606 struct i915_request *rq;
607
608 if (list_empty(&tl->requests))
609 goto out;
610
611 if (!gfpflags_allow_blocking(gfp))
612 goto out;
613
614
615 rq = list_first_entry(&tl->requests, typeof(*rq), link);
616 i915_request_retire(rq);
617
618 rq = kmem_cache_alloc(global.slab_requests,
619 gfp | __GFP_RETRY_MAYFAIL | __GFP_NOWARN);
620 if (rq)
621 return rq;
622
623
624 rq = list_last_entry(&tl->requests, typeof(*rq), link);
625 cond_synchronize_rcu(rq->rcustate);
626
627
628 retire_requests(tl);
629
630 out:
631 return kmem_cache_alloc(global.slab_requests, gfp);
632 }
633
634 struct i915_request *
635 __i915_request_create(struct intel_context *ce, gfp_t gfp)
636 {
637 struct intel_timeline *tl = ce->timeline;
638 struct i915_request *rq;
639 u32 seqno;
640 int ret;
641
642 might_sleep_if(gfpflags_allow_blocking(gfp));
643
644
645 __intel_context_pin(ce);
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676 rq = kmem_cache_alloc(global.slab_requests,
677 gfp | __GFP_RETRY_MAYFAIL | __GFP_NOWARN);
678 if (unlikely(!rq)) {
679 rq = request_alloc_slow(tl, gfp);
680 if (!rq) {
681 ret = -ENOMEM;
682 goto err_unreserve;
683 }
684 }
685
686 ret = intel_timeline_get_seqno(tl, rq, &seqno);
687 if (ret)
688 goto err_free;
689
690 rq->i915 = ce->engine->i915;
691 rq->hw_context = ce;
692 rq->gem_context = ce->gem_context;
693 rq->engine = ce->engine;
694 rq->ring = ce->ring;
695 rq->timeline = tl;
696 rq->hwsp_seqno = tl->hwsp_seqno;
697 rq->hwsp_cacheline = tl->hwsp_cacheline;
698 rq->rcustate = get_state_synchronize_rcu();
699
700 spin_lock_init(&rq->lock);
701 dma_fence_init(&rq->fence, &i915_fence_ops, &rq->lock,
702 tl->fence_context, seqno);
703
704
705 i915_sw_fence_init(&i915_request_get(rq)->submit, submit_notify);
706 i915_sw_fence_init(&i915_request_get(rq)->semaphore, semaphore_notify);
707
708 i915_sched_node_init(&rq->sched);
709
710
711 rq->file_priv = NULL;
712 rq->batch = NULL;
713 rq->capture_list = NULL;
714 rq->flags = 0;
715 rq->execution_mask = ALL_ENGINES;
716
717 INIT_LIST_HEAD(&rq->active_list);
718 INIT_LIST_HEAD(&rq->execute_cb);
719
720
721
722
723
724
725
726
727
728
729
730
731
732 rq->reserved_space =
733 2 * rq->engine->emit_fini_breadcrumb_dw * sizeof(u32);
734
735
736
737
738
739
740
741 rq->head = rq->ring->emit;
742
743 ret = rq->engine->request_alloc(rq);
744 if (ret)
745 goto err_unwind;
746
747 rq->infix = rq->ring->emit;
748
749 intel_context_mark_active(ce);
750 return rq;
751
752 err_unwind:
753 ce->ring->emit = rq->head;
754
755
756 GEM_BUG_ON(!list_empty(&rq->active_list));
757 GEM_BUG_ON(!list_empty(&rq->sched.signalers_list));
758 GEM_BUG_ON(!list_empty(&rq->sched.waiters_list));
759
760 err_free:
761 kmem_cache_free(global.slab_requests, rq);
762 err_unreserve:
763 intel_context_unpin(ce);
764 return ERR_PTR(ret);
765 }
766
767 struct i915_request *
768 i915_request_create(struct intel_context *ce)
769 {
770 struct i915_request *rq;
771 struct intel_timeline *tl;
772
773 tl = intel_context_timeline_lock(ce);
774 if (IS_ERR(tl))
775 return ERR_CAST(tl);
776
777
778 rq = list_first_entry(&tl->requests, typeof(*rq), link);
779 if (!list_is_last(&rq->link, &tl->requests))
780 i915_request_retire(rq);
781
782 intel_context_enter(ce);
783 rq = __i915_request_create(ce, GFP_KERNEL);
784 intel_context_exit(ce);
785 if (IS_ERR(rq))
786 goto err_unlock;
787
788
789 rq->cookie = lockdep_pin_lock(&tl->mutex);
790
791 return rq;
792
793 err_unlock:
794 intel_context_timeline_unlock(tl);
795 return rq;
796 }
797
798 static int
799 i915_request_await_start(struct i915_request *rq, struct i915_request *signal)
800 {
801 if (list_is_first(&signal->link, &signal->timeline->requests))
802 return 0;
803
804 signal = list_prev_entry(signal, link);
805 if (intel_timeline_sync_is_later(rq->timeline, &signal->fence))
806 return 0;
807
808 return i915_sw_fence_await_dma_fence(&rq->submit,
809 &signal->fence, 0,
810 I915_FENCE_GFP);
811 }
812
813 static intel_engine_mask_t
814 already_busywaiting(struct i915_request *rq)
815 {
816
817
818
819
820
821
822
823
824
825
826
827
828 return rq->sched.semaphores | rq->engine->saturated;
829 }
830
831 static int
832 emit_semaphore_wait(struct i915_request *to,
833 struct i915_request *from,
834 gfp_t gfp)
835 {
836 u32 hwsp_offset;
837 u32 *cs;
838 int err;
839
840 GEM_BUG_ON(!from->timeline->has_initial_breadcrumb);
841 GEM_BUG_ON(INTEL_GEN(to->i915) < 8);
842
843
844 if (already_busywaiting(to) & from->engine->mask)
845 return i915_sw_fence_await_dma_fence(&to->submit,
846 &from->fence, 0,
847 I915_FENCE_GFP);
848
849 err = i915_request_await_start(to, from);
850 if (err < 0)
851 return err;
852
853
854 err = __i915_request_await_execution(to, from, NULL, gfp);
855 if (err)
856 return err;
857
858
859 err = intel_timeline_read_hwsp(from, to, &hwsp_offset);
860 if (err)
861 return err;
862
863 cs = intel_ring_begin(to, 4);
864 if (IS_ERR(cs))
865 return PTR_ERR(cs);
866
867
868
869
870
871
872
873
874
875 *cs++ = MI_SEMAPHORE_WAIT |
876 MI_SEMAPHORE_GLOBAL_GTT |
877 MI_SEMAPHORE_POLL |
878 MI_SEMAPHORE_SAD_GTE_SDD;
879 *cs++ = from->fence.seqno;
880 *cs++ = hwsp_offset;
881 *cs++ = 0;
882
883 intel_ring_advance(to, cs);
884 to->sched.semaphores |= from->engine->mask;
885 to->sched.flags |= I915_SCHED_HAS_SEMAPHORE_CHAIN;
886 return 0;
887 }
888
889 static int
890 i915_request_await_request(struct i915_request *to, struct i915_request *from)
891 {
892 int ret;
893
894 GEM_BUG_ON(to == from);
895 GEM_BUG_ON(to->timeline == from->timeline);
896
897 if (i915_request_completed(from)) {
898 i915_sw_fence_set_error_once(&to->submit, from->fence.error);
899 return 0;
900 }
901
902 if (to->engine->schedule) {
903 ret = i915_sched_node_add_dependency(&to->sched, &from->sched);
904 if (ret < 0)
905 return ret;
906 }
907
908 if (to->engine == from->engine) {
909 ret = i915_sw_fence_await_sw_fence_gfp(&to->submit,
910 &from->submit,
911 I915_FENCE_GFP);
912 } else if (intel_engine_has_semaphores(to->engine) &&
913 to->gem_context->sched.priority >= I915_PRIORITY_NORMAL) {
914 ret = emit_semaphore_wait(to, from, I915_FENCE_GFP);
915 } else {
916 ret = i915_sw_fence_await_dma_fence(&to->submit,
917 &from->fence, 0,
918 I915_FENCE_GFP);
919 }
920 if (ret < 0)
921 return ret;
922
923 if (to->sched.flags & I915_SCHED_HAS_SEMAPHORE_CHAIN) {
924 ret = i915_sw_fence_await_dma_fence(&to->semaphore,
925 &from->fence, 0,
926 I915_FENCE_GFP);
927 if (ret < 0)
928 return ret;
929 }
930
931 return 0;
932 }
933
934 int
935 i915_request_await_dma_fence(struct i915_request *rq, struct dma_fence *fence)
936 {
937 struct dma_fence **child = &fence;
938 unsigned int nchild = 1;
939 int ret;
940
941
942
943
944
945
946
947
948
949 if (dma_fence_is_array(fence)) {
950 struct dma_fence_array *array = to_dma_fence_array(fence);
951
952 child = array->fences;
953 nchild = array->num_fences;
954 GEM_BUG_ON(!nchild);
955 }
956
957 do {
958 fence = *child++;
959 if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
960 continue;
961
962
963
964
965
966
967 if (fence->context == rq->fence.context)
968 continue;
969
970
971 if (fence->context &&
972 intel_timeline_sync_is_later(rq->timeline, fence))
973 continue;
974
975 if (dma_fence_is_i915(fence))
976 ret = i915_request_await_request(rq, to_request(fence));
977 else
978 ret = i915_sw_fence_await_dma_fence(&rq->submit, fence,
979 I915_FENCE_TIMEOUT,
980 I915_FENCE_GFP);
981 if (ret < 0)
982 return ret;
983
984
985 if (fence->context)
986 intel_timeline_sync_set(rq->timeline, fence);
987 } while (--nchild);
988
989 return 0;
990 }
991
992 int
993 i915_request_await_execution(struct i915_request *rq,
994 struct dma_fence *fence,
995 void (*hook)(struct i915_request *rq,
996 struct dma_fence *signal))
997 {
998 struct dma_fence **child = &fence;
999 unsigned int nchild = 1;
1000 int ret;
1001
1002 if (dma_fence_is_array(fence)) {
1003 struct dma_fence_array *array = to_dma_fence_array(fence);
1004
1005
1006
1007 child = array->fences;
1008 nchild = array->num_fences;
1009 GEM_BUG_ON(!nchild);
1010 }
1011
1012 do {
1013 fence = *child++;
1014 if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
1015 continue;
1016
1017
1018
1019
1020
1021
1022 if (dma_fence_is_i915(fence))
1023 ret = __i915_request_await_execution(rq,
1024 to_request(fence),
1025 hook,
1026 I915_FENCE_GFP);
1027 else
1028 ret = i915_sw_fence_await_dma_fence(&rq->submit, fence,
1029 I915_FENCE_TIMEOUT,
1030 GFP_KERNEL);
1031 if (ret < 0)
1032 return ret;
1033 } while (--nchild);
1034
1035 return 0;
1036 }
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058 int
1059 i915_request_await_object(struct i915_request *to,
1060 struct drm_i915_gem_object *obj,
1061 bool write)
1062 {
1063 struct dma_fence *excl;
1064 int ret = 0;
1065
1066 if (write) {
1067 struct dma_fence **shared;
1068 unsigned int count, i;
1069
1070 ret = dma_resv_get_fences_rcu(obj->base.resv,
1071 &excl, &count, &shared);
1072 if (ret)
1073 return ret;
1074
1075 for (i = 0; i < count; i++) {
1076 ret = i915_request_await_dma_fence(to, shared[i]);
1077 if (ret)
1078 break;
1079
1080 dma_fence_put(shared[i]);
1081 }
1082
1083 for (; i < count; i++)
1084 dma_fence_put(shared[i]);
1085 kfree(shared);
1086 } else {
1087 excl = dma_resv_get_excl_rcu(obj->base.resv);
1088 }
1089
1090 if (excl) {
1091 if (ret == 0)
1092 ret = i915_request_await_dma_fence(to, excl);
1093
1094 dma_fence_put(excl);
1095 }
1096
1097 return ret;
1098 }
1099
1100 void i915_request_skip(struct i915_request *rq, int error)
1101 {
1102 void *vaddr = rq->ring->vaddr;
1103 u32 head;
1104
1105 GEM_BUG_ON(!IS_ERR_VALUE((long)error));
1106 dma_fence_set_error(&rq->fence, error);
1107
1108 if (rq->infix == rq->postfix)
1109 return;
1110
1111
1112
1113
1114
1115
1116 head = rq->infix;
1117 if (rq->postfix < head) {
1118 memset(vaddr + head, 0, rq->ring->size - head);
1119 head = 0;
1120 }
1121 memset(vaddr + head, 0, rq->postfix - head);
1122 rq->infix = rq->postfix;
1123 }
1124
1125 static struct i915_request *
1126 __i915_request_add_to_timeline(struct i915_request *rq)
1127 {
1128 struct intel_timeline *timeline = rq->timeline;
1129 struct i915_request *prev;
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151 prev = rcu_dereference_protected(timeline->last_request.request,
1152 lockdep_is_held(&timeline->mutex));
1153 if (prev && !i915_request_completed(prev)) {
1154 if (is_power_of_2(prev->engine->mask | rq->engine->mask))
1155 i915_sw_fence_await_sw_fence(&rq->submit,
1156 &prev->submit,
1157 &rq->submitq);
1158 else
1159 __i915_sw_fence_await_dma_fence(&rq->submit,
1160 &prev->fence,
1161 &rq->dmaq);
1162 if (rq->engine->schedule)
1163 __i915_sched_node_add_dependency(&rq->sched,
1164 &prev->sched,
1165 &rq->dep,
1166 0);
1167 }
1168
1169 list_add_tail(&rq->link, &timeline->requests);
1170
1171
1172
1173
1174
1175
1176 GEM_BUG_ON(timeline->seqno != rq->fence.seqno);
1177 __i915_active_request_set(&timeline->last_request, rq);
1178
1179 return prev;
1180 }
1181
1182
1183
1184
1185
1186
1187 struct i915_request *__i915_request_commit(struct i915_request *rq)
1188 {
1189 struct intel_engine_cs *engine = rq->engine;
1190 struct intel_ring *ring = rq->ring;
1191 u32 *cs;
1192
1193 GEM_TRACE("%s fence %llx:%lld\n",
1194 engine->name, rq->fence.context, rq->fence.seqno);
1195
1196
1197
1198
1199
1200
1201 GEM_BUG_ON(rq->reserved_space > ring->space);
1202 rq->reserved_space = 0;
1203 rq->emitted_jiffies = jiffies;
1204
1205
1206
1207
1208
1209
1210
1211 cs = intel_ring_begin(rq, engine->emit_fini_breadcrumb_dw);
1212 GEM_BUG_ON(IS_ERR(cs));
1213 rq->postfix = intel_ring_offset(rq, cs);
1214
1215 return __i915_request_add_to_timeline(rq);
1216 }
1217
1218 void __i915_request_queue(struct i915_request *rq,
1219 const struct i915_sched_attr *attr)
1220 {
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232 if (attr && rq->engine->schedule)
1233 rq->engine->schedule(rq, attr);
1234 i915_sw_fence_commit(&rq->semaphore);
1235 i915_sw_fence_commit(&rq->submit);
1236 }
1237
1238 void i915_request_add(struct i915_request *rq)
1239 {
1240 struct i915_sched_attr attr = rq->gem_context->sched;
1241 struct intel_timeline * const tl = rq->timeline;
1242 struct i915_request *prev;
1243
1244 lockdep_assert_held(&tl->mutex);
1245 lockdep_unpin_lock(&tl->mutex, rq->cookie);
1246
1247 trace_i915_request_add(rq);
1248
1249 prev = __i915_request_commit(rq);
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263 if (!(rq->sched.flags & I915_SCHED_HAS_SEMAPHORE_CHAIN))
1264 attr.priority |= I915_PRIORITY_NOSEMAPHORE;
1265
1266
1267
1268
1269
1270
1271
1272 if (list_empty(&rq->sched.signalers_list))
1273 attr.priority |= I915_PRIORITY_WAIT;
1274
1275 local_bh_disable();
1276 __i915_request_queue(rq, &attr);
1277 local_bh_enable();
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296 if (prev && i915_request_completed(prev) && prev->timeline == tl)
1297 i915_request_retire_upto(prev);
1298
1299 mutex_unlock(&tl->mutex);
1300 }
1301
1302 static unsigned long local_clock_us(unsigned int *cpu)
1303 {
1304 unsigned long t;
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318 *cpu = get_cpu();
1319 t = local_clock() >> 10;
1320 put_cpu();
1321
1322 return t;
1323 }
1324
1325 static bool busywait_stop(unsigned long timeout, unsigned int cpu)
1326 {
1327 unsigned int this_cpu;
1328
1329 if (time_after(local_clock_us(&this_cpu), timeout))
1330 return true;
1331
1332 return this_cpu != cpu;
1333 }
1334
1335 static bool __i915_spin_request(const struct i915_request * const rq,
1336 int state, unsigned long timeout_us)
1337 {
1338 unsigned int cpu;
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351 if (!i915_request_is_running(rq))
1352 return false;
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365 timeout_us += local_clock_us(&cpu);
1366 do {
1367 if (i915_request_completed(rq))
1368 return true;
1369
1370 if (signal_pending_state(state, current))
1371 break;
1372
1373 if (busywait_stop(timeout_us, cpu))
1374 break;
1375
1376 cpu_relax();
1377 } while (!need_resched());
1378
1379 return false;
1380 }
1381
1382 struct request_wait {
1383 struct dma_fence_cb cb;
1384 struct task_struct *tsk;
1385 };
1386
1387 static void request_wait_wake(struct dma_fence *fence, struct dma_fence_cb *cb)
1388 {
1389 struct request_wait *wait = container_of(cb, typeof(*wait), cb);
1390
1391 wake_up_process(wait->tsk);
1392 }
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409 long i915_request_wait(struct i915_request *rq,
1410 unsigned int flags,
1411 long timeout)
1412 {
1413 const int state = flags & I915_WAIT_INTERRUPTIBLE ?
1414 TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE;
1415 struct request_wait wait;
1416
1417 might_sleep();
1418 GEM_BUG_ON(timeout < 0);
1419
1420 if (dma_fence_is_signaled(&rq->fence))
1421 return timeout;
1422
1423 if (!timeout)
1424 return -ETIME;
1425
1426 trace_i915_request_wait_begin(rq, flags);
1427
1428
1429
1430
1431
1432
1433
1434 mutex_acquire(&rq->engine->gt->reset.mutex.dep_map, 0, 0, _THIS_IP_);
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459 if (CONFIG_DRM_I915_SPIN_REQUEST &&
1460 __i915_spin_request(rq, state, CONFIG_DRM_I915_SPIN_REQUEST)) {
1461 dma_fence_signal(&rq->fence);
1462 goto out;
1463 }
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477 if (flags & I915_WAIT_PRIORITY) {
1478 if (!i915_request_started(rq) && INTEL_GEN(rq->i915) >= 6)
1479 gen6_rps_boost(rq);
1480 i915_schedule_bump_priority(rq, I915_PRIORITY_WAIT);
1481 }
1482
1483 wait.tsk = current;
1484 if (dma_fence_add_callback(&rq->fence, &wait.cb, request_wait_wake))
1485 goto out;
1486
1487 for (;;) {
1488 set_current_state(state);
1489
1490 if (i915_request_completed(rq)) {
1491 dma_fence_signal(&rq->fence);
1492 break;
1493 }
1494
1495 if (signal_pending_state(state, current)) {
1496 timeout = -ERESTARTSYS;
1497 break;
1498 }
1499
1500 if (!timeout) {
1501 timeout = -ETIME;
1502 break;
1503 }
1504
1505 timeout = io_schedule_timeout(timeout);
1506 }
1507 __set_current_state(TASK_RUNNING);
1508
1509 dma_fence_remove_callback(&rq->fence, &wait.cb);
1510
1511 out:
1512 mutex_release(&rq->engine->gt->reset.mutex.dep_map, 0, _THIS_IP_);
1513 trace_i915_request_wait_end(rq);
1514 return timeout;
1515 }
1516
1517 bool i915_retire_requests(struct drm_i915_private *i915)
1518 {
1519 struct intel_gt_timelines *timelines = &i915->gt.timelines;
1520 struct intel_timeline *tl, *tn;
1521 unsigned long flags;
1522 LIST_HEAD(free);
1523
1524 spin_lock_irqsave(&timelines->lock, flags);
1525 list_for_each_entry_safe(tl, tn, &timelines->active_list, link) {
1526 if (!mutex_trylock(&tl->mutex))
1527 continue;
1528
1529 intel_timeline_get(tl);
1530 GEM_BUG_ON(!tl->active_count);
1531 tl->active_count++;
1532 spin_unlock_irqrestore(&timelines->lock, flags);
1533
1534 retire_requests(tl);
1535
1536 spin_lock_irqsave(&timelines->lock, flags);
1537
1538
1539 list_safe_reset_next(tl, tn, link);
1540 if (!--tl->active_count)
1541 list_del(&tl->link);
1542
1543 mutex_unlock(&tl->mutex);
1544
1545
1546 if (refcount_dec_and_test(&tl->kref.refcount)) {
1547 GEM_BUG_ON(tl->active_count);
1548 list_add(&tl->link, &free);
1549 }
1550 }
1551 spin_unlock_irqrestore(&timelines->lock, flags);
1552
1553 list_for_each_entry_safe(tl, tn, &free, link)
1554 __intel_timeline_free(&tl->kref);
1555
1556 return !list_empty(&timelines->active_list);
1557 }
1558
1559 #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
1560 #include "selftests/mock_request.c"
1561 #include "selftests/i915_request.c"
1562 #endif
1563
1564 static void i915_global_request_shrink(void)
1565 {
1566 kmem_cache_shrink(global.slab_dependencies);
1567 kmem_cache_shrink(global.slab_execute_cbs);
1568 kmem_cache_shrink(global.slab_requests);
1569 }
1570
1571 static void i915_global_request_exit(void)
1572 {
1573 kmem_cache_destroy(global.slab_dependencies);
1574 kmem_cache_destroy(global.slab_execute_cbs);
1575 kmem_cache_destroy(global.slab_requests);
1576 }
1577
1578 static struct i915_global_request global = { {
1579 .shrink = i915_global_request_shrink,
1580 .exit = i915_global_request_exit,
1581 } };
1582
1583 int __init i915_global_request_init(void)
1584 {
1585 global.slab_requests = KMEM_CACHE(i915_request,
1586 SLAB_HWCACHE_ALIGN |
1587 SLAB_RECLAIM_ACCOUNT |
1588 SLAB_TYPESAFE_BY_RCU);
1589 if (!global.slab_requests)
1590 return -ENOMEM;
1591
1592 global.slab_execute_cbs = KMEM_CACHE(execute_cb,
1593 SLAB_HWCACHE_ALIGN |
1594 SLAB_RECLAIM_ACCOUNT |
1595 SLAB_TYPESAFE_BY_RCU);
1596 if (!global.slab_execute_cbs)
1597 goto err_requests;
1598
1599 global.slab_dependencies = KMEM_CACHE(i915_dependency,
1600 SLAB_HWCACHE_ALIGN |
1601 SLAB_RECLAIM_ACCOUNT);
1602 if (!global.slab_dependencies)
1603 goto err_execute_cbs;
1604
1605 i915_global_register(&global.base);
1606 return 0;
1607
1608 err_execute_cbs:
1609 kmem_cache_destroy(global.slab_execute_cbs);
1610 err_requests:
1611 kmem_cache_destroy(global.slab_requests);
1612 return -ENOMEM;
1613 }