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
41struct 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
49static 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
56static const char *i915_fence_get_driver_name(struct dma_fence *fence)
57{
58 return "i915";
59}
60
61static 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
78static bool i915_fence_signaled(struct dma_fence *fence)
79{
80 return i915_request_completed(to_request(fence));
81}
82
83static bool i915_fence_enable_signaling(struct dma_fence *fence)
84{
85 return i915_request_enable_breadcrumb(to_request(fence));
86}
87
88static 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
97static 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
114const 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
123static 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
131static 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
142static 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
167static inline void
168remove_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
184static 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
197static 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
218static 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
317void 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
335static 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
380bool __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
442xfer:
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
460void 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
473void __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
516void 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
529static int __i915_sw_fence_call
530submit_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
563static int __i915_sw_fence_call
564semaphore_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state)
565{
566 struct i915_request *request =
567 container_of(fence, typeof(*request), semaphore);
568
569 switch (state) {
570 case FENCE_COMPLETE:
571 i915_schedule_bump_priority(request, I915_PRIORITY_NOSEMAPHORE);
572 break;
573
574 case FENCE_FREE:
575 i915_request_put(request);
576 break;
577 }
578
579 return NOTIFY_DONE;
580}
581
582static void retire_requests(struct intel_timeline *tl)
583{
584 struct i915_request *rq, *rn;
585
586 list_for_each_entry_safe(rq, rn, &tl->requests, link)
587 if (!i915_request_retire(rq))
588 break;
589}
590
591static noinline struct i915_request *
592request_alloc_slow(struct intel_timeline *tl, gfp_t gfp)
593{
594 struct i915_request *rq;
595
596 if (list_empty(&tl->requests))
597 goto out;
598
599 if (!gfpflags_allow_blocking(gfp))
600 goto out;
601
602
603 rq = list_first_entry(&tl->requests, typeof(*rq), link);
604 i915_request_retire(rq);
605
606 rq = kmem_cache_alloc(global.slab_requests,
607 gfp | __GFP_RETRY_MAYFAIL | __GFP_NOWARN);
608 if (rq)
609 return rq;
610
611
612 rq = list_last_entry(&tl->requests, typeof(*rq), link);
613 cond_synchronize_rcu(rq->rcustate);
614
615
616 retire_requests(tl);
617
618out:
619 return kmem_cache_alloc(global.slab_requests, gfp);
620}
621
622struct i915_request *
623__i915_request_create(struct intel_context *ce, gfp_t gfp)
624{
625 struct intel_timeline *tl = ce->timeline;
626 struct i915_request *rq;
627 u32 seqno;
628 int ret;
629
630 might_sleep_if(gfpflags_allow_blocking(gfp));
631
632
633 __intel_context_pin(ce);
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664 rq = kmem_cache_alloc(global.slab_requests,
665 gfp | __GFP_RETRY_MAYFAIL | __GFP_NOWARN);
666 if (unlikely(!rq)) {
667 rq = request_alloc_slow(tl, gfp);
668 if (!rq) {
669 ret = -ENOMEM;
670 goto err_unreserve;
671 }
672 }
673
674 ret = intel_timeline_get_seqno(tl, rq, &seqno);
675 if (ret)
676 goto err_free;
677
678 rq->i915 = ce->engine->i915;
679 rq->hw_context = ce;
680 rq->gem_context = ce->gem_context;
681 rq->engine = ce->engine;
682 rq->ring = ce->ring;
683 rq->timeline = tl;
684 rq->hwsp_seqno = tl->hwsp_seqno;
685 rq->hwsp_cacheline = tl->hwsp_cacheline;
686 rq->rcustate = get_state_synchronize_rcu();
687
688 spin_lock_init(&rq->lock);
689 dma_fence_init(&rq->fence, &i915_fence_ops, &rq->lock,
690 tl->fence_context, seqno);
691
692
693 i915_sw_fence_init(&i915_request_get(rq)->submit, submit_notify);
694 i915_sw_fence_init(&i915_request_get(rq)->semaphore, semaphore_notify);
695
696 i915_sched_node_init(&rq->sched);
697
698
699 rq->file_priv = NULL;
700 rq->batch = NULL;
701 rq->capture_list = NULL;
702 rq->flags = 0;
703 rq->execution_mask = ALL_ENGINES;
704
705 INIT_LIST_HEAD(&rq->active_list);
706 INIT_LIST_HEAD(&rq->execute_cb);
707
708
709
710
711
712
713
714
715
716
717
718
719
720 rq->reserved_space =
721 2 * rq->engine->emit_fini_breadcrumb_dw * sizeof(u32);
722
723
724
725
726
727
728
729 rq->head = rq->ring->emit;
730
731 ret = rq->engine->request_alloc(rq);
732 if (ret)
733 goto err_unwind;
734
735 rq->infix = rq->ring->emit;
736
737 intel_context_mark_active(ce);
738 return rq;
739
740err_unwind:
741 ce->ring->emit = rq->head;
742
743
744 GEM_BUG_ON(!list_empty(&rq->active_list));
745 GEM_BUG_ON(!list_empty(&rq->sched.signalers_list));
746 GEM_BUG_ON(!list_empty(&rq->sched.waiters_list));
747
748err_free:
749 kmem_cache_free(global.slab_requests, rq);
750err_unreserve:
751 intel_context_unpin(ce);
752 return ERR_PTR(ret);
753}
754
755struct i915_request *
756i915_request_create(struct intel_context *ce)
757{
758 struct i915_request *rq;
759 struct intel_timeline *tl;
760
761 tl = intel_context_timeline_lock(ce);
762 if (IS_ERR(tl))
763 return ERR_CAST(tl);
764
765
766 rq = list_first_entry(&tl->requests, typeof(*rq), link);
767 if (!list_is_last(&rq->link, &tl->requests))
768 i915_request_retire(rq);
769
770 intel_context_enter(ce);
771 rq = __i915_request_create(ce, GFP_KERNEL);
772 intel_context_exit(ce);
773 if (IS_ERR(rq))
774 goto err_unlock;
775
776
777 rq->cookie = lockdep_pin_lock(&tl->mutex);
778
779 return rq;
780
781err_unlock:
782 intel_context_timeline_unlock(tl);
783 return rq;
784}
785
786static int
787i915_request_await_start(struct i915_request *rq, struct i915_request *signal)
788{
789 if (list_is_first(&signal->link, &signal->timeline->requests))
790 return 0;
791
792 signal = list_prev_entry(signal, link);
793 if (intel_timeline_sync_is_later(rq->timeline, &signal->fence))
794 return 0;
795
796 return i915_sw_fence_await_dma_fence(&rq->submit,
797 &signal->fence, 0,
798 I915_FENCE_GFP);
799}
800
801static intel_engine_mask_t
802already_busywaiting(struct i915_request *rq)
803{
804
805
806
807
808
809
810
811
812
813
814
815
816 return rq->sched.semaphores | rq->engine->saturated;
817}
818
819static int
820emit_semaphore_wait(struct i915_request *to,
821 struct i915_request *from,
822 gfp_t gfp)
823{
824 u32 hwsp_offset;
825 u32 *cs;
826 int err;
827
828 GEM_BUG_ON(!from->timeline->has_initial_breadcrumb);
829 GEM_BUG_ON(INTEL_GEN(to->i915) < 8);
830
831
832 if (already_busywaiting(to) & from->engine->mask)
833 return i915_sw_fence_await_dma_fence(&to->submit,
834 &from->fence, 0,
835 I915_FENCE_GFP);
836
837 err = i915_request_await_start(to, from);
838 if (err < 0)
839 return err;
840
841
842 err = __i915_request_await_execution(to, from, NULL, gfp);
843 if (err)
844 return err;
845
846
847 err = intel_timeline_read_hwsp(from, to, &hwsp_offset);
848 if (err)
849 return err;
850
851 cs = intel_ring_begin(to, 4);
852 if (IS_ERR(cs))
853 return PTR_ERR(cs);
854
855
856
857
858
859
860
861
862
863 *cs++ = MI_SEMAPHORE_WAIT |
864 MI_SEMAPHORE_GLOBAL_GTT |
865 MI_SEMAPHORE_POLL |
866 MI_SEMAPHORE_SAD_GTE_SDD;
867 *cs++ = from->fence.seqno;
868 *cs++ = hwsp_offset;
869 *cs++ = 0;
870
871 intel_ring_advance(to, cs);
872 to->sched.semaphores |= from->engine->mask;
873 to->sched.flags |= I915_SCHED_HAS_SEMAPHORE_CHAIN;
874 return 0;
875}
876
877static int
878i915_request_await_request(struct i915_request *to, struct i915_request *from)
879{
880 int ret;
881
882 GEM_BUG_ON(to == from);
883 GEM_BUG_ON(to->timeline == from->timeline);
884
885 if (i915_request_completed(from))
886 return 0;
887
888 if (to->engine->schedule) {
889 ret = i915_sched_node_add_dependency(&to->sched, &from->sched);
890 if (ret < 0)
891 return ret;
892 }
893
894 if (to->engine == from->engine) {
895 ret = i915_sw_fence_await_sw_fence_gfp(&to->submit,
896 &from->submit,
897 I915_FENCE_GFP);
898 } else if (intel_engine_has_semaphores(to->engine) &&
899 to->gem_context->sched.priority >= I915_PRIORITY_NORMAL) {
900 ret = emit_semaphore_wait(to, from, I915_FENCE_GFP);
901 } else {
902 ret = i915_sw_fence_await_dma_fence(&to->submit,
903 &from->fence, 0,
904 I915_FENCE_GFP);
905 }
906 if (ret < 0)
907 return ret;
908
909 if (to->sched.flags & I915_SCHED_HAS_SEMAPHORE_CHAIN) {
910 ret = i915_sw_fence_await_dma_fence(&to->semaphore,
911 &from->fence, 0,
912 I915_FENCE_GFP);
913 if (ret < 0)
914 return ret;
915 }
916
917 return 0;
918}
919
920int
921i915_request_await_dma_fence(struct i915_request *rq, struct dma_fence *fence)
922{
923 struct dma_fence **child = &fence;
924 unsigned int nchild = 1;
925 int ret;
926
927
928
929
930
931
932
933
934
935 if (dma_fence_is_array(fence)) {
936 struct dma_fence_array *array = to_dma_fence_array(fence);
937
938 child = array->fences;
939 nchild = array->num_fences;
940 GEM_BUG_ON(!nchild);
941 }
942
943 do {
944 fence = *child++;
945 if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
946 continue;
947
948
949
950
951
952
953 if (fence->context == rq->fence.context)
954 continue;
955
956
957 if (fence->context &&
958 intel_timeline_sync_is_later(rq->timeline, fence))
959 continue;
960
961 if (dma_fence_is_i915(fence))
962 ret = i915_request_await_request(rq, to_request(fence));
963 else
964 ret = i915_sw_fence_await_dma_fence(&rq->submit, fence,
965 I915_FENCE_TIMEOUT,
966 I915_FENCE_GFP);
967 if (ret < 0)
968 return ret;
969
970
971 if (fence->context)
972 intel_timeline_sync_set(rq->timeline, fence);
973 } while (--nchild);
974
975 return 0;
976}
977
978int
979i915_request_await_execution(struct i915_request *rq,
980 struct dma_fence *fence,
981 void (*hook)(struct i915_request *rq,
982 struct dma_fence *signal))
983{
984 struct dma_fence **child = &fence;
985 unsigned int nchild = 1;
986 int ret;
987
988 if (dma_fence_is_array(fence)) {
989 struct dma_fence_array *array = to_dma_fence_array(fence);
990
991
992
993 child = array->fences;
994 nchild = array->num_fences;
995 GEM_BUG_ON(!nchild);
996 }
997
998 do {
999 fence = *child++;
1000 if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
1001 continue;
1002
1003
1004
1005
1006
1007
1008 if (dma_fence_is_i915(fence))
1009 ret = __i915_request_await_execution(rq,
1010 to_request(fence),
1011 hook,
1012 I915_FENCE_GFP);
1013 else
1014 ret = i915_sw_fence_await_dma_fence(&rq->submit, fence,
1015 I915_FENCE_TIMEOUT,
1016 GFP_KERNEL);
1017 if (ret < 0)
1018 return ret;
1019 } while (--nchild);
1020
1021 return 0;
1022}
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044int
1045i915_request_await_object(struct i915_request *to,
1046 struct drm_i915_gem_object *obj,
1047 bool write)
1048{
1049 struct dma_fence *excl;
1050 int ret = 0;
1051
1052 if (write) {
1053 struct dma_fence **shared;
1054 unsigned int count, i;
1055
1056 ret = dma_resv_get_fences_rcu(obj->base.resv,
1057 &excl, &count, &shared);
1058 if (ret)
1059 return ret;
1060
1061 for (i = 0; i < count; i++) {
1062 ret = i915_request_await_dma_fence(to, shared[i]);
1063 if (ret)
1064 break;
1065
1066 dma_fence_put(shared[i]);
1067 }
1068
1069 for (; i < count; i++)
1070 dma_fence_put(shared[i]);
1071 kfree(shared);
1072 } else {
1073 excl = dma_resv_get_excl_rcu(obj->base.resv);
1074 }
1075
1076 if (excl) {
1077 if (ret == 0)
1078 ret = i915_request_await_dma_fence(to, excl);
1079
1080 dma_fence_put(excl);
1081 }
1082
1083 return ret;
1084}
1085
1086void i915_request_skip(struct i915_request *rq, int error)
1087{
1088 void *vaddr = rq->ring->vaddr;
1089 u32 head;
1090
1091 GEM_BUG_ON(!IS_ERR_VALUE((long)error));
1092 dma_fence_set_error(&rq->fence, error);
1093
1094 if (rq->infix == rq->postfix)
1095 return;
1096
1097
1098
1099
1100
1101
1102 head = rq->infix;
1103 if (rq->postfix < head) {
1104 memset(vaddr + head, 0, rq->ring->size - head);
1105 head = 0;
1106 }
1107 memset(vaddr + head, 0, rq->postfix - head);
1108 rq->infix = rq->postfix;
1109}
1110
1111static struct i915_request *
1112__i915_request_add_to_timeline(struct i915_request *rq)
1113{
1114 struct intel_timeline *timeline = rq->timeline;
1115 struct i915_request *prev;
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137 prev = rcu_dereference_protected(timeline->last_request.request,
1138 lockdep_is_held(&timeline->mutex));
1139 if (prev && !i915_request_completed(prev)) {
1140 if (is_power_of_2(prev->engine->mask | rq->engine->mask))
1141 i915_sw_fence_await_sw_fence(&rq->submit,
1142 &prev->submit,
1143 &rq->submitq);
1144 else
1145 __i915_sw_fence_await_dma_fence(&rq->submit,
1146 &prev->fence,
1147 &rq->dmaq);
1148 if (rq->engine->schedule)
1149 __i915_sched_node_add_dependency(&rq->sched,
1150 &prev->sched,
1151 &rq->dep,
1152 0);
1153 }
1154
1155 list_add_tail(&rq->link, &timeline->requests);
1156
1157
1158
1159
1160
1161
1162 GEM_BUG_ON(timeline->seqno != rq->fence.seqno);
1163 __i915_active_request_set(&timeline->last_request, rq);
1164
1165 return prev;
1166}
1167
1168
1169
1170
1171
1172
1173struct i915_request *__i915_request_commit(struct i915_request *rq)
1174{
1175 struct intel_engine_cs *engine = rq->engine;
1176 struct intel_ring *ring = rq->ring;
1177 u32 *cs;
1178
1179 GEM_TRACE("%s fence %llx:%lld\n",
1180 engine->name, rq->fence.context, rq->fence.seqno);
1181
1182
1183
1184
1185
1186
1187 GEM_BUG_ON(rq->reserved_space > ring->space);
1188 rq->reserved_space = 0;
1189 rq->emitted_jiffies = jiffies;
1190
1191
1192
1193
1194
1195
1196
1197 cs = intel_ring_begin(rq, engine->emit_fini_breadcrumb_dw);
1198 GEM_BUG_ON(IS_ERR(cs));
1199 rq->postfix = intel_ring_offset(rq, cs);
1200
1201 return __i915_request_add_to_timeline(rq);
1202}
1203
1204void __i915_request_queue(struct i915_request *rq,
1205 const struct i915_sched_attr *attr)
1206{
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218 i915_sw_fence_commit(&rq->semaphore);
1219 if (attr && rq->engine->schedule)
1220 rq->engine->schedule(rq, attr);
1221 i915_sw_fence_commit(&rq->submit);
1222}
1223
1224void i915_request_add(struct i915_request *rq)
1225{
1226 struct i915_sched_attr attr = rq->gem_context->sched;
1227 struct intel_timeline * const tl = rq->timeline;
1228 struct i915_request *prev;
1229
1230 lockdep_assert_held(&tl->mutex);
1231 lockdep_unpin_lock(&tl->mutex, rq->cookie);
1232
1233 trace_i915_request_add(rq);
1234
1235 prev = __i915_request_commit(rq);
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249 if (!(rq->sched.flags & I915_SCHED_HAS_SEMAPHORE_CHAIN))
1250 attr.priority |= I915_PRIORITY_NOSEMAPHORE;
1251
1252
1253
1254
1255
1256
1257
1258 if (list_empty(&rq->sched.signalers_list))
1259 attr.priority |= I915_PRIORITY_WAIT;
1260
1261 local_bh_disable();
1262 __i915_request_queue(rq, &attr);
1263 local_bh_enable();
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282 if (prev && i915_request_completed(prev) && prev->timeline == tl)
1283 i915_request_retire_upto(prev);
1284
1285 mutex_unlock(&tl->mutex);
1286}
1287
1288static unsigned long local_clock_us(unsigned int *cpu)
1289{
1290 unsigned long t;
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304 *cpu = get_cpu();
1305 t = local_clock() >> 10;
1306 put_cpu();
1307
1308 return t;
1309}
1310
1311static bool busywait_stop(unsigned long timeout, unsigned int cpu)
1312{
1313 unsigned int this_cpu;
1314
1315 if (time_after(local_clock_us(&this_cpu), timeout))
1316 return true;
1317
1318 return this_cpu != cpu;
1319}
1320
1321static bool __i915_spin_request(const struct i915_request * const rq,
1322 int state, unsigned long timeout_us)
1323{
1324 unsigned int cpu;
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337 if (!i915_request_is_running(rq))
1338 return false;
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351 timeout_us += local_clock_us(&cpu);
1352 do {
1353 if (i915_request_completed(rq))
1354 return true;
1355
1356 if (signal_pending_state(state, current))
1357 break;
1358
1359 if (busywait_stop(timeout_us, cpu))
1360 break;
1361
1362 cpu_relax();
1363 } while (!need_resched());
1364
1365 return false;
1366}
1367
1368struct request_wait {
1369 struct dma_fence_cb cb;
1370 struct task_struct *tsk;
1371};
1372
1373static void request_wait_wake(struct dma_fence *fence, struct dma_fence_cb *cb)
1374{
1375 struct request_wait *wait = container_of(cb, typeof(*wait), cb);
1376
1377 wake_up_process(wait->tsk);
1378}
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395long i915_request_wait(struct i915_request *rq,
1396 unsigned int flags,
1397 long timeout)
1398{
1399 const int state = flags & I915_WAIT_INTERRUPTIBLE ?
1400 TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE;
1401 struct request_wait wait;
1402
1403 might_sleep();
1404 GEM_BUG_ON(timeout < 0);
1405
1406 if (dma_fence_is_signaled(&rq->fence))
1407 return timeout;
1408
1409 if (!timeout)
1410 return -ETIME;
1411
1412 trace_i915_request_wait_begin(rq, flags);
1413
1414
1415
1416
1417
1418
1419
1420 mutex_acquire(&rq->engine->gt->reset.mutex.dep_map, 0, 0, _THIS_IP_);
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445 if (CONFIG_DRM_I915_SPIN_REQUEST &&
1446 __i915_spin_request(rq, state, CONFIG_DRM_I915_SPIN_REQUEST)) {
1447 dma_fence_signal(&rq->fence);
1448 goto out;
1449 }
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463 if (flags & I915_WAIT_PRIORITY) {
1464 if (!i915_request_started(rq) && INTEL_GEN(rq->i915) >= 6)
1465 gen6_rps_boost(rq);
1466 i915_schedule_bump_priority(rq, I915_PRIORITY_WAIT);
1467 }
1468
1469 wait.tsk = current;
1470 if (dma_fence_add_callback(&rq->fence, &wait.cb, request_wait_wake))
1471 goto out;
1472
1473 for (;;) {
1474 set_current_state(state);
1475
1476 if (i915_request_completed(rq)) {
1477 dma_fence_signal(&rq->fence);
1478 break;
1479 }
1480
1481 if (signal_pending_state(state, current)) {
1482 timeout = -ERESTARTSYS;
1483 break;
1484 }
1485
1486 if (!timeout) {
1487 timeout = -ETIME;
1488 break;
1489 }
1490
1491 timeout = io_schedule_timeout(timeout);
1492 }
1493 __set_current_state(TASK_RUNNING);
1494
1495 dma_fence_remove_callback(&rq->fence, &wait.cb);
1496
1497out:
1498 mutex_release(&rq->engine->gt->reset.mutex.dep_map, 0, _THIS_IP_);
1499 trace_i915_request_wait_end(rq);
1500 return timeout;
1501}
1502
1503bool i915_retire_requests(struct drm_i915_private *i915)
1504{
1505 struct intel_gt_timelines *timelines = &i915->gt.timelines;
1506 struct intel_timeline *tl, *tn;
1507 unsigned long flags;
1508 LIST_HEAD(free);
1509
1510 spin_lock_irqsave(&timelines->lock, flags);
1511 list_for_each_entry_safe(tl, tn, &timelines->active_list, link) {
1512 if (!mutex_trylock(&tl->mutex))
1513 continue;
1514
1515 intel_timeline_get(tl);
1516 GEM_BUG_ON(!tl->active_count);
1517 tl->active_count++;
1518 spin_unlock_irqrestore(&timelines->lock, flags);
1519
1520 retire_requests(tl);
1521
1522 spin_lock_irqsave(&timelines->lock, flags);
1523
1524
1525 list_safe_reset_next(tl, tn, link);
1526 if (!--tl->active_count)
1527 list_del(&tl->link);
1528
1529 mutex_unlock(&tl->mutex);
1530
1531
1532 if (refcount_dec_and_test(&tl->kref.refcount)) {
1533 GEM_BUG_ON(tl->active_count);
1534 list_add(&tl->link, &free);
1535 }
1536 }
1537 spin_unlock_irqrestore(&timelines->lock, flags);
1538
1539 list_for_each_entry_safe(tl, tn, &free, link)
1540 __intel_timeline_free(&tl->kref);
1541
1542 return !list_empty(&timelines->active_list);
1543}
1544
1545#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
1546#include "selftests/mock_request.c"
1547#include "selftests/i915_request.c"
1548#endif
1549
1550static void i915_global_request_shrink(void)
1551{
1552 kmem_cache_shrink(global.slab_dependencies);
1553 kmem_cache_shrink(global.slab_execute_cbs);
1554 kmem_cache_shrink(global.slab_requests);
1555}
1556
1557static void i915_global_request_exit(void)
1558{
1559 kmem_cache_destroy(global.slab_dependencies);
1560 kmem_cache_destroy(global.slab_execute_cbs);
1561 kmem_cache_destroy(global.slab_requests);
1562}
1563
1564static struct i915_global_request global = { {
1565 .shrink = i915_global_request_shrink,
1566 .exit = i915_global_request_exit,
1567} };
1568
1569int __init i915_global_request_init(void)
1570{
1571 global.slab_requests = KMEM_CACHE(i915_request,
1572 SLAB_HWCACHE_ALIGN |
1573 SLAB_RECLAIM_ACCOUNT |
1574 SLAB_TYPESAFE_BY_RCU);
1575 if (!global.slab_requests)
1576 return -ENOMEM;
1577
1578 global.slab_execute_cbs = KMEM_CACHE(execute_cb,
1579 SLAB_HWCACHE_ALIGN |
1580 SLAB_RECLAIM_ACCOUNT |
1581 SLAB_TYPESAFE_BY_RCU);
1582 if (!global.slab_execute_cbs)
1583 goto err_requests;
1584
1585 global.slab_dependencies = KMEM_CACHE(i915_dependency,
1586 SLAB_HWCACHE_ALIGN |
1587 SLAB_RECLAIM_ACCOUNT);
1588 if (!global.slab_dependencies)
1589 goto err_execute_cbs;
1590
1591 i915_global_register(&global.base);
1592 return 0;
1593
1594err_execute_cbs:
1595 kmem_cache_destroy(global.slab_execute_cbs);
1596err_requests:
1597 kmem_cache_destroy(global.slab_requests);
1598 return -ENOMEM;
1599}
1600