← Documents Documentation/gpu/rfc/i915_scheduler.rst GitHub 원문 ↗

Linux 6.18.37 · GPU·DRM·RFC

I915 GuC Submission/DRM Scheduler RFC

GuC submission·DRM scheduler 통합과 parallel submission uAPI를 설명합니다.

Source pathDocumentation/gpu/rfc/i915_scheduler.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약·해설

i915_scheduler.rst:1-152

GuC submission·DRM scheduler 통합과 parallel submission uAPI를 설명합니다.

문서 위치
항목
SourceDocumentation/gpu/rfc/i915_scheduler.rst
분량152 source lines
관련I915_CONTEXT_ENGINES_EXT_PARALLEL_SUBMIT · execbuf2

Source와 관련 symbol입니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 =========================================
2 I915 GuC Submission/DRM Scheduler Section
3 =========================================
4
5 Upstream plan
6 =============
7 For upstream the overall plan for landing GuC submission and integrating the
8 i915 with the DRM scheduler is:
9
10 * Merge basic GuC submission
11 * Basic submission support for all gen11+ platforms
12 * Not enabled by default on any current platforms but can be enabled via
13 modparam enable_guc
14 * Lots of rework will need to be done to integrate with DRM scheduler so
15 no need to nit pick everything in the code, it just should be
16 functional, no major coding style / layering errors, and not regress
17 execlists
18 * Update IGTs / selftests as needed to work with GuC submission
19 * Enable CI on supported platforms for a baseline
20 * Rework / get CI heathly for GuC submission in place as needed
21 * Merge new parallel submission uAPI
22 * Bonding uAPI completely incompatible with GuC submission, plus it has
23 severe design issues in general, which is why we want to retire it no
24 matter what
25 * New uAPI adds I915_CONTEXT_ENGINES_EXT_PARALLEL context setup step
26 which configures a slot with N contexts
27 * After I915_CONTEXT_ENGINES_EXT_PARALLEL a user can submit N batches to
28 a slot in a single execbuf IOCTL and the batches run on the GPU in
29 parallel
30 * Initially only for GuC submission but execlists can be supported if
31 needed
32 * Convert the i915 to use the DRM scheduler
33 * GuC submission backend fully integrated with DRM scheduler
34 * All request queues removed from backend (e.g. all backpressure
35 handled in DRM scheduler)
36 * Resets / cancels hook in DRM scheduler
37 * Watchdog hooks into DRM scheduler
38 * Lots of complexity of the GuC backend can be pulled out once
39 integrated with DRM scheduler (e.g. state machine gets
40 simpler, locking gets simpler, etc...)
41 * Execlists backend will minimum required to hook in the DRM scheduler
42 * Legacy interface
43 * Features like timeslicing / preemption / virtual engines would
44 be difficult to integrate with the DRM scheduler and these
45 features are not required for GuC submission as the GuC does
46 these things for us
47 * ROI low on fully integrating into DRM scheduler
48 * Fully integrating would add lots of complexity to DRM
49 scheduler
50 * Port i915 priority inheritance / boosting feature in DRM scheduler
51 * Used for i915 page flip, may be useful to other DRM drivers as
52 well
53 * Will be an optional feature in the DRM scheduler
54 * Remove in-order completion assumptions from DRM scheduler
55 * Even when using the DRM scheduler the backends will handle
56 preemption, timeslicing, etc... so it is possible for jobs to
57 finish out of order
58 * Pull out i915 priority levels and use DRM priority levels
59 * Optimize DRM scheduler as needed
60
61 TODOs for GuC submission upstream
62 =================================
63
64 * Need an update to GuC firmware / i915 to enable error state capture
65 * Open source tool to decode GuC logs
66 * Public GuC spec
67
68 New uAPI for basic GuC submission
69 =================================
70 No major changes are required to the uAPI for basic GuC submission. The only
71 change is a new scheduler attribute: I915_SCHEDULER_CAP_STATIC_PRIORITY_MAP.
72 This attribute indicates the 2k i915 user priority levels are statically mapped
73 into 3 levels as follows:
74
75 * -1k to -1 Low priority
76 * 0 Medium priority
77 * 1 to 1k High priority
78
79 This is needed because the GuC only has 4 priority bands. The highest priority
80 band is reserved with the kernel. This aligns with the DRM scheduler priority
81 levels too.
82
83 Spec references:
84 ----------------
85 * https://www.khronos.org/registry/EGL/extensions/IMG/EGL_IMG_context_priority.txt
86 * https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/chap5.html#devsandqueues-priority
87 * https://spec.oneapi.com/level-zero/latest/core/api.html#ze-command-queue-priority-t
88
89 New parallel submission uAPI
90 ============================
91 The existing bonding uAPI is completely broken with GuC submission because
92 whether a submission is a single context submit or parallel submit isn't known
93 until execbuf time activated via the I915_SUBMIT_FENCE. To submit multiple
94 contexts in parallel with the GuC the context must be explicitly registered with
95 N contexts and all N contexts must be submitted in a single command to the GuC.
96 The GuC interfaces do not support dynamically changing between N contexts as the
97 bonding uAPI does. Hence the need for a new parallel submission interface. Also
98 the legacy bonding uAPI is quite confusing and not intuitive at all. Furthermore
99 I915_SUBMIT_FENCE is by design a future fence, so not really something we should
100 continue to support.
101
102 The new parallel submission uAPI consists of 3 parts:
103
104 * Export engines logical mapping
105 * A 'set_parallel' extension to configure contexts for parallel
106 submission
107 * Extend execbuf2 IOCTL to support submitting N BBs in a single IOCTL
108
109 Export engines logical mapping
110 ------------------------------
111 Certain use cases require BBs to be placed on engine instances in logical order
112 (e.g. split-frame on gen11+). The logical mapping of engine instances can change
113 based on fusing. Rather than making UMDs be aware of fusing, simply expose the
114 logical mapping with the existing query engine info IOCTL. Also the GuC
115 submission interface currently only supports submitting multiple contexts to
116 engines in logical order which is a new requirement compared to execlists.
117 Lastly, all current platforms have at most 2 engine instances and the logical
118 order is the same as uAPI order. This will change on platforms with more than 2
119 engine instances.
120
121 A single bit will be added to drm_i915_engine_info.flags indicating that the
122 logical instance has been returned and a new field,
123 drm_i915_engine_info.logical_instance, returns the logical instance.
124
125 A 'set_parallel' extension to configure contexts for parallel submission
126 ------------------------------------------------------------------------
127 The 'set_parallel' extension configures a slot for parallel submission of N BBs.
128 It is a setup step that must be called before using any of the contexts. See
129 I915_CONTEXT_ENGINES_EXT_LOAD_BALANCE or I915_CONTEXT_ENGINES_EXT_BOND for
130 similar existing examples. Once a slot is configured for parallel submission the
131 execbuf2 IOCTL can be called submitting N BBs in a single IOCTL. Initially only
132 supports GuC submission. Execlists supports can be added later if needed.
133
134 Add I915_CONTEXT_ENGINES_EXT_PARALLEL_SUBMIT and
135 drm_i915_context_engines_parallel_submit to the uAPI to implement this
136 extension.
137
138 .. c:namespace-push:: rfc
139
140 .. kernel-doc:: include/uapi/drm/i915_drm.h
141 :functions: i915_context_engines_parallel_submit
142
143 .. c:namespace-pop::
144
145 Extend execbuf2 IOCTL to support submitting N BBs in a single IOCTL
146 -------------------------------------------------------------------
147 Contexts that have been configured with the 'set_parallel' extension can only
148 submit N BBs in a single execbuf2 IOCTL. The BBs are either the last N objects
149 in the drm_i915_gem_exec_object2 list or the first N if I915_EXEC_BATCH_FIRST is
150 set. The number of BBs is implicit based on the slot submitted and how it has
151 been configured by 'set_parallel' or other extensions. No uAPI changes are
152 required to the execbuf2 IOCTL.
153

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

