drm/i915/guc: Take GT PM ref when deregistering context
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / i915_scheduler.c
1 /*
2  * SPDX-License-Identifier: MIT
3  *
4  * Copyright © 2018 Intel Corporation
5  */
6
7 #include <linux/mutex.h>
8
9 #include "i915_drv.h"
10 #include "i915_request.h"
11 #include "i915_scheduler.h"
12
13 static struct kmem_cache *slab_dependencies;
14 static struct kmem_cache *slab_priorities;
15
16 static DEFINE_SPINLOCK(schedule_lock);
17
18 static const struct i915_request *
19 node_to_request(const struct i915_sched_node *node)
20 {
21         return container_of(node, const struct i915_request, sched);
22 }
23
24 static inline bool node_started(const struct i915_sched_node *node)
25 {
26         return i915_request_started(node_to_request(node));
27 }
28
29 static inline bool node_signaled(const struct i915_sched_node *node)
30 {
31         return i915_request_completed(node_to_request(node));
32 }
33
34 static inline struct i915_priolist *to_priolist(struct rb_node *rb)
35 {
36         return rb_entry(rb, struct i915_priolist, node);
37 }
38
39 static void assert_priolists(struct i915_sched_engine * const sched_engine)
40 {
41         struct rb_node *rb;
42         long last_prio;
43
44         if (!IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM))
45                 return;
46
47         GEM_BUG_ON(rb_first_cached(&sched_engine->queue) !=
48                    rb_first(&sched_engine->queue.rb_root));
49
50         last_prio = INT_MAX;
51         for (rb = rb_first_cached(&sched_engine->queue); rb; rb = rb_next(rb)) {
52                 const struct i915_priolist *p = to_priolist(rb);
53
54                 GEM_BUG_ON(p->priority > last_prio);
55                 last_prio = p->priority;
56         }
57 }
58
59 struct list_head *
60 i915_sched_lookup_priolist(struct i915_sched_engine *sched_engine, int prio)
61 {
62         struct i915_priolist *p;
63         struct rb_node **parent, *rb;
64         bool first = true;
65
66         lockdep_assert_held(&sched_engine->lock);
67         assert_priolists(sched_engine);
68
69         if (unlikely(sched_engine->no_priolist))
70                 prio = I915_PRIORITY_NORMAL;
71
72 find_priolist:
73         /* most positive priority is scheduled first, equal priorities fifo */
74         rb = NULL;
75         parent = &sched_engine->queue.rb_root.rb_node;
76         while (*parent) {
77                 rb = *parent;
78                 p = to_priolist(rb);
79                 if (prio > p->priority) {
80                         parent = &rb->rb_left;
81                 } else if (prio < p->priority) {
82                         parent = &rb->rb_right;
83                         first = false;
84                 } else {
85                         return &p->requests;
86                 }
87         }
88
89         if (prio == I915_PRIORITY_NORMAL) {
90                 p = &sched_engine->default_priolist;
91         } else {
92                 p = kmem_cache_alloc(slab_priorities, GFP_ATOMIC);
93                 /* Convert an allocation failure to a priority bump */
94                 if (unlikely(!p)) {
95                         prio = I915_PRIORITY_NORMAL; /* recurses just once */
96
97                         /* To maintain ordering with all rendering, after an
98                          * allocation failure we have to disable all scheduling.
99                          * Requests will then be executed in fifo, and schedule
100                          * will ensure that dependencies are emitted in fifo.
101                          * There will be still some reordering with existing
102                          * requests, so if userspace lied about their
103                          * dependencies that reordering may be visible.
104                          */
105                         sched_engine->no_priolist = true;
106                         goto find_priolist;
107                 }
108         }
109
110         p->priority = prio;
111         INIT_LIST_HEAD(&p->requests);
112
113         rb_link_node(&p->node, rb, parent);
114         rb_insert_color_cached(&p->node, &sched_engine->queue, first);
115
116         return &p->requests;
117 }
118
119 void __i915_priolist_free(struct i915_priolist *p)
120 {
121         kmem_cache_free(slab_priorities, p);
122 }
123
124 struct sched_cache {
125         struct list_head *priolist;
126 };
127
128 static struct i915_sched_engine *
129 lock_sched_engine(struct i915_sched_node *node,
130                   struct i915_sched_engine *locked,
131                   struct sched_cache *cache)
132 {
133         const struct i915_request *rq = node_to_request(node);
134         struct i915_sched_engine *sched_engine;
135
136         GEM_BUG_ON(!locked);
137
138         /*
139          * Virtual engines complicate acquiring the engine timeline lock,
140          * as their rq->engine pointer is not stable until under that
141          * engine lock. The simple ploy we use is to take the lock then
142          * check that the rq still belongs to the newly locked engine.
143          */
144         while (locked != (sched_engine = READ_ONCE(rq->engine)->sched_engine)) {
145                 spin_unlock(&locked->lock);
146                 memset(cache, 0, sizeof(*cache));
147                 spin_lock(&sched_engine->lock);
148                 locked = sched_engine;
149         }
150
151         GEM_BUG_ON(locked != sched_engine);
152         return locked;
153 }
154
155 static void __i915_schedule(struct i915_sched_node *node,
156                             const struct i915_sched_attr *attr)
157 {
158         const int prio = max(attr->priority, node->attr.priority);
159         struct i915_sched_engine *sched_engine;
160         struct i915_dependency *dep, *p;
161         struct i915_dependency stack;
162         struct sched_cache cache;
163         LIST_HEAD(dfs);
164
165         /* Needed in order to use the temporary link inside i915_dependency */
166         lockdep_assert_held(&schedule_lock);
167         GEM_BUG_ON(prio == I915_PRIORITY_INVALID);
168
169         if (node_signaled(node))
170                 return;
171
172         stack.signaler = node;
173         list_add(&stack.dfs_link, &dfs);
174
175         /*
176          * Recursively bump all dependent priorities to match the new request.
177          *
178          * A naive approach would be to use recursion:
179          * static void update_priorities(struct i915_sched_node *node, prio) {
180          *      list_for_each_entry(dep, &node->signalers_list, signal_link)
181          *              update_priorities(dep->signal, prio)
182          *      queue_request(node);
183          * }
184          * but that may have unlimited recursion depth and so runs a very
185          * real risk of overunning the kernel stack. Instead, we build
186          * a flat list of all dependencies starting with the current request.
187          * As we walk the list of dependencies, we add all of its dependencies
188          * to the end of the list (this may include an already visited
189          * request) and continue to walk onwards onto the new dependencies. The
190          * end result is a topological list of requests in reverse order, the
191          * last element in the list is the request we must execute first.
192          */
193         list_for_each_entry(dep, &dfs, dfs_link) {
194                 struct i915_sched_node *node = dep->signaler;
195
196                 /* If we are already flying, we know we have no signalers */
197                 if (node_started(node))
198                         continue;
199
200                 /*
201                  * Within an engine, there can be no cycle, but we may
202                  * refer to the same dependency chain multiple times
203                  * (redundant dependencies are not eliminated) and across
204                  * engines.
205                  */
206                 list_for_each_entry(p, &node->signalers_list, signal_link) {
207                         GEM_BUG_ON(p == dep); /* no cycles! */
208
209                         if (node_signaled(p->signaler))
210                                 continue;
211
212                         if (prio > READ_ONCE(p->signaler->attr.priority))
213                                 list_move_tail(&p->dfs_link, &dfs);
214                 }
215         }
216
217         /*
218          * If we didn't need to bump any existing priorities, and we haven't
219          * yet submitted this request (i.e. there is no potential race with
220          * execlists_submit_request()), we can set our own priority and skip
221          * acquiring the engine locks.
222          */
223         if (node->attr.priority == I915_PRIORITY_INVALID) {
224                 GEM_BUG_ON(!list_empty(&node->link));
225                 node->attr = *attr;
226
227                 if (stack.dfs_link.next == stack.dfs_link.prev)
228                         return;
229
230                 __list_del_entry(&stack.dfs_link);
231         }
232
233         memset(&cache, 0, sizeof(cache));
234         sched_engine = node_to_request(node)->engine->sched_engine;
235         spin_lock(&sched_engine->lock);
236
237         /* Fifo and depth-first replacement ensure our deps execute before us */
238         sched_engine = lock_sched_engine(node, sched_engine, &cache);
239         list_for_each_entry_safe_reverse(dep, p, &dfs, dfs_link) {
240                 struct i915_request *from = container_of(dep->signaler,
241                                                          struct i915_request,
242                                                          sched);
243                 INIT_LIST_HEAD(&dep->dfs_link);
244
245                 node = dep->signaler;
246                 sched_engine = lock_sched_engine(node, sched_engine, &cache);
247                 lockdep_assert_held(&sched_engine->lock);
248
249                 /* Recheck after acquiring the engine->timeline.lock */
250                 if (prio <= node->attr.priority || node_signaled(node))
251                         continue;
252
253                 GEM_BUG_ON(node_to_request(node)->engine->sched_engine !=
254                            sched_engine);
255
256                 /* Must be called before changing the nodes priority */
257                 if (sched_engine->bump_inflight_request_prio)
258                         sched_engine->bump_inflight_request_prio(from, prio);
259
260                 WRITE_ONCE(node->attr.priority, prio);
261
262                 /*
263                  * Once the request is ready, it will be placed into the
264                  * priority lists and then onto the HW runlist. Before the
265                  * request is ready, it does not contribute to our preemption
266                  * decisions and we can safely ignore it, as it will, and
267                  * any preemption required, be dealt with upon submission.
268                  * See engine->submit_request()
269                  */
270                 if (list_empty(&node->link))
271                         continue;
272
273                 if (i915_request_in_priority_queue(node_to_request(node))) {
274                         if (!cache.priolist)
275                                 cache.priolist =
276                                         i915_sched_lookup_priolist(sched_engine,
277                                                                    prio);
278                         list_move_tail(&node->link, cache.priolist);
279                 }
280
281                 /* Defer (tasklet) submission until after all of our updates. */
282                 if (sched_engine->kick_backend)
283                         sched_engine->kick_backend(node_to_request(node), prio);
284         }
285
286         spin_unlock(&sched_engine->lock);
287 }
288
289 void i915_schedule(struct i915_request *rq, const struct i915_sched_attr *attr)
290 {
291         spin_lock_irq(&schedule_lock);
292         __i915_schedule(&rq->sched, attr);
293         spin_unlock_irq(&schedule_lock);
294 }
295
296 void i915_sched_node_init(struct i915_sched_node *node)
297 {
298         INIT_LIST_HEAD(&node->signalers_list);
299         INIT_LIST_HEAD(&node->waiters_list);
300         INIT_LIST_HEAD(&node->link);
301
302         i915_sched_node_reinit(node);
303 }
304
305 void i915_sched_node_reinit(struct i915_sched_node *node)
306 {
307         node->attr.priority = I915_PRIORITY_INVALID;
308         node->semaphores = 0;
309         node->flags = 0;
310
311         GEM_BUG_ON(!list_empty(&node->signalers_list));
312         GEM_BUG_ON(!list_empty(&node->waiters_list));
313         GEM_BUG_ON(!list_empty(&node->link));
314 }
315
316 static struct i915_dependency *
317 i915_dependency_alloc(void)
318 {
319         return kmem_cache_alloc(slab_dependencies, GFP_KERNEL);
320 }
321
322 static void
323 i915_dependency_free(struct i915_dependency *dep)
324 {
325         kmem_cache_free(slab_dependencies, dep);
326 }
327
328 bool __i915_sched_node_add_dependency(struct i915_sched_node *node,
329                                       struct i915_sched_node *signal,
330                                       struct i915_dependency *dep,
331                                       unsigned long flags)
332 {
333         bool ret = false;
334
335         spin_lock_irq(&schedule_lock);
336
337         if (!node_signaled(signal)) {
338                 INIT_LIST_HEAD(&dep->dfs_link);
339                 dep->signaler = signal;
340                 dep->waiter = node;
341                 dep->flags = flags;
342
343                 /* All set, now publish. Beware the lockless walkers. */
344                 list_add_rcu(&dep->signal_link, &node->signalers_list);
345                 list_add_rcu(&dep->wait_link, &signal->waiters_list);
346
347                 /* Propagate the chains */
348                 node->flags |= signal->flags;
349                 ret = true;
350         }
351
352         spin_unlock_irq(&schedule_lock);
353
354         return ret;
355 }
356
357 int i915_sched_node_add_dependency(struct i915_sched_node *node,
358                                    struct i915_sched_node *signal,
359                                    unsigned long flags)
360 {
361         struct i915_dependency *dep;
362
363         dep = i915_dependency_alloc();
364         if (!dep)
365                 return -ENOMEM;
366
367         if (!__i915_sched_node_add_dependency(node, signal, dep,
368                                               flags | I915_DEPENDENCY_ALLOC))
369                 i915_dependency_free(dep);
370
371         return 0;
372 }
373
374 void i915_sched_node_fini(struct i915_sched_node *node)
375 {
376         struct i915_dependency *dep, *tmp;
377
378         spin_lock_irq(&schedule_lock);
379
380         /*
381          * Everyone we depended upon (the fences we wait to be signaled)
382          * should retire before us and remove themselves from our list.
383          * However, retirement is run independently on each timeline and
384          * so we may be called out-of-order.
385          */
386         list_for_each_entry_safe(dep, tmp, &node->signalers_list, signal_link) {
387                 GEM_BUG_ON(!list_empty(&dep->dfs_link));
388
389                 list_del_rcu(&dep->wait_link);
390                 if (dep->flags & I915_DEPENDENCY_ALLOC)
391                         i915_dependency_free(dep);
392         }
393         INIT_LIST_HEAD(&node->signalers_list);
394
395         /* Remove ourselves from everyone who depends upon us */
396         list_for_each_entry_safe(dep, tmp, &node->waiters_list, wait_link) {
397                 GEM_BUG_ON(dep->signaler != node);
398                 GEM_BUG_ON(!list_empty(&dep->dfs_link));
399
400                 list_del_rcu(&dep->signal_link);
401                 if (dep->flags & I915_DEPENDENCY_ALLOC)
402                         i915_dependency_free(dep);
403         }
404         INIT_LIST_HEAD(&node->waiters_list);
405
406         spin_unlock_irq(&schedule_lock);
407 }
408
409 void i915_request_show_with_schedule(struct drm_printer *m,
410                                      const struct i915_request *rq,
411                                      const char *prefix,
412                                      int indent)
413 {
414         struct i915_dependency *dep;
415
416         i915_request_show(m, rq, prefix, indent);
417         if (i915_request_completed(rq))
418                 return;
419
420         rcu_read_lock();
421         for_each_signaler(dep, rq) {
422                 const struct i915_request *signaler =
423                         node_to_request(dep->signaler);
424
425                 /* Dependencies along the same timeline are expected. */
426                 if (signaler->timeline == rq->timeline)
427                         continue;
428
429                 if (__i915_request_is_complete(signaler))
430                         continue;
431
432                 i915_request_show(m, signaler, prefix, indent + 2);
433         }
434         rcu_read_unlock();
435 }
436
437 static void default_destroy(struct kref *kref)
438 {
439         struct i915_sched_engine *sched_engine =
440                 container_of(kref, typeof(*sched_engine), ref);
441
442         tasklet_kill(&sched_engine->tasklet); /* flush the callback */
443         kfree(sched_engine);
444 }
445
446 static bool default_disabled(struct i915_sched_engine *sched_engine)
447 {
448         return false;
449 }
450
451 struct i915_sched_engine *
452 i915_sched_engine_create(unsigned int subclass)
453 {
454         struct i915_sched_engine *sched_engine;
455
456         sched_engine = kzalloc(sizeof(*sched_engine), GFP_KERNEL);
457         if (!sched_engine)
458                 return NULL;
459
460         kref_init(&sched_engine->ref);
461
462         sched_engine->queue = RB_ROOT_CACHED;
463         sched_engine->queue_priority_hint = INT_MIN;
464         sched_engine->destroy = default_destroy;
465         sched_engine->disabled = default_disabled;
466
467         INIT_LIST_HEAD(&sched_engine->requests);
468         INIT_LIST_HEAD(&sched_engine->hold);
469
470         spin_lock_init(&sched_engine->lock);
471         lockdep_set_subclass(&sched_engine->lock, subclass);
472
473         /*
474          * Due to an interesting quirk in lockdep's internal debug tracking,
475          * after setting a subclass we must ensure the lock is used. Otherwise,
476          * nr_unused_locks is incremented once too often.
477          */
478 #ifdef CONFIG_DEBUG_LOCK_ALLOC
479         local_irq_disable();
480         lock_map_acquire(&sched_engine->lock.dep_map);
481         lock_map_release(&sched_engine->lock.dep_map);
482         local_irq_enable();
483 #endif
484
485         return sched_engine;
486 }
487
488 void i915_scheduler_module_exit(void)
489 {
490         kmem_cache_destroy(slab_dependencies);
491         kmem_cache_destroy(slab_priorities);
492 }
493
494 int __init i915_scheduler_module_init(void)
495 {
496         slab_dependencies = KMEM_CACHE(i915_dependency,
497                                               SLAB_HWCACHE_ALIGN |
498                                               SLAB_TYPESAFE_BY_RCU);
499         if (!slab_dependencies)
500                 return -ENOMEM;
501
502         slab_priorities = KMEM_CACHE(i915_priolist, 0);
503         if (!slab_priorities)
504                 goto err_priorities;
505
506         return 0;
507
508 err_priorities:
509         kmem_cache_destroy(slab_priorities);
510         return -ENOMEM;
511 }