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