GuC submission·DRM scheduler upstream 계획

1-60

Upstream 계획은 basic GuC submission을 먼저 merge하고, 새 parallel submission uAPI를 도입한 뒤 i915를 DRM scheduler로 전환하는 순서입니다.

Basic GuC submission은 모든 gen11+ platform을 지원합니다. 현재 platform에서는 기본 활성화하지 않지만 `enable_guc` module parameter로 켤 수 있습니다. DRM scheduler 통합 과정에서 큰 rework가 예정되어 있으므로 초기 merge는 기능 동작, 중대한 style·layering 오류 부재, execlists regression 방지에 초점을 둡니다.

GuC submission에 맞게 IGT·selftest를 갱신하고 지원 platform의 CI baseline을 활성화한 뒤 CI를 안정화합니다.

기존 bonding uAPI는 GuC submission과 완전히 호환되지 않고 설계 문제도 심각하므로 폐기합니다. 새 uAPI의 `I915_CONTEXT_ENGINES_EXT_PARALLEL` setup은 slot에 N개 context를 구성하고, 한 번의 execbuf IOCTL로 N개 batch를 제출하여 GPU에서 병렬 실행합니다. 처음에는 GuC만 지원하고 필요하면 execlists를 추가합니다.

DRM scheduler 전환에서는 GuC backend의 request queue를 제거하여 backpressure를 scheduler가 처리하게 하고 reset·cancel·watchdog hook을 연결합니다. 그러면 GuC state machine과 locking을 단순화할 수 있습니다.

