0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 #include <linux/dma-fence-array.h>
0026 #include <linux/dma-fence-chain.h>
0027 #include <linux/irq_work.h>
0028 #include <linux/prefetch.h>
0029 #include <linux/sched.h>
0030 #include <linux/sched/clock.h>
0031 #include <linux/sched/signal.h>
0032 #include <linux/sched/mm.h>
0033
0034 #include "gem/i915_gem_context.h"
0035 #include "gt/intel_breadcrumbs.h"
0036 #include "gt/intel_context.h"
0037 #include "gt/intel_engine.h"
0038 #include "gt/intel_engine_heartbeat.h"
0039 #include "gt/intel_engine_regs.h"
0040 #include "gt/intel_gpu_commands.h"
0041 #include "gt/intel_reset.h"
0042 #include "gt/intel_ring.h"
0043 #include "gt/intel_rps.h"
0044
0045 #include "i915_active.h"
0046 #include "i915_deps.h"
0047 #include "i915_driver.h"
0048 #include "i915_drv.h"
0049 #include "i915_trace.h"
0050 #include "intel_pm.h"
0051
0052 struct execute_cb {
0053 struct irq_work work;
0054 struct i915_sw_fence *fence;
0055 struct i915_request *signal;
0056 };
0057
0058 static struct kmem_cache *slab_requests;
0059 static struct kmem_cache *slab_execute_cbs;
0060
0061 static const char *i915_fence_get_driver_name(struct dma_fence *fence)
0062 {
0063 return dev_name(to_request(fence)->i915->drm.dev);
0064 }
0065
0066 static const char *i915_fence_get_timeline_name(struct dma_fence *fence)
0067 {
0068 const struct i915_gem_context *ctx;
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079 if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
0080 return "signaled";
0081
0082 ctx = i915_request_gem_context(to_request(fence));
0083 if (!ctx)
0084 return "[" DRIVER_NAME "]";
0085
0086 return ctx->name;
0087 }
0088
0089 static bool i915_fence_signaled(struct dma_fence *fence)
0090 {
0091 return i915_request_completed(to_request(fence));
0092 }
0093
0094 static bool i915_fence_enable_signaling(struct dma_fence *fence)
0095 {
0096 return i915_request_enable_breadcrumb(to_request(fence));
0097 }
0098
0099 static signed long i915_fence_wait(struct dma_fence *fence,
0100 bool interruptible,
0101 signed long timeout)
0102 {
0103 return i915_request_wait_timeout(to_request(fence),
0104 interruptible | I915_WAIT_PRIORITY,
0105 timeout);
0106 }
0107
0108 struct kmem_cache *i915_request_slab_cache(void)
0109 {
0110 return slab_requests;
0111 }
0112
0113 static void i915_fence_release(struct dma_fence *fence)
0114 {
0115 struct i915_request *rq = to_request(fence);
0116
0117 GEM_BUG_ON(rq->guc_prio != GUC_PRIO_INIT &&
0118 rq->guc_prio != GUC_PRIO_FINI);
0119
0120 i915_request_free_capture_list(fetch_and_zero(&rq->capture_list));
0121 if (rq->batch_res) {
0122 i915_vma_resource_put(rq->batch_res);
0123 rq->batch_res = NULL;
0124 }
0125
0126
0127
0128
0129
0130
0131
0132
0133 i915_sw_fence_fini(&rq->submit);
0134 i915_sw_fence_fini(&rq->semaphore);
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169 if (!intel_engine_is_virtual(rq->engine) &&
0170 is_power_of_2(rq->execution_mask) &&
0171 !cmpxchg(&rq->engine->request_pool, NULL, rq))
0172 return;
0173
0174 kmem_cache_free(slab_requests, rq);
0175 }
0176
0177 const struct dma_fence_ops i915_fence_ops = {
0178 .get_driver_name = i915_fence_get_driver_name,
0179 .get_timeline_name = i915_fence_get_timeline_name,
0180 .enable_signaling = i915_fence_enable_signaling,
0181 .signaled = i915_fence_signaled,
0182 .wait = i915_fence_wait,
0183 .release = i915_fence_release,
0184 };
0185
0186 static void irq_execute_cb(struct irq_work *wrk)
0187 {
0188 struct execute_cb *cb = container_of(wrk, typeof(*cb), work);
0189
0190 i915_sw_fence_complete(cb->fence);
0191 kmem_cache_free(slab_execute_cbs, cb);
0192 }
0193
0194 static __always_inline void
0195 __notify_execute_cb(struct i915_request *rq, bool (*fn)(struct irq_work *wrk))
0196 {
0197 struct execute_cb *cb, *cn;
0198
0199 if (llist_empty(&rq->execute_cb))
0200 return;
0201
0202 llist_for_each_entry_safe(cb, cn,
0203 llist_del_all(&rq->execute_cb),
0204 work.node.llist)
0205 fn(&cb->work);
0206 }
0207
0208 static void __notify_execute_cb_irq(struct i915_request *rq)
0209 {
0210 __notify_execute_cb(rq, irq_work_queue);
0211 }
0212
0213 static bool irq_work_imm(struct irq_work *wrk)
0214 {
0215 wrk->func(wrk);
0216 return false;
0217 }
0218
0219 void i915_request_notify_execute_cb_imm(struct i915_request *rq)
0220 {
0221 __notify_execute_cb(rq, irq_work_imm);
0222 }
0223
0224 static void __i915_request_fill(struct i915_request *rq, u8 val)
0225 {
0226 void *vaddr = rq->ring->vaddr;
0227 u32 head;
0228
0229 head = rq->infix;
0230 if (rq->postfix < head) {
0231 memset(vaddr + head, val, rq->ring->size - head);
0232 head = 0;
0233 }
0234 memset(vaddr + head, val, rq->postfix - head);
0235 }
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247 bool
0248 i915_request_active_engine(struct i915_request *rq,
0249 struct intel_engine_cs **active)
0250 {
0251 struct intel_engine_cs *engine, *locked;
0252 bool ret = false;
0253
0254
0255
0256
0257
0258
0259
0260
0261 locked = READ_ONCE(rq->engine);
0262 spin_lock_irq(&locked->sched_engine->lock);
0263 while (unlikely(locked != (engine = READ_ONCE(rq->engine)))) {
0264 spin_unlock(&locked->sched_engine->lock);
0265 locked = engine;
0266 spin_lock(&locked->sched_engine->lock);
0267 }
0268
0269 if (i915_request_is_active(rq)) {
0270 if (!__i915_request_is_complete(rq))
0271 *active = locked;
0272 ret = true;
0273 }
0274
0275 spin_unlock_irq(&locked->sched_engine->lock);
0276
0277 return ret;
0278 }
0279
0280 static void __rq_init_watchdog(struct i915_request *rq)
0281 {
0282 rq->watchdog.timer.function = NULL;
0283 }
0284
0285 static enum hrtimer_restart __rq_watchdog_expired(struct hrtimer *hrtimer)
0286 {
0287 struct i915_request *rq =
0288 container_of(hrtimer, struct i915_request, watchdog.timer);
0289 struct intel_gt *gt = rq->engine->gt;
0290
0291 if (!i915_request_completed(rq)) {
0292 if (llist_add(&rq->watchdog.link, >->watchdog.list))
0293 schedule_work(>->watchdog.work);
0294 } else {
0295 i915_request_put(rq);
0296 }
0297
0298 return HRTIMER_NORESTART;
0299 }
0300
0301 static void __rq_arm_watchdog(struct i915_request *rq)
0302 {
0303 struct i915_request_watchdog *wdg = &rq->watchdog;
0304 struct intel_context *ce = rq->context;
0305
0306 if (!ce->watchdog.timeout_us)
0307 return;
0308
0309 i915_request_get(rq);
0310
0311 hrtimer_init(&wdg->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
0312 wdg->timer.function = __rq_watchdog_expired;
0313 hrtimer_start_range_ns(&wdg->timer,
0314 ns_to_ktime(ce->watchdog.timeout_us *
0315 NSEC_PER_USEC),
0316 NSEC_PER_MSEC,
0317 HRTIMER_MODE_REL);
0318 }
0319
0320 static void __rq_cancel_watchdog(struct i915_request *rq)
0321 {
0322 struct i915_request_watchdog *wdg = &rq->watchdog;
0323
0324 if (wdg->timer.function && hrtimer_try_to_cancel(&wdg->timer) > 0)
0325 i915_request_put(rq);
0326 }
0327
0328 #if IS_ENABLED(CONFIG_DRM_I915_CAPTURE_ERROR)
0329
0330
0331
0332
0333
0334
0335 void i915_request_free_capture_list(struct i915_capture_list *capture)
0336 {
0337 while (capture) {
0338 struct i915_capture_list *next = capture->next;
0339
0340 i915_vma_resource_put(capture->vma_res);
0341 kfree(capture);
0342 capture = next;
0343 }
0344 }
0345
0346 #define assert_capture_list_is_null(_rq) GEM_BUG_ON((_rq)->capture_list)
0347
0348 #define clear_capture_list(_rq) ((_rq)->capture_list = NULL)
0349
0350 #else
0351
0352 #define i915_request_free_capture_list(_a) do {} while (0)
0353
0354 #define assert_capture_list_is_null(_a) do {} while (0)
0355
0356 #define clear_capture_list(_rq) do {} while (0)
0357
0358 #endif
0359
0360 bool i915_request_retire(struct i915_request *rq)
0361 {
0362 if (!__i915_request_is_complete(rq))
0363 return false;
0364
0365 RQ_TRACE(rq, "\n");
0366
0367 GEM_BUG_ON(!i915_sw_fence_signaled(&rq->submit));
0368 trace_i915_request_retire(rq);
0369 i915_request_mark_complete(rq);
0370
0371 __rq_cancel_watchdog(rq);
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382 GEM_BUG_ON(!list_is_first(&rq->link,
0383 &i915_request_timeline(rq)->requests));
0384 if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM))
0385
0386 __i915_request_fill(rq, POISON_FREE);
0387 rq->ring->head = rq->postfix;
0388
0389 if (!i915_request_signaled(rq)) {
0390 spin_lock_irq(&rq->lock);
0391 dma_fence_signal_locked(&rq->fence);
0392 spin_unlock_irq(&rq->lock);
0393 }
0394
0395 if (test_and_set_bit(I915_FENCE_FLAG_BOOST, &rq->fence.flags))
0396 intel_rps_dec_waiters(&rq->engine->gt->rps);
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408 rq->engine->remove_active_request(rq);
0409 GEM_BUG_ON(!llist_empty(&rq->execute_cb));
0410
0411 __list_del_entry(&rq->link);
0412
0413 intel_context_exit(rq->context);
0414 intel_context_unpin(rq->context);
0415
0416 i915_sched_node_fini(&rq->sched);
0417 i915_request_put(rq);
0418
0419 return true;
0420 }
0421
0422 void i915_request_retire_upto(struct i915_request *rq)
0423 {
0424 struct intel_timeline * const tl = i915_request_timeline(rq);
0425 struct i915_request *tmp;
0426
0427 RQ_TRACE(rq, "\n");
0428 GEM_BUG_ON(!__i915_request_is_complete(rq));
0429
0430 do {
0431 tmp = list_first_entry(&tl->requests, typeof(*tmp), link);
0432 GEM_BUG_ON(!i915_request_completed(tmp));
0433 } while (i915_request_retire(tmp) && tmp != rq);
0434 }
0435
0436 static struct i915_request * const *
0437 __engine_active(struct intel_engine_cs *engine)
0438 {
0439 return READ_ONCE(engine->execlists.active);
0440 }
0441
0442 static bool __request_in_flight(const struct i915_request *signal)
0443 {
0444 struct i915_request * const *port, *rq;
0445 bool inflight = false;
0446
0447 if (!i915_request_is_ready(signal))
0448 return false;
0449
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460
0461
0462
0463
0464
0465
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486 if (!intel_context_inflight(signal->context))
0487 return false;
0488
0489 rcu_read_lock();
0490 for (port = __engine_active(signal->engine);
0491 (rq = READ_ONCE(*port));
0492 port++) {
0493 if (rq->context == signal->context) {
0494 inflight = i915_seqno_passed(rq->fence.seqno,
0495 signal->fence.seqno);
0496 break;
0497 }
0498 }
0499 rcu_read_unlock();
0500
0501 return inflight;
0502 }
0503
0504 static int
0505 __await_execution(struct i915_request *rq,
0506 struct i915_request *signal,
0507 gfp_t gfp)
0508 {
0509 struct execute_cb *cb;
0510
0511 if (i915_request_is_active(signal))
0512 return 0;
0513
0514 cb = kmem_cache_alloc(slab_execute_cbs, gfp);
0515 if (!cb)
0516 return -ENOMEM;
0517
0518 cb->fence = &rq->submit;
0519 i915_sw_fence_await(cb->fence);
0520 init_irq_work(&cb->work, irq_execute_cb);
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535 if (llist_add(&cb->work.node.llist, &signal->execute_cb)) {
0536 if (i915_request_is_active(signal) ||
0537 __request_in_flight(signal))
0538 i915_request_notify_execute_cb_imm(signal);
0539 }
0540
0541 return 0;
0542 }
0543
0544 static bool fatal_error(int error)
0545 {
0546 switch (error) {
0547 case 0:
0548 case -EAGAIN:
0549 case -ETIMEDOUT:
0550 return false;
0551 default:
0552 return true;
0553 }
0554 }
0555
0556 void __i915_request_skip(struct i915_request *rq)
0557 {
0558 GEM_BUG_ON(!fatal_error(rq->fence.error));
0559
0560 if (rq->infix == rq->postfix)
0561 return;
0562
0563 RQ_TRACE(rq, "error: %d\n", rq->fence.error);
0564
0565
0566
0567
0568
0569
0570 __i915_request_fill(rq, 0);
0571 rq->infix = rq->postfix;
0572 }
0573
0574 bool i915_request_set_error_once(struct i915_request *rq, int error)
0575 {
0576 int old;
0577
0578 GEM_BUG_ON(!IS_ERR_VALUE((long)error));
0579
0580 if (i915_request_signaled(rq))
0581 return false;
0582
0583 old = READ_ONCE(rq->fence.error);
0584 do {
0585 if (fatal_error(old))
0586 return false;
0587 } while (!try_cmpxchg(&rq->fence.error, &old, error));
0588
0589 return true;
0590 }
0591
0592 struct i915_request *i915_request_mark_eio(struct i915_request *rq)
0593 {
0594 if (__i915_request_is_complete(rq))
0595 return NULL;
0596
0597 GEM_BUG_ON(i915_request_signaled(rq));
0598
0599
0600 rq = i915_request_get(rq);
0601
0602 i915_request_set_error_once(rq, -EIO);
0603 i915_request_mark_complete(rq);
0604
0605 return rq;
0606 }
0607
0608 bool __i915_request_submit(struct i915_request *request)
0609 {
0610 struct intel_engine_cs *engine = request->engine;
0611 bool result = false;
0612
0613 RQ_TRACE(request, "\n");
0614
0615 GEM_BUG_ON(!irqs_disabled());
0616 lockdep_assert_held(&engine->sched_engine->lock);
0617
0618
0619
0620
0621
0622
0623
0624
0625
0626
0627
0628
0629
0630
0631
0632
0633
0634 if (__i915_request_is_complete(request)) {
0635 list_del_init(&request->sched.link);
0636 goto active;
0637 }
0638
0639 if (unlikely(!intel_context_is_schedulable(request->context)))
0640 i915_request_set_error_once(request, -EIO);
0641
0642 if (unlikely(fatal_error(request->fence.error)))
0643 __i915_request_skip(request);
0644
0645
0646
0647
0648
0649
0650
0651
0652
0653
0654
0655
0656
0657
0658
0659
0660
0661 if (request->sched.semaphores &&
0662 i915_sw_fence_signaled(&request->semaphore))
0663 engine->saturated |= request->sched.semaphores;
0664
0665 engine->emit_fini_breadcrumb(request,
0666 request->ring->vaddr + request->postfix);
0667
0668 trace_i915_request_execute(request);
0669 if (engine->bump_serial)
0670 engine->bump_serial(engine);
0671 else
0672 engine->serial++;
0673
0674 result = true;
0675
0676 GEM_BUG_ON(test_bit(I915_FENCE_FLAG_ACTIVE, &request->fence.flags));
0677 engine->add_active_request(request);
0678 active:
0679 clear_bit(I915_FENCE_FLAG_PQUEUE, &request->fence.flags);
0680 set_bit(I915_FENCE_FLAG_ACTIVE, &request->fence.flags);
0681
0682
0683
0684
0685
0686
0687
0688
0689
0690
0691
0692 __notify_execute_cb_irq(request);
0693
0694
0695 if (test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &request->fence.flags))
0696 i915_request_enable_breadcrumb(request);
0697
0698 return result;
0699 }
0700
0701 void i915_request_submit(struct i915_request *request)
0702 {
0703 struct intel_engine_cs *engine = request->engine;
0704 unsigned long flags;
0705
0706
0707 spin_lock_irqsave(&engine->sched_engine->lock, flags);
0708
0709 __i915_request_submit(request);
0710
0711 spin_unlock_irqrestore(&engine->sched_engine->lock, flags);
0712 }
0713
0714 void __i915_request_unsubmit(struct i915_request *request)
0715 {
0716 struct intel_engine_cs *engine = request->engine;
0717
0718
0719
0720
0721
0722 RQ_TRACE(request, "\n");
0723
0724 GEM_BUG_ON(!irqs_disabled());
0725 lockdep_assert_held(&engine->sched_engine->lock);
0726
0727
0728
0729
0730
0731
0732
0733
0734 GEM_BUG_ON(!test_bit(I915_FENCE_FLAG_ACTIVE, &request->fence.flags));
0735 clear_bit_unlock(I915_FENCE_FLAG_ACTIVE, &request->fence.flags);
0736 if (test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &request->fence.flags))
0737 i915_request_cancel_breadcrumb(request);
0738
0739
0740 if (request->sched.semaphores && __i915_request_has_started(request))
0741 request->sched.semaphores = 0;
0742
0743
0744
0745
0746
0747
0748
0749
0750 }
0751
0752 void i915_request_unsubmit(struct i915_request *request)
0753 {
0754 struct intel_engine_cs *engine = request->engine;
0755 unsigned long flags;
0756
0757
0758 spin_lock_irqsave(&engine->sched_engine->lock, flags);
0759
0760 __i915_request_unsubmit(request);
0761
0762 spin_unlock_irqrestore(&engine->sched_engine->lock, flags);
0763 }
0764
0765 void i915_request_cancel(struct i915_request *rq, int error)
0766 {
0767 if (!i915_request_set_error_once(rq, error))
0768 return;
0769
0770 set_bit(I915_FENCE_FLAG_SENTINEL, &rq->fence.flags);
0771
0772 intel_context_cancel_request(rq->context, rq);
0773 }
0774
0775 static int
0776 submit_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state)
0777 {
0778 struct i915_request *request =
0779 container_of(fence, typeof(*request), submit);
0780
0781 switch (state) {
0782 case FENCE_COMPLETE:
0783 trace_i915_request_submit(request);
0784
0785 if (unlikely(fence->error))
0786 i915_request_set_error_once(request, fence->error);
0787 else
0788 __rq_arm_watchdog(request);
0789
0790
0791
0792
0793
0794
0795
0796
0797
0798 rcu_read_lock();
0799 request->engine->submit_request(request);
0800 rcu_read_unlock();
0801 break;
0802
0803 case FENCE_FREE:
0804 i915_request_put(request);
0805 break;
0806 }
0807
0808 return NOTIFY_DONE;
0809 }
0810
0811 static int
0812 semaphore_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state)
0813 {
0814 struct i915_request *rq = container_of(fence, typeof(*rq), semaphore);
0815
0816 switch (state) {
0817 case FENCE_COMPLETE:
0818 break;
0819
0820 case FENCE_FREE:
0821 i915_request_put(rq);
0822 break;
0823 }
0824
0825 return NOTIFY_DONE;
0826 }
0827
0828 static void retire_requests(struct intel_timeline *tl)
0829 {
0830 struct i915_request *rq, *rn;
0831
0832 list_for_each_entry_safe(rq, rn, &tl->requests, link)
0833 if (!i915_request_retire(rq))
0834 break;
0835 }
0836
0837 static noinline struct i915_request *
0838 request_alloc_slow(struct intel_timeline *tl,
0839 struct i915_request **rsvd,
0840 gfp_t gfp)
0841 {
0842 struct i915_request *rq;
0843
0844
0845 if (!gfpflags_allow_blocking(gfp)) {
0846 rq = xchg(rsvd, NULL);
0847 if (!rq)
0848 goto out;
0849
0850 return rq;
0851 }
0852
0853 if (list_empty(&tl->requests))
0854 goto out;
0855
0856
0857 rq = list_first_entry(&tl->requests, typeof(*rq), link);
0858 i915_request_retire(rq);
0859
0860 rq = kmem_cache_alloc(slab_requests,
0861 gfp | __GFP_RETRY_MAYFAIL | __GFP_NOWARN);
0862 if (rq)
0863 return rq;
0864
0865
0866 rq = list_last_entry(&tl->requests, typeof(*rq), link);
0867 cond_synchronize_rcu(rq->rcustate);
0868
0869
0870 retire_requests(tl);
0871
0872 out:
0873 return kmem_cache_alloc(slab_requests, gfp);
0874 }
0875
0876 static void __i915_request_ctor(void *arg)
0877 {
0878 struct i915_request *rq = arg;
0879
0880 spin_lock_init(&rq->lock);
0881 i915_sched_node_init(&rq->sched);
0882 i915_sw_fence_init(&rq->submit, submit_notify);
0883 i915_sw_fence_init(&rq->semaphore, semaphore_notify);
0884
0885 clear_capture_list(rq);
0886 rq->batch_res = NULL;
0887
0888 init_llist_head(&rq->execute_cb);
0889 }
0890
0891 #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
0892 #define clear_batch_ptr(_rq) ((_rq)->batch = NULL)
0893 #else
0894 #define clear_batch_ptr(_a) do {} while (0)
0895 #endif
0896
0897 struct i915_request *
0898 __i915_request_create(struct intel_context *ce, gfp_t gfp)
0899 {
0900 struct intel_timeline *tl = ce->timeline;
0901 struct i915_request *rq;
0902 u32 seqno;
0903 int ret;
0904
0905 might_alloc(gfp);
0906
0907
0908 __intel_context_pin(ce);
0909
0910
0911
0912
0913
0914
0915
0916
0917
0918
0919
0920
0921
0922
0923
0924
0925
0926
0927
0928
0929
0930
0931
0932
0933
0934
0935
0936
0937
0938
0939 rq = kmem_cache_alloc(slab_requests,
0940 gfp | __GFP_RETRY_MAYFAIL | __GFP_NOWARN);
0941 if (unlikely(!rq)) {
0942 rq = request_alloc_slow(tl, &ce->engine->request_pool, gfp);
0943 if (!rq) {
0944 ret = -ENOMEM;
0945 goto err_unreserve;
0946 }
0947 }
0948
0949 rq->context = ce;
0950 rq->engine = ce->engine;
0951 rq->ring = ce->ring;
0952 rq->execution_mask = ce->engine->mask;
0953 rq->i915 = ce->engine->i915;
0954
0955 ret = intel_timeline_get_seqno(tl, rq, &seqno);
0956 if (ret)
0957 goto err_free;
0958
0959 dma_fence_init(&rq->fence, &i915_fence_ops, &rq->lock,
0960 tl->fence_context, seqno);
0961
0962 RCU_INIT_POINTER(rq->timeline, tl);
0963 rq->hwsp_seqno = tl->hwsp_seqno;
0964 GEM_BUG_ON(__i915_request_is_complete(rq));
0965
0966 rq->rcustate = get_state_synchronize_rcu();
0967
0968 rq->guc_prio = GUC_PRIO_INIT;
0969
0970
0971 i915_sw_fence_reinit(&i915_request_get(rq)->submit);
0972 i915_sw_fence_reinit(&i915_request_get(rq)->semaphore);
0973
0974 i915_sched_node_reinit(&rq->sched);
0975
0976
0977 clear_batch_ptr(rq);
0978 __rq_init_watchdog(rq);
0979 assert_capture_list_is_null(rq);
0980 GEM_BUG_ON(!llist_empty(&rq->execute_cb));
0981 GEM_BUG_ON(rq->batch_res);
0982
0983
0984
0985
0986
0987
0988
0989
0990
0991
0992
0993
0994
0995 rq->reserved_space =
0996 2 * rq->engine->emit_fini_breadcrumb_dw * sizeof(u32);
0997
0998
0999
1000
1001
1002
1003
1004 rq->head = rq->ring->emit;
1005
1006 ret = rq->engine->request_alloc(rq);
1007 if (ret)
1008 goto err_unwind;
1009
1010 rq->infix = rq->ring->emit;
1011
1012 intel_context_mark_active(ce);
1013 list_add_tail_rcu(&rq->link, &tl->requests);
1014
1015 return rq;
1016
1017 err_unwind:
1018 ce->ring->emit = rq->head;
1019
1020
1021 GEM_BUG_ON(!list_empty(&rq->sched.signalers_list));
1022 GEM_BUG_ON(!list_empty(&rq->sched.waiters_list));
1023
1024 err_free:
1025 kmem_cache_free(slab_requests, rq);
1026 err_unreserve:
1027 intel_context_unpin(ce);
1028 return ERR_PTR(ret);
1029 }
1030
1031 struct i915_request *
1032 i915_request_create(struct intel_context *ce)
1033 {
1034 struct i915_request *rq;
1035 struct intel_timeline *tl;
1036
1037 tl = intel_context_timeline_lock(ce);
1038 if (IS_ERR(tl))
1039 return ERR_CAST(tl);
1040
1041
1042 rq = list_first_entry(&tl->requests, typeof(*rq), link);
1043 if (!list_is_last(&rq->link, &tl->requests))
1044 i915_request_retire(rq);
1045
1046 intel_context_enter(ce);
1047 rq = __i915_request_create(ce, GFP_KERNEL);
1048 intel_context_exit(ce);
1049 if (IS_ERR(rq))
1050 goto err_unlock;
1051
1052
1053 rq->cookie = lockdep_pin_lock(&tl->mutex);
1054
1055 return rq;
1056
1057 err_unlock:
1058 intel_context_timeline_unlock(tl);
1059 return rq;
1060 }
1061
1062 static int
1063 i915_request_await_start(struct i915_request *rq, struct i915_request *signal)
1064 {
1065 struct dma_fence *fence;
1066 int err;
1067
1068 if (i915_request_timeline(rq) == rcu_access_pointer(signal->timeline))
1069 return 0;
1070
1071 if (i915_request_started(signal))
1072 return 0;
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082 fence = NULL;
1083 rcu_read_lock();
1084 do {
1085 struct list_head *pos = READ_ONCE(signal->link.prev);
1086 struct i915_request *prev;
1087
1088
1089 if (unlikely(__i915_request_has_started(signal)))
1090 break;
1091
1092
1093 if (pos == &rcu_dereference(signal->timeline)->requests)
1094 break;
1095
1096
1097
1098
1099
1100
1101
1102 prev = list_entry(pos, typeof(*prev), link);
1103 if (!i915_request_get_rcu(prev))
1104 break;
1105
1106
1107 if (unlikely(READ_ONCE(prev->link.next) != &signal->link)) {
1108 i915_request_put(prev);
1109 break;
1110 }
1111
1112 fence = &prev->fence;
1113 } while (0);
1114 rcu_read_unlock();
1115 if (!fence)
1116 return 0;
1117
1118 err = 0;
1119 if (!intel_timeline_sync_is_later(i915_request_timeline(rq), fence))
1120 err = i915_sw_fence_await_dma_fence(&rq->submit,
1121 fence, 0,
1122 I915_FENCE_GFP);
1123 dma_fence_put(fence);
1124
1125 return err;
1126 }
1127
1128 static intel_engine_mask_t
1129 already_busywaiting(struct i915_request *rq)
1130 {
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143 return rq->sched.semaphores | READ_ONCE(rq->engine->saturated);
1144 }
1145
1146 static int
1147 __emit_semaphore_wait(struct i915_request *to,
1148 struct i915_request *from,
1149 u32 seqno)
1150 {
1151 const int has_token = GRAPHICS_VER(to->engine->i915) >= 12;
1152 u32 hwsp_offset;
1153 int len, err;
1154 u32 *cs;
1155
1156 GEM_BUG_ON(GRAPHICS_VER(to->engine->i915) < 8);
1157 GEM_BUG_ON(i915_request_has_initial_breadcrumb(to));
1158
1159
1160 err = intel_timeline_read_hwsp(from, to, &hwsp_offset);
1161 if (err)
1162 return err;
1163
1164 len = 4;
1165 if (has_token)
1166 len += 2;
1167
1168 cs = intel_ring_begin(to, len);
1169 if (IS_ERR(cs))
1170 return PTR_ERR(cs);
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180 *cs++ = (MI_SEMAPHORE_WAIT |
1181 MI_SEMAPHORE_GLOBAL_GTT |
1182 MI_SEMAPHORE_POLL |
1183 MI_SEMAPHORE_SAD_GTE_SDD) +
1184 has_token;
1185 *cs++ = seqno;
1186 *cs++ = hwsp_offset;
1187 *cs++ = 0;
1188 if (has_token) {
1189 *cs++ = 0;
1190 *cs++ = MI_NOOP;
1191 }
1192
1193 intel_ring_advance(to, cs);
1194 return 0;
1195 }
1196
1197 static bool
1198 can_use_semaphore_wait(struct i915_request *to, struct i915_request *from)
1199 {
1200 return to->engine->gt->ggtt == from->engine->gt->ggtt;
1201 }
1202
1203 static int
1204 emit_semaphore_wait(struct i915_request *to,
1205 struct i915_request *from,
1206 gfp_t gfp)
1207 {
1208 const intel_engine_mask_t mask = READ_ONCE(from->engine)->mask;
1209 struct i915_sw_fence *wait = &to->submit;
1210
1211 if (!can_use_semaphore_wait(to, from))
1212 goto await_fence;
1213
1214 if (!intel_context_use_semaphores(to->context))
1215 goto await_fence;
1216
1217 if (i915_request_has_initial_breadcrumb(to))
1218 goto await_fence;
1219
1220
1221
1222
1223
1224
1225
1226 if (from->sched.flags & I915_SCHED_HAS_EXTERNAL_CHAIN)
1227 goto await_fence;
1228
1229
1230 if (already_busywaiting(to) & mask)
1231 goto await_fence;
1232
1233 if (i915_request_await_start(to, from) < 0)
1234 goto await_fence;
1235
1236
1237 if (__await_execution(to, from, gfp))
1238 goto await_fence;
1239
1240 if (__emit_semaphore_wait(to, from, from->fence.seqno))
1241 goto await_fence;
1242
1243 to->sched.semaphores |= mask;
1244 wait = &to->semaphore;
1245
1246 await_fence:
1247 return i915_sw_fence_await_dma_fence(wait,
1248 &from->fence, 0,
1249 I915_FENCE_GFP);
1250 }
1251
1252 static bool intel_timeline_sync_has_start(struct intel_timeline *tl,
1253 struct dma_fence *fence)
1254 {
1255 return __intel_timeline_sync_is_later(tl,
1256 fence->context,
1257 fence->seqno - 1);
1258 }
1259
1260 static int intel_timeline_sync_set_start(struct intel_timeline *tl,
1261 const struct dma_fence *fence)
1262 {
1263 return __intel_timeline_sync_set(tl, fence->context, fence->seqno - 1);
1264 }
1265
1266 static int
1267 __i915_request_await_execution(struct i915_request *to,
1268 struct i915_request *from)
1269 {
1270 int err;
1271
1272 GEM_BUG_ON(intel_context_is_barrier(from->context));
1273
1274
1275 err = __await_execution(to, from, I915_FENCE_GFP);
1276 if (err)
1277 return err;
1278
1279
1280 if (intel_timeline_sync_has_start(i915_request_timeline(to),
1281 &from->fence))
1282 return 0;
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294 err = i915_request_await_start(to, from);
1295 if (err < 0)
1296 return err;
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317 if (can_use_semaphore_wait(to, from) &&
1318 intel_engine_has_semaphores(to->engine) &&
1319 !i915_request_has_initial_breadcrumb(to)) {
1320 err = __emit_semaphore_wait(to, from, from->fence.seqno - 1);
1321 if (err < 0)
1322 return err;
1323 }
1324
1325
1326 if (to->engine->sched_engine->schedule) {
1327 err = i915_sched_node_add_dependency(&to->sched,
1328 &from->sched,
1329 I915_DEPENDENCY_WEAK);
1330 if (err < 0)
1331 return err;
1332 }
1333
1334 return intel_timeline_sync_set_start(i915_request_timeline(to),
1335 &from->fence);
1336 }
1337
1338 static void mark_external(struct i915_request *rq)
1339 {
1340
1341
1342
1343
1344
1345
1346
1347
1348 rq->sched.flags |= I915_SCHED_HAS_EXTERNAL_CHAIN;
1349 }
1350
1351 static int
1352 __i915_request_await_external(struct i915_request *rq, struct dma_fence *fence)
1353 {
1354 mark_external(rq);
1355 return i915_sw_fence_await_dma_fence(&rq->submit, fence,
1356 i915_fence_context_timeout(rq->engine->i915,
1357 fence->context),
1358 I915_FENCE_GFP);
1359 }
1360
1361 static int
1362 i915_request_await_external(struct i915_request *rq, struct dma_fence *fence)
1363 {
1364 struct dma_fence *iter;
1365 int err = 0;
1366
1367 if (!to_dma_fence_chain(fence))
1368 return __i915_request_await_external(rq, fence);
1369
1370 dma_fence_chain_for_each(iter, fence) {
1371 struct dma_fence_chain *chain = to_dma_fence_chain(iter);
1372
1373 if (!dma_fence_is_i915(chain->fence)) {
1374 err = __i915_request_await_external(rq, iter);
1375 break;
1376 }
1377
1378 err = i915_request_await_dma_fence(rq, chain->fence);
1379 if (err < 0)
1380 break;
1381 }
1382
1383 dma_fence_put(iter);
1384 return err;
1385 }
1386
1387 static inline bool is_parallel_rq(struct i915_request *rq)
1388 {
1389 return intel_context_is_parallel(rq->context);
1390 }
1391
1392 static inline struct intel_context *request_to_parent(struct i915_request *rq)
1393 {
1394 return intel_context_to_parent(rq->context);
1395 }
1396
1397 static bool is_same_parallel_context(struct i915_request *to,
1398 struct i915_request *from)
1399 {
1400 if (is_parallel_rq(to))
1401 return request_to_parent(to) == request_to_parent(from);
1402
1403 return false;
1404 }
1405
1406 int
1407 i915_request_await_execution(struct i915_request *rq,
1408 struct dma_fence *fence)
1409 {
1410 struct dma_fence **child = &fence;
1411 unsigned int nchild = 1;
1412 int ret;
1413
1414 if (dma_fence_is_array(fence)) {
1415 struct dma_fence_array *array = to_dma_fence_array(fence);
1416
1417
1418
1419 child = array->fences;
1420 nchild = array->num_fences;
1421 GEM_BUG_ON(!nchild);
1422 }
1423
1424 do {
1425 fence = *child++;
1426 if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
1427 continue;
1428
1429 if (fence->context == rq->fence.context)
1430 continue;
1431
1432
1433
1434
1435
1436
1437 if (dma_fence_is_i915(fence)) {
1438 if (is_same_parallel_context(rq, to_request(fence)))
1439 continue;
1440 ret = __i915_request_await_execution(rq,
1441 to_request(fence));
1442 } else {
1443 ret = i915_request_await_external(rq, fence);
1444 }
1445 if (ret < 0)
1446 return ret;
1447 } while (--nchild);
1448
1449 return 0;
1450 }
1451
1452 static int
1453 await_request_submit(struct i915_request *to, struct i915_request *from)
1454 {
1455
1456
1457
1458
1459
1460
1461
1462
1463 if (to->engine == READ_ONCE(from->engine))
1464 return i915_sw_fence_await_sw_fence_gfp(&to->submit,
1465 &from->submit,
1466 I915_FENCE_GFP);
1467 else
1468 return __i915_request_await_execution(to, from);
1469 }
1470
1471 static int
1472 i915_request_await_request(struct i915_request *to, struct i915_request *from)
1473 {
1474 int ret;
1475
1476 GEM_BUG_ON(to == from);
1477 GEM_BUG_ON(to->timeline == from->timeline);
1478
1479 if (i915_request_completed(from)) {
1480 i915_sw_fence_set_error_once(&to->submit, from->fence.error);
1481 return 0;
1482 }
1483
1484 if (to->engine->sched_engine->schedule) {
1485 ret = i915_sched_node_add_dependency(&to->sched,
1486 &from->sched,
1487 I915_DEPENDENCY_EXTERNAL);
1488 if (ret < 0)
1489 return ret;
1490 }
1491
1492 if (!intel_engine_uses_guc(to->engine) &&
1493 is_power_of_2(to->execution_mask | READ_ONCE(from->execution_mask)))
1494 ret = await_request_submit(to, from);
1495 else
1496 ret = emit_semaphore_wait(to, from, I915_FENCE_GFP);
1497 if (ret < 0)
1498 return ret;
1499
1500 return 0;
1501 }
1502
1503 int
1504 i915_request_await_dma_fence(struct i915_request *rq, struct dma_fence *fence)
1505 {
1506 struct dma_fence **child = &fence;
1507 unsigned int nchild = 1;
1508 int ret;
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518 if (dma_fence_is_array(fence)) {
1519 struct dma_fence_array *array = to_dma_fence_array(fence);
1520
1521 child = array->fences;
1522 nchild = array->num_fences;
1523 GEM_BUG_ON(!nchild);
1524 }
1525
1526 do {
1527 fence = *child++;
1528 if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
1529 continue;
1530
1531
1532
1533
1534
1535
1536 if (fence->context == rq->fence.context)
1537 continue;
1538
1539
1540 if (fence->context &&
1541 intel_timeline_sync_is_later(i915_request_timeline(rq),
1542 fence))
1543 continue;
1544
1545 if (dma_fence_is_i915(fence)) {
1546 if (is_same_parallel_context(rq, to_request(fence)))
1547 continue;
1548 ret = i915_request_await_request(rq, to_request(fence));
1549 } else {
1550 ret = i915_request_await_external(rq, fence);
1551 }
1552 if (ret < 0)
1553 return ret;
1554
1555
1556 if (fence->context)
1557 intel_timeline_sync_set(i915_request_timeline(rq),
1558 fence);
1559 } while (--nchild);
1560
1561 return 0;
1562 }
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572 int i915_request_await_deps(struct i915_request *rq, const struct i915_deps *deps)
1573 {
1574 int i, err;
1575
1576 for (i = 0; i < deps->num_deps; ++i) {
1577 err = i915_request_await_dma_fence(rq, deps->fences[i]);
1578 if (err)
1579 return err;
1580 }
1581
1582 return 0;
1583 }
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605 int
1606 i915_request_await_object(struct i915_request *to,
1607 struct drm_i915_gem_object *obj,
1608 bool write)
1609 {
1610 struct dma_resv_iter cursor;
1611 struct dma_fence *fence;
1612 int ret = 0;
1613
1614 dma_resv_for_each_fence(&cursor, obj->base.resv,
1615 dma_resv_usage_rw(write), fence) {
1616 ret = i915_request_await_dma_fence(to, fence);
1617 if (ret)
1618 break;
1619 }
1620
1621 return ret;
1622 }
1623
1624 static struct i915_request *
1625 __i915_request_ensure_parallel_ordering(struct i915_request *rq,
1626 struct intel_timeline *timeline)
1627 {
1628 struct i915_request *prev;
1629
1630 GEM_BUG_ON(!is_parallel_rq(rq));
1631
1632 prev = request_to_parent(rq)->parallel.last_rq;
1633 if (prev) {
1634 if (!__i915_request_is_complete(prev)) {
1635 i915_sw_fence_await_sw_fence(&rq->submit,
1636 &prev->submit,
1637 &rq->submitq);
1638
1639 if (rq->engine->sched_engine->schedule)
1640 __i915_sched_node_add_dependency(&rq->sched,
1641 &prev->sched,
1642 &rq->dep,
1643 0);
1644 }
1645 i915_request_put(prev);
1646 }
1647
1648 request_to_parent(rq)->parallel.last_rq = i915_request_get(rq);
1649
1650 return to_request(__i915_active_fence_set(&timeline->last_request,
1651 &rq->fence));
1652 }
1653
1654 static struct i915_request *
1655 __i915_request_ensure_ordering(struct i915_request *rq,
1656 struct intel_timeline *timeline)
1657 {
1658 struct i915_request *prev;
1659
1660 GEM_BUG_ON(is_parallel_rq(rq));
1661
1662 prev = to_request(__i915_active_fence_set(&timeline->last_request,
1663 &rq->fence));
1664
1665 if (prev && !__i915_request_is_complete(prev)) {
1666 bool uses_guc = intel_engine_uses_guc(rq->engine);
1667 bool pow2 = is_power_of_2(READ_ONCE(prev->engine)->mask |
1668 rq->engine->mask);
1669 bool same_context = prev->context == rq->context;
1670
1671
1672
1673
1674
1675
1676
1677 GEM_BUG_ON(same_context &&
1678 i915_seqno_passed(prev->fence.seqno,
1679 rq->fence.seqno));
1680
1681 if ((same_context && uses_guc) || (!uses_guc && pow2))
1682 i915_sw_fence_await_sw_fence(&rq->submit,
1683 &prev->submit,
1684 &rq->submitq);
1685 else
1686 __i915_sw_fence_await_dma_fence(&rq->submit,
1687 &prev->fence,
1688 &rq->dmaq);
1689 if (rq->engine->sched_engine->schedule)
1690 __i915_sched_node_add_dependency(&rq->sched,
1691 &prev->sched,
1692 &rq->dep,
1693 0);
1694 }
1695
1696 return prev;
1697 }
1698
1699 static struct i915_request *
1700 __i915_request_add_to_timeline(struct i915_request *rq)
1701 {
1702 struct intel_timeline *timeline = i915_request_timeline(rq);
1703 struct i915_request *prev;
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735 if (likely(!is_parallel_rq(rq)))
1736 prev = __i915_request_ensure_ordering(rq, timeline);
1737 else
1738 prev = __i915_request_ensure_parallel_ordering(rq, timeline);
1739
1740
1741
1742
1743
1744
1745 GEM_BUG_ON(timeline->seqno != rq->fence.seqno);
1746
1747 return prev;
1748 }
1749
1750
1751
1752
1753
1754
1755 struct i915_request *__i915_request_commit(struct i915_request *rq)
1756 {
1757 struct intel_engine_cs *engine = rq->engine;
1758 struct intel_ring *ring = rq->ring;
1759 u32 *cs;
1760
1761 RQ_TRACE(rq, "\n");
1762
1763
1764
1765
1766
1767
1768 GEM_BUG_ON(rq->reserved_space > ring->space);
1769 rq->reserved_space = 0;
1770 rq->emitted_jiffies = jiffies;
1771
1772
1773
1774
1775
1776
1777
1778 cs = intel_ring_begin(rq, engine->emit_fini_breadcrumb_dw);
1779 GEM_BUG_ON(IS_ERR(cs));
1780 rq->postfix = intel_ring_offset(rq, cs);
1781
1782 return __i915_request_add_to_timeline(rq);
1783 }
1784
1785 void __i915_request_queue_bh(struct i915_request *rq)
1786 {
1787 i915_sw_fence_commit(&rq->semaphore);
1788 i915_sw_fence_commit(&rq->submit);
1789 }
1790
1791 void __i915_request_queue(struct i915_request *rq,
1792 const struct i915_sched_attr *attr)
1793 {
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805 if (attr && rq->engine->sched_engine->schedule)
1806 rq->engine->sched_engine->schedule(rq, attr);
1807
1808 local_bh_disable();
1809 __i915_request_queue_bh(rq);
1810 local_bh_enable();
1811 }
1812
1813 void i915_request_add(struct i915_request *rq)
1814 {
1815 struct intel_timeline * const tl = i915_request_timeline(rq);
1816 struct i915_sched_attr attr = {};
1817 struct i915_gem_context *ctx;
1818
1819 lockdep_assert_held(&tl->mutex);
1820 lockdep_unpin_lock(&tl->mutex, rq->cookie);
1821
1822 trace_i915_request_add(rq);
1823 __i915_request_commit(rq);
1824
1825
1826 rcu_read_lock();
1827 ctx = rcu_dereference(rq->context->gem_context);
1828 if (ctx)
1829 attr = ctx->sched;
1830 rcu_read_unlock();
1831
1832 __i915_request_queue(rq, &attr);
1833
1834 mutex_unlock(&tl->mutex);
1835 }
1836
1837 static unsigned long local_clock_ns(unsigned int *cpu)
1838 {
1839 unsigned long t;
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853 *cpu = get_cpu();
1854 t = local_clock();
1855 put_cpu();
1856
1857 return t;
1858 }
1859
1860 static bool busywait_stop(unsigned long timeout, unsigned int cpu)
1861 {
1862 unsigned int this_cpu;
1863
1864 if (time_after(local_clock_ns(&this_cpu), timeout))
1865 return true;
1866
1867 return this_cpu != cpu;
1868 }
1869
1870 static bool __i915_spin_request(struct i915_request * const rq, int state)
1871 {
1872 unsigned long timeout_ns;
1873 unsigned int cpu;
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886 if (!i915_request_is_running(rq))
1887 return false;
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900 timeout_ns = READ_ONCE(rq->engine->props.max_busywait_duration_ns);
1901 timeout_ns += local_clock_ns(&cpu);
1902 do {
1903 if (dma_fence_is_signaled(&rq->fence))
1904 return true;
1905
1906 if (signal_pending_state(state, current))
1907 break;
1908
1909 if (busywait_stop(timeout_ns, cpu))
1910 break;
1911
1912 cpu_relax();
1913 } while (!need_resched());
1914
1915 return false;
1916 }
1917
1918 struct request_wait {
1919 struct dma_fence_cb cb;
1920 struct task_struct *tsk;
1921 };
1922
1923 static void request_wait_wake(struct dma_fence *fence, struct dma_fence_cb *cb)
1924 {
1925 struct request_wait *wait = container_of(cb, typeof(*wait), cb);
1926
1927 wake_up_process(fetch_and_zero(&wait->tsk));
1928 }
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949 long i915_request_wait_timeout(struct i915_request *rq,
1950 unsigned int flags,
1951 long timeout)
1952 {
1953 const int state = flags & I915_WAIT_INTERRUPTIBLE ?
1954 TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE;
1955 struct request_wait wait;
1956
1957 might_sleep();
1958 GEM_BUG_ON(timeout < 0);
1959
1960 if (dma_fence_is_signaled(&rq->fence))
1961 return timeout ?: 1;
1962
1963 if (!timeout)
1964 return -ETIME;
1965
1966 trace_i915_request_wait_begin(rq, flags);
1967
1968
1969
1970
1971
1972
1973
1974 mutex_acquire(&rq->engine->gt->reset.mutex.dep_map, 0, 0, _THIS_IP_);
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999 if (CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT &&
2000 __i915_spin_request(rq, state))
2001 goto out;
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015 if (flags & I915_WAIT_PRIORITY && !i915_request_started(rq))
2016 intel_rps_boost(rq);
2017
2018 wait.tsk = current;
2019 if (dma_fence_add_callback(&rq->fence, &wait.cb, request_wait_wake))
2020 goto out;
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037 if (i915_request_is_ready(rq))
2038 __intel_engine_flush_submission(rq->engine, false);
2039
2040 for (;;) {
2041 set_current_state(state);
2042
2043 if (dma_fence_is_signaled(&rq->fence))
2044 break;
2045
2046 if (signal_pending_state(state, current)) {
2047 timeout = -ERESTARTSYS;
2048 break;
2049 }
2050
2051 if (!timeout) {
2052 timeout = -ETIME;
2053 break;
2054 }
2055
2056 timeout = io_schedule_timeout(timeout);
2057 }
2058 __set_current_state(TASK_RUNNING);
2059
2060 if (READ_ONCE(wait.tsk))
2061 dma_fence_remove_callback(&rq->fence, &wait.cb);
2062 GEM_BUG_ON(!list_empty(&wait.cb.node));
2063
2064 out:
2065 mutex_release(&rq->engine->gt->reset.mutex.dep_map, _THIS_IP_);
2066 trace_i915_request_wait_end(rq);
2067 return timeout;
2068 }
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088 long i915_request_wait(struct i915_request *rq,
2089 unsigned int flags,
2090 long timeout)
2091 {
2092 long ret = i915_request_wait_timeout(rq, flags, timeout);
2093
2094 if (!ret)
2095 return -ETIME;
2096
2097 if (ret > 0 && !timeout)
2098 return 0;
2099
2100 return ret;
2101 }
2102
2103 static int print_sched_attr(const struct i915_sched_attr *attr,
2104 char *buf, int x, int len)
2105 {
2106 if (attr->priority == I915_PRIORITY_INVALID)
2107 return x;
2108
2109 x += snprintf(buf + x, len - x,
2110 " prio=%d", attr->priority);
2111
2112 return x;
2113 }
2114
2115 static char queue_status(const struct i915_request *rq)
2116 {
2117 if (i915_request_is_active(rq))
2118 return 'E';
2119
2120 if (i915_request_is_ready(rq))
2121 return intel_engine_is_virtual(rq->engine) ? 'V' : 'R';
2122
2123 return 'U';
2124 }
2125
2126 static const char *run_status(const struct i915_request *rq)
2127 {
2128 if (__i915_request_is_complete(rq))
2129 return "!";
2130
2131 if (__i915_request_has_started(rq))
2132 return "*";
2133
2134 if (!i915_sw_fence_signaled(&rq->semaphore))
2135 return "&";
2136
2137 return "";
2138 }
2139
2140 static const char *fence_status(const struct i915_request *rq)
2141 {
2142 if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &rq->fence.flags))
2143 return "+";
2144
2145 if (test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &rq->fence.flags))
2146 return "-";
2147
2148 return "";
2149 }
2150
2151 void i915_request_show(struct drm_printer *m,
2152 const struct i915_request *rq,
2153 const char *prefix,
2154 int indent)
2155 {
2156 const char *name = rq->fence.ops->get_timeline_name((struct dma_fence *)&rq->fence);
2157 char buf[80] = "";
2158 int x = 0;
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190 x = print_sched_attr(&rq->sched.attr, buf, x, sizeof(buf));
2191
2192 drm_printf(m, "%s%.*s%c %llx:%lld%s%s %s @ %dms: %s\n",
2193 prefix, indent, " ",
2194 queue_status(rq),
2195 rq->fence.context, rq->fence.seqno,
2196 run_status(rq),
2197 fence_status(rq),
2198 buf,
2199 jiffies_to_msecs(jiffies - rq->emitted_jiffies),
2200 name);
2201 }
2202
2203 static bool engine_match_ring(struct intel_engine_cs *engine, struct i915_request *rq)
2204 {
2205 u32 ring = ENGINE_READ(engine, RING_START);
2206
2207 return ring == i915_ggtt_offset(rq->ring->vma);
2208 }
2209
2210 static bool match_ring(struct i915_request *rq)
2211 {
2212 struct intel_engine_cs *engine;
2213 bool found;
2214 int i;
2215
2216 if (!intel_engine_is_virtual(rq->engine))
2217 return engine_match_ring(rq->engine, rq);
2218
2219 found = false;
2220 i = 0;
2221 while ((engine = intel_engine_get_sibling(rq->engine, i++))) {
2222 found = engine_match_ring(engine, rq);
2223 if (found)
2224 break;
2225 }
2226
2227 return found;
2228 }
2229
2230 enum i915_request_state i915_test_request_state(struct i915_request *rq)
2231 {
2232 if (i915_request_completed(rq))
2233 return I915_REQUEST_COMPLETE;
2234
2235 if (!i915_request_started(rq))
2236 return I915_REQUEST_PENDING;
2237
2238 if (match_ring(rq))
2239 return I915_REQUEST_ACTIVE;
2240
2241 return I915_REQUEST_QUEUED;
2242 }
2243
2244 #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
2245 #include "selftests/mock_request.c"
2246 #include "selftests/i915_request.c"
2247 #endif
2248
2249 void i915_request_module_exit(void)
2250 {
2251 kmem_cache_destroy(slab_execute_cbs);
2252 kmem_cache_destroy(slab_requests);
2253 }
2254
2255 int __init i915_request_module_init(void)
2256 {
2257 slab_requests =
2258 kmem_cache_create("i915_request",
2259 sizeof(struct i915_request),
2260 __alignof__(struct i915_request),
2261 SLAB_HWCACHE_ALIGN |
2262 SLAB_RECLAIM_ACCOUNT |
2263 SLAB_TYPESAFE_BY_RCU,
2264 __i915_request_ctor);
2265 if (!slab_requests)
2266 return -ENOMEM;
2267
2268 slab_execute_cbs = KMEM_CACHE(execute_cb,
2269 SLAB_HWCACHE_ALIGN |
2270 SLAB_RECLAIM_ACCOUNT |
2271 SLAB_TYPESAFE_BY_RCU);
2272 if (!slab_execute_cbs)
2273 goto err_requests;
2274
2275 return 0;
2276
2277 err_requests:
2278 kmem_cache_destroy(slab_requests);
2279 return -ENOMEM;
2280 }