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