Execlists backend는 legacy interface이므로 최소한만 DRM scheduler에 연결합니다. Timeslicing·preemption·virtual engine을 완전히 통합하는 비용은 높고, GuC가 대신 처리하므로 ROI가 낮으며 scheduler 복잡성도 커집니다.

i915 priority inheritance·boosting을 DRM scheduler의 선택 기능으로 옮깁니다. 이는 i915 page flip에 쓰이며 다른 DRM driver에도 유용할 수 있습니다. Backend가 preemption·timeslicing을 처리하여 job이 out-of-order로 끝날 수 있으므로 scheduler의 in-order completion 가정을 제거합니다. 마지막으로 i915 priority를 DRM priority level로 바꾸고 필요한 최적화를 수행합니다.

GuC scheduler upstream 단계
단계핵심
Basic GuCgen11+·enable_guc·IGT/selftest·CI
Parallel uAPIN context slot·한 execbuf의 N batch
GuC backendQueue 제거·reset/cancel/watchdog hook
ExeclistsLegacy 최소 통합
DRM schedulerPriority boost·out-of-order completion·최적화

기능 baseline에서 공통 scheduler 통합으로 진행합니다.

Upstream 순서
Basic GuC submission mergeIGT·selftest·CI baseline 안정화Parallel submission uAPI mergeGuC backend를 DRM scheduler에 완전 통합Execlists 최소 연결Priority·completion model 공통화

회귀를 막으면서 submission backend를 교체합니다.

=========================================
I915 GuC Submission/DRM Scheduler Section
=========================================

Upstream plan
=============
For upstream the overall plan for landing GuC submission and integrating the
i915 with the DRM scheduler is:

* Merge basic GuC submission
        * Basic submission support for all gen11+ platforms
        * Not enabled by default on any current platforms but can be enabled via
          modparam enable_guc
        * Lots of rework will need to be done to integrate with DRM scheduler so
          no need to nit pick everything in the code, it just should be
          functional, no major coding style / layering errors, and not regress
          execlists
        * Update IGTs / selftests as needed to work with GuC submission
        * Enable CI on supported platforms for a baseline
        * Rework / get CI heathly for GuC submission in place as needed
