XenevaOS
Loading...
Searching...
No Matches
gpu_scheduler.h
Go to the documentation of this file.
1/*
2 * Copyright 2015 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23
24#ifndef _DRM_GPU_SCHEDULER_H_
25#define _DRM_GPU_SCHEDULER_H_
26
27#include <drm/spsc_queue.h>
28#include <linux/average.h>
29#include <linux/dma-fence.h>
30#include <linux/completion.h>
31#include <linux/xarray.h>
32#include <linux/workqueue.h>
33
34DECLARE_EWMA(drm_sched_avgtime, 6, 4);
35
36#define MAX_WAIT_SCHED_ENTITY_Q_EMPTY msecs_to_jiffies(1000)
37
45#define DRM_SCHED_FENCE_DONT_PIPELINE DMA_FENCE_FLAG_USER_BITS
46
54#define DRM_SCHED_FENCE_FLAG_HAS_DEADLINE_BIT (DMA_FENCE_FLAG_USER_BITS + 1)
55
57struct dma_resv;
58struct drm_gem_object;
59
61struct drm_sched_rq;
62
63struct drm_file;
64
65/* These are often used as an (initial) index
66 * to an array, and as such should start at 0.
67 */
77
78struct drm_sched_entity_stats;
79
261
278
280 /* Following members are protected by the @lock: */
285};
286
342
344
373
382
385
389 struct drm_sched_entity_stats *entity_stats;
390
394 unsigned int last_dependency;
396
399
400 /*
401 * work is used only after finish_cb has been used and will not be
402 * accessed anymore.
403 */
404 union {
405 struct dma_fence_cb finish_cb;
406 struct work_struct work;
407 };
408
410
419};
420
436
454 struct dma_fence *(*prepare_job)(struct drm_sched_job *sched_job,
455 struct drm_sched_entity *s_entity);
456
489 struct dma_fence *(*run_job)(struct drm_sched_job *sched_job);
490
542 enum drm_gpu_sched_stat (*timedout_job)(struct drm_sched_job *sched_job);
543
548 void (*free_job)(struct drm_sched_job *sched_job);
549
566 void (*cancel_job)(struct drm_sched_job *sched_job);
567};
568
635
665
666/* Scheduler operations */
667
669 const struct drm_sched_init_args *args);
670
672
673unsigned long drm_sched_suspend_timeout(struct drm_gpu_scheduler *sched);
675 unsigned long remaining);
680void drm_sched_stop(struct drm_gpu_scheduler *sched, struct drm_sched_job *bad);
681void drm_sched_start(struct drm_gpu_scheduler *sched, int errno);
685
686struct drm_gpu_scheduler *
688 unsigned int num_sched_list);
689
690/* Jobs */
691
693 struct drm_sched_entity *entity,
694 u32 credits, void *owner,
695 u64 drm_client_id);
699 struct dma_fence *fence);
701 struct drm_file *file,
702 u32 handle,
703 u32 point);
705 struct dma_resv *resv,
706 enum dma_resv_usage usage);
708 struct drm_gem_object *obj,
709 bool write);
711 struct dma_fence *fence);
715
716static inline bool drm_sched_invalidate_job(struct drm_sched_job *s_job,
717 int threshold)
718{
719 return s_job && atomic_inc_return(&s_job->karma) > threshold;
720}
721
722/* Entities */
723
725 enum drm_sched_priority priority,
726 struct drm_gpu_scheduler **sched_list,
727 unsigned int num_sched_list,
728 atomic_t *guilty);
734 enum drm_sched_priority priority);
737 struct drm_gpu_scheduler **sched_list,
738 unsigned int num_sched_list);
739
747
748/* Drivers should never call this directly */
749static inline struct drm_sched_pending_job_iter
750__drm_sched_pending_job_iter_begin(struct drm_gpu_scheduler *sched)
751{
752 struct drm_sched_pending_job_iter iter = {
753 .sched = sched,
754 };
755
756 WARN_ON(!drm_sched_is_stopped(sched));
757 return iter;
758}
759
760/* Drivers should never call this directly */
761static inline void
762__drm_sched_pending_job_iter_end(const struct drm_sched_pending_job_iter iter)
763{
764 WARN_ON(!drm_sched_is_stopped(iter.sched));
765}
766
768 __drm_sched_pending_job_iter_end(_T),
769 __drm_sched_pending_job_iter_begin(__sched),
770 struct drm_gpu_scheduler *__sched);
771static inline void *
772class_drm_sched_pending_job_iter_lock_ptr(class_drm_sched_pending_job_iter_t *_T)
773{ return _T; }
774#define class_drm_sched_pending_job_iter_is_conditional false
775
785#define drm_sched_for_each_pending_job(__job, __sched, __entity) \
786 scoped_guard(drm_sched_pending_job_iter, (__sched)) \
787 list_for_each_entry((__job), &(__sched)->pending_list, list) \
788 for_each_if(!(__entity) || (__job)->entity == (__entity))
789
790#endif
COMPILER_DEPENDENT_UINT64 uint64_t
Definition acefiex.h:165
#define write
Definition acwin.h:181
#define DECLARE_EWMA(name, _precision, _weight_rcp)
Definition average.h:28
#define __sched
Definition compiler.h:132
#define __rcu
Definition compiler_types.h:72
#define errno
Definition dlmalloc.c:616
dma_resv_usage
Definition dma-resv.h:71
const char * f
Definition drm_print.h:205
int drm_sched_job_add_implicit_dependencies(struct drm_sched_job *job, struct drm_gem_object *obj, bool write)
void drm_sched_tdr_queue_imm(struct drm_gpu_scheduler *sched)
void drm_sched_entity_kill(struct drm_sched_entity *entity)
unsigned long drm_sched_suspend_timeout(struct drm_gpu_scheduler *sched)
void drm_sched_start(struct drm_gpu_scheduler *sched, int errno)
void drm_sched_entity_set_priority(struct drm_sched_entity *entity, enum drm_sched_priority priority)
int drm_sched_job_add_dependency(struct drm_sched_job *job, struct dma_fence *fence)
int drm_sched_job_add_syncobj_dependency(struct drm_sched_job *job, struct drm_file *file, u32 handle, u32 point)
void drm_sched_resubmit_jobs(struct drm_gpu_scheduler *sched)
void drm_sched_resume_timeout(struct drm_gpu_scheduler *sched, unsigned long remaining)
void drm_sched_job_arm(struct drm_sched_job *job)
void drm_sched_wqueue_stop(struct drm_gpu_scheduler *sched)
void drm_sched_fini(struct drm_gpu_scheduler *sched)
bool drm_sched_job_has_dependency(struct drm_sched_job *job, struct dma_fence *fence)
void drm_sched_entity_destroy(struct drm_sched_entity *entity)
void drm_sched_entity_modify_sched(struct drm_sched_entity *entity, struct drm_gpu_scheduler **sched_list, unsigned int num_sched_list)
void drm_sched_increase_karma(struct drm_sched_job *bad)
int drm_sched_entity_init(struct drm_sched_entity *entity, enum drm_sched_priority priority, struct drm_gpu_scheduler **sched_list, unsigned int num_sched_list, atomic_t *guilty)
bool drm_sched_wqueue_ready(struct drm_gpu_scheduler *sched)
int drm_sched_job_add_resv_dependencies(struct drm_sched_job *job, struct dma_resv *resv, enum dma_resv_usage usage)
bool drm_sched_is_stopped(struct drm_gpu_scheduler *sched)
drm_gpu_sched_stat
Definition gpu_scheduler.h:430
@ DRM_GPU_SCHED_STAT_RESET
Definition gpu_scheduler.h:432
@ DRM_GPU_SCHED_STAT_NO_HANG
Definition gpu_scheduler.h:434
@ DRM_GPU_SCHED_STAT_ENODEV
Definition gpu_scheduler.h:433
@ DRM_GPU_SCHED_STAT_NONE
Definition gpu_scheduler.h:431
void drm_sched_wqueue_start(struct drm_gpu_scheduler *sched)
bool drm_sched_job_is_signaled(struct drm_sched_job *job)
int drm_sched_job_init(struct drm_sched_job *job, struct drm_sched_entity *entity, u32 credits, void *owner, u64 drm_client_id)
void drm_sched_job_cleanup(struct drm_sched_job *job)
struct drm_gpu_scheduler * drm_sched_pick_best(struct drm_gpu_scheduler **sched_list, unsigned int num_sched_list)
void drm_sched_entity_push_job(struct drm_sched_job *sched_job)
DEFINE_CLASS(drm_sched_pending_job_iter, struct drm_sched_pending_job_iter, __drm_sched_pending_job_iter_end(_T), __drm_sched_pending_job_iter_begin(__sched), struct drm_gpu_scheduler *__sched)
drm_sched_priority
Definition gpu_scheduler.h:68
@ DRM_SCHED_PRIORITY_KERNEL
Definition gpu_scheduler.h:70
@ DRM_SCHED_PRIORITY_INVALID
Definition gpu_scheduler.h:69
@ DRM_SCHED_PRIORITY_HIGH
Definition gpu_scheduler.h:71
@ DRM_SCHED_PRIORITY_COUNT
Definition gpu_scheduler.h:75
@ DRM_SCHED_PRIORITY_LOW
Definition gpu_scheduler.h:73
@ DRM_SCHED_PRIORITY_NORMAL
Definition gpu_scheduler.h:72
int drm_sched_init(struct drm_gpu_scheduler *sched, const struct drm_sched_init_args *args)
struct drm_sched_fence * to_drm_sched_fence(struct dma_fence *f)
int drm_sched_entity_error(struct drm_sched_entity *entity)
void drm_sched_fault(struct drm_gpu_scheduler *sched)
void drm_sched_stop(struct drm_gpu_scheduler *sched, struct drm_sched_job *bad)
long drm_sched_entity_flush(struct drm_sched_entity *entity, long timeout)
void drm_sched_entity_fini(struct drm_sched_entity *entity)
uint64_t u64
Definition kernel.h:17
int64_t ktime_t
Definition kernel.h:404
int spinlock_t
Definition kernel.h:44
uint32_t u32
Definition kernel.h:16
AuProcess * owner
Definition netproxy.c:38
const char const char va_list args
Definition seq_buf.h:182
Definition atomic.h:45
Definition atomic.h:31
Definition completion.h:55
Definition workqueue.h:229
Definition fs.h:255
Definition dma-fence.h:127
Definition dma-fence.h:70
Definition dma-resv.h:155
Definition drm_file.h:165
Definition drm_gem.h:277
Definition gpu_scheduler.h:607
int hang_limit
Definition gpu_scheduler.h:626
struct ewma_drm_sched_avgtime avg_job_us
Definition gpu_scheduler.h:620
atomic_t * score
Definition gpu_scheduler.h:627
atomic_t credit_count
Definition gpu_scheduler.h:610
struct work_struct work_free_job
Definition gpu_scheduler.h:622
spinlock_t job_list_lock
Definition gpu_scheduler.h:625
bool pause_submit
Definition gpu_scheduler.h:631
u32 num_rqs
Definition gpu_scheduler.h:613
bool free_guilty
Definition gpu_scheduler.h:630
const char * name
Definition gpu_scheduler.h:612
struct device * dev
Definition gpu_scheduler.h:633
struct workqueue_struct * submit_wq
Definition gpu_scheduler.h:618
wait_queue_head_t job_scheduled
Definition gpu_scheduler.h:616
bool ready
Definition gpu_scheduler.h:629
struct list_head pending_list
Definition gpu_scheduler.h:624
struct delayed_work work_tdr
Definition gpu_scheduler.h:623
long timeout
Definition gpu_scheduler.h:611
bool own_submit_wq
Definition gpu_scheduler.h:632
u32 num_user_rqs
Definition gpu_scheduler.h:614
const struct drm_sched_backend_ops * ops
Definition gpu_scheduler.h:608
atomic64_t job_id_count
Definition gpu_scheduler.h:617
u32 credit_limit
Definition gpu_scheduler.h:609
struct work_struct work_run_job
Definition gpu_scheduler.h:621
atomic_t _score
Definition gpu_scheduler.h:628
struct workqueue_struct * timeout_wq
Definition gpu_scheduler.h:619
struct drm_sched_rq ** sched_rq
Definition gpu_scheduler.h:615
Definition gpu_scheduler.h:443
enum drm_gpu_sched_stat(* timedout_job)(struct drm_sched_job *sched_job)
Definition gpu_scheduler.h:542
void(* free_job)(struct drm_sched_job *sched_job)
Definition gpu_scheduler.h:548
void(* cancel_job)(struct drm_sched_job *sched_job)
Definition gpu_scheduler.h:566
Definition gpu_scheduler.h:88
atomic_t * guilty
Definition gpu_scheduler.h:213
struct drm_sched_entity_stats * stats
Definition gpu_scheduler.h:122
enum drm_sched_priority rq_priority
Definition gpu_scheduler.h:160
struct list_head list
Definition gpu_scheduler.h:97
uint64_t fence_context
Definition gpu_scheduler.h:192
struct completion entity_idle
Definition gpu_scheduler.h:244
unsigned int num_sched_list
Definition gpu_scheduler.h:147
atomic_t fence_seq
Definition gpu_scheduler.h:183
ktime_t oldest_job_waiting
Definition gpu_scheduler.h:251
struct drm_sched_rq * rq
Definition gpu_scheduler.h:117
spinlock_t lock
Definition gpu_scheduler.h:106
ktime_t rr_ts
Definition gpu_scheduler.h:167
enum drm_sched_priority priority
Definition gpu_scheduler.h:155
struct dma_fence * dependency
Definition gpu_scheduler.h:199
struct dma_fence_cb cb
Definition gpu_scheduler.h:206
struct dma_fence __rcu * last_scheduled
Definition gpu_scheduler.h:222
struct spsc_queue job_queue
Definition gpu_scheduler.h:172
struct rb_node rb_tree_node
Definition gpu_scheduler.h:258
bool stopped
Definition gpu_scheduler.h:236
struct task_struct * last_user
Definition gpu_scheduler.h:227
struct drm_gpu_scheduler ** sched_list
Definition gpu_scheduler.h:140
Definition gpu_scheduler.h:290
void * owner
Definition gpu_scheduler.h:333
uint64_t drm_client_id
Definition gpu_scheduler.h:340
struct dma_fence scheduled
Definition gpu_scheduler.h:295
ktime_t deadline
Definition gpu_scheduler.h:313
struct drm_gpu_scheduler * sched
Definition gpu_scheduler.h:325
spinlock_t lock
Definition gpu_scheduler.h:329
struct dma_fence * parent
Definition gpu_scheduler.h:320
struct dma_fence finished
Definition gpu_scheduler.h:307
Definition gpu_scheduler.h:653
struct device * dev
Definition gpu_scheduler.h:663
u32 num_rqs
Definition gpu_scheduler.h:657
const struct drm_sched_backend_ops * ops
Definition gpu_scheduler.h:654
atomic_t * score
Definition gpu_scheduler.h:661
struct workqueue_struct * timeout_wq
Definition gpu_scheduler.h:656
u32 credit_limit
Definition gpu_scheduler.h:658
const char * name
Definition gpu_scheduler.h:662
long timeout
Definition gpu_scheduler.h:660
struct workqueue_struct * submit_wq
Definition gpu_scheduler.h:655
unsigned int hang_limit
Definition gpu_scheduler.h:659
Definition gpu_scheduler.h:366
enum drm_sched_priority s_priority
Definition gpu_scheduler.h:391
struct drm_sched_entity * entity
Definition gpu_scheduler.h:384
unsigned int last_dependency
Definition gpu_scheduler.h:394
u32 credits
Definition gpu_scheduler.h:392
struct drm_gpu_scheduler * sched
Definition gpu_scheduler.h:381
atomic_t karma
Definition gpu_scheduler.h:395
ktime_t submit_ts
Definition gpu_scheduler.h:372
struct xarray dependencies
Definition gpu_scheduler.h:418
struct list_head list
Definition gpu_scheduler.h:398
struct spsc_node queue_node
Definition gpu_scheduler.h:397
struct dma_fence_cb cb
Definition gpu_scheduler.h:409
struct drm_sched_entity_stats * entity_stats
Definition gpu_scheduler.h:389
struct drm_sched_fence * s_fence
Definition gpu_scheduler.h:383
Definition gpu_scheduler.h:744
struct drm_gpu_scheduler * sched
Definition gpu_scheduler.h:745
Definition gpu_scheduler.h:276
struct rb_root_cached rb_tree_root
Definition gpu_scheduler.h:283
enum drm_sched_priority head_prio
Definition gpu_scheduler.h:284
struct drm_gpu_scheduler * sched
Definition gpu_scheduler.h:277
spinlock_t lock
Definition gpu_scheduler.h:279
struct list_head entities
Definition gpu_scheduler.h:282
ktime_t rr_ts
Definition gpu_scheduler.h:281
Definition fs.h:142
Definition list.h:11
Definition rbtree_types.h:21
Definition rbtree_types.h:48
Definition spsc_queue.h:32
Definition spsc_queue.h:38
Definition sched.h:121
Definition wait.h:75
Definition workqueue.h:44
Definition workqueue.h:50
Definition xarray.h:319