* Merge new parallel submission uAPI
        * Bonding uAPI completely incompatible with GuC submission, plus it has
          severe design issues in general, which is why we want to retire it no
          matter what
        * New uAPI adds I915_CONTEXT_ENGINES_EXT_PARALLEL context setup step
          which configures a slot with N contexts
        * After I915_CONTEXT_ENGINES_EXT_PARALLEL a user can submit N batches to
          a slot in a single execbuf IOCTL and the batches run on the GPU in
          parallel
        * Initially only for GuC submission but execlists can be supported if
          needed
* Convert the i915 to use the DRM scheduler
        * GuC submission backend fully integrated with DRM scheduler
                * All request queues removed from backend (e.g. all backpressure
                  handled in DRM scheduler)
                * Resets / cancels hook in DRM scheduler
                * Watchdog hooks into DRM scheduler
                * Lots of complexity of the GuC backend can be pulled out once
                  integrated with DRM scheduler (e.g. state machine gets
                  simpler, locking gets simpler, etc...)
        * Execlists backend will minimum required to hook in the DRM scheduler
                * Legacy interface
                * Features like timeslicing / preemption / virtual engines would
                  be difficult to integrate with the DRM scheduler and these
                  features are not required for GuC submission as the GuC does
                  these things for us
                * ROI low on fully integrating into DRM scheduler
                * Fully integrating would add lots of complexity to DRM
                  scheduler
        * Port i915 priority inheritance / boosting feature in DRM scheduler
                * Used for i915 page flip, may be useful to other DRM drivers as
                  well
                * Will be an optional feature in the DRM scheduler
        * Remove in-order completion assumptions from DRM scheduler
                * Even when using the DRM scheduler the backends will handle
                  preemption, timeslicing, etc... so it is possible for jobs to
                  finish out of order
        * Pull out i915 priority levels and use DRM priority levels
        * Optimize DRM scheduler as needed

GuC TODO와 static priority map

61-88

GuC submission upstream의 남은 항목은 error-state capture를 가능하게 하는 GuC firmware·i915 update, GuC log decode용 open-source tool, 공개 GuC specification입니다.

Basic GuC submission에는 큰 uAPI 변경이 필요하지 않습니다. 새 scheduler attribute `I915_SCHEDULER_CAP_STATIC_PRIORITY_MAP`만 추가합니다.

이 attribute는 i915 user priority 약 2,000단계를 GuC의 세 user band에 정적으로 mapping함을 나타냅니다. `-1k..-1`은 Low, `0`은 Medium, `1..1k`는 High입니다.

GuC에는 priority band가 네 개뿐이고 최상위 band는 kernel이 예약합니다. 나머지 세 단계는 DRM scheduler priority level과도 정렬됩니다.

Static priority mapping
i915 범위Priority
-1k to -1Low
0Medium
1 to 1kHigh
GuC highest bandKernel reserved

i915 user priority를 GuC·DRM 세 단계로 축약합니다.

Basic GuC uAPI
Userspace가 scheduler capability queryI915_SCHEDULER_CAP_STATIC_PRIORITY_MAP 확인2k user level을 Low·Medium·High로 mappingKernel-reserved GuC band는 userspace에서 제외

기존 submission uAPI에 capability만 추가합니다.

TODOs for GuC submission upstream
=================================

* Need an update to GuC firmware / i915 to enable error state capture
* Open source tool to decode GuC logs
* Public GuC spec

New uAPI for basic GuC submission
=================================
No major changes are required to the uAPI for basic GuC submission. The only
change is a new scheduler attribute: I915_SCHEDULER_CAP_STATIC_PRIORITY_MAP.
This attribute indicates the 2k i915 user priority levels are statically mapped
into 3 levels as follows:

* -1k to -1 Low priority
* 0 Medium priority
* 1 to 1k High priority

This is needed because the GuC only has 4 priority bands. The highest priority
band is reserved with the kernel. This aligns with the DRM scheduler priority
levels too.

Spec references:
----------------
* https://www.khronos.org/registry/EGL/extensions/IMG/EGL_IMG_context_priority.txt
* https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/chap5.html#devsandqueues-priority
* https://spec.oneapi.com/level-zero/latest/core/api.html#ze-command-queue-priority-t

Parallel submission과 logical engine mapping

89-124

기존 bonding uAPI에서는 execbuf 시점의 `I915_SUBMIT_FENCE`가 활성화될 때까지 single-context인지 parallel submit인지 알 수 없습니다. GuC는 N개 context를 미리 명시적으로 등록하고 한 command로 모두 제출해야 하며 bonding처럼 N을 동적으로 바꾸지 못합니다.

또한 legacy bonding uAPI는 혼란스럽고 직관적이지 않으며, `I915_SUBMIT_FENCE`는 설계상 future fence이므로 계속 지원하기 적합하지 않습니다.

새 parallel submission uAPI는 engine logical mapping 공개, context를 병렬용으로 설정하는 `set_parallel` extension, 한 IOCTL에서 N개 BB를 제출하도록 execbuf2 확장이라는 세 부분입니다.

Gen11+ split-frame처럼 BB를 logical order의 engine instance에 배치해야 하는 use case가 있습니다. Fusing에 따라 logical mapping이 바뀌므로 UMD가 fusing을 알게 하지 않고 기존 query engine info IOCTL로 mapping을 공개합니다.

GuC multi-context submission도 engine logical order만 지원합니다. 현재 platform은 engine instance가 최대 두 개이고 logical order가 uAPI order와 같지만 instance가 둘보다 많은 미래 platform에서는 달라집니다.

`drm_i915_engine_info.flags`에 logical instance가 반환되었음을 나타내는 bit를 추가하고, 새 `drm_i915_engine_info.logical_instance` field가 instance 값을 반환합니다.

Parallel uAPI 구성
부분역할
Logical mappingFusing을 숨기고 engine logical instance 공개
set_parallelSlot에 N contexts 사전 구성
execbuf2 extension한 IOCTL로 N BB 제출

Context setup과 batch submission을 분리합니다.

Logical engine mapping
Query engine info IOCTLflags의 logical-instance-valid bit 확인drm_i915_engine_info.logical_instance 읽기BB를 logical engine order로 배치GuC에 N context를 한 command로 제출

UMD가 hardware fuse detail 없이 순서를 얻습니다.

New parallel submission uAPI
============================
The existing bonding uAPI is completely broken with GuC submission because
whether a submission is a single context submit or parallel submit isn't known
until execbuf time activated via the I915_SUBMIT_FENCE. To submit multiple
contexts in parallel with the GuC the context must be explicitly registered with
N contexts and all N contexts must be submitted in a single command to the GuC.
The GuC interfaces do not support dynamically changing between N contexts as the
bonding uAPI does. Hence the need for a new parallel submission interface. Also
the legacy bonding uAPI is quite confusing and not intuitive at all. Furthermore
I915_SUBMIT_FENCE is by design a future fence, so not really something we should
continue to support.

The new parallel submission uAPI consists of 3 parts:

* Export engines logical mapping
* A 'set_parallel' extension to configure contexts for parallel
  submission
* Extend execbuf2 IOCTL to support submitting N BBs in a single IOCTL

Export engines logical mapping
------------------------------
Certain use cases require BBs to be placed on engine instances in logical order
(e.g. split-frame on gen11+). The logical mapping of engine instances can change
based on fusing. Rather than making UMDs be aware of fusing, simply expose the
logical mapping with the existing query engine info IOCTL. Also the GuC
submission interface currently only supports submitting multiple contexts to
engines in logical order which is a new requirement compared to execlists.
Lastly, all current platforms have at most 2 engine instances and the logical
order is the same as uAPI order. This will change on platforms with more than 2
engine instances.

A single bit will be added to drm_i915_engine_info.flags indicating that the
logical instance has been returned and a new field,
drm_i915_engine_info.logical_instance, returns the logical instance.

set_parallel과 execbuf2 N-BB 제출

125-152

`set_parallel` extension은 N개 BB를 병렬 제출할 slot을 구성하는 setup 단계이며, 해당 context를 사용하기 전에 호출해야 합니다. 비슷한 기존 예로 `I915_CONTEXT_ENGINES_EXT_LOAD_BALANCE`와 `I915_CONTEXT_ENGINES_EXT_BOND`가 있습니다.

Slot이 구성되면 한 execbuf2 IOCTL로 N개 BB를 제출합니다. 처음에는 GuC submission만 지원하며 필요하면 나중에 execlists를 추가할 수 있습니다.

uAPI에는 `I915_CONTEXT_ENGINES_EXT_PARALLEL_SUBMIT`과 `drm_i915_context_engines_parallel_submit`을 추가합니다. Kernel-doc은 `include/uapi/drm/i915_drm.h`의 `i915_context_engines_parallel_submit` function을 `rfc` namespace에서 포함합니다.

Parallel slot으로 구성된 context는 한 execbuf2에서 정확히 N개 BB만 제출할 수 있습니다. BB는 `drm_i915_gem_exec_object2` list의 마지막 N개이거나 `I915_EXEC_BATCH_FIRST`가 설정되면 첫 N개입니다.

BB 수는 제출한 slot과 `set_parallel` 또는 다른 extension 설정에서 암시적으로 결정되므로 execbuf2 IOCTL 자체에는 uAPI 변경이 필요 없습니다.

set_parallel 계약
항목요건
SetupContext 사용 전 slot을 N contexts로 구성
uAPII915_CONTEXT_ENGINES_EXT_PARALLEL_SUBMIT
Structuredrm_i915_context_engines_parallel_submit
Submission한 execbuf2 IOCTL에 N BB
BB 위치List 마지막 N개 또는 BATCH_FIRST이면 첫 N개

Setup과 submission에서 보장해야 할 항목입니다.

Parallel submission
set_parallel로 slot·N 구성N context와 logical engine 대응Exec object list에 N BB 배치execbuf2 한 번 호출GuC가 N context를 병렬 실행

Slot 구성이 execbuf2의 implicit N을 결정합니다.

A 'set_parallel' extension to configure contexts for parallel submission
------------------------------------------------------------------------
The 'set_parallel' extension configures a slot for parallel submission of N BBs.
It is a setup step that must be called before using any of the contexts. See
I915_CONTEXT_ENGINES_EXT_LOAD_BALANCE or I915_CONTEXT_ENGINES_EXT_BOND for
similar existing examples. Once a slot is configured for parallel submission the
execbuf2 IOCTL can be called submitting N BBs in a single IOCTL. Initially only
supports GuC submission. Execlists supports can be added later if needed.

Add I915_CONTEXT_ENGINES_EXT_PARALLEL_SUBMIT and
drm_i915_context_engines_parallel_submit to the uAPI to implement this
extension.

.. c:namespace-push:: rfc

.. kernel-doc:: include/uapi/drm/i915_drm.h
        :functions: i915_context_engines_parallel_submit

.. c:namespace-pop::

Extend execbuf2 IOCTL to support submitting N BBs in a single IOCTL
-------------------------------------------------------------------
Contexts that have been configured with the 'set_parallel' extension can only
submit N BBs in a single execbuf2 IOCTL. The BBs are either the last N objects
in the drm_i915_gem_exec_object2 list or the first N if I915_EXEC_BATCH_FIRST is
set. The number of BBs is implicit based on the slot submitted and how it has
been configured by 'set_parallel' or other extensions. No uAPI changes are
required to the execbuf2 IOCTL.