.. | .. |
---|
11 | 11 | The three main components of this are: (1) dma-buf, representing a |
---|
12 | 12 | sg_table and exposed to userspace as a file descriptor to allow passing |
---|
13 | 13 | between devices, (2) fence, which provides a mechanism to signal when |
---|
14 | | -one device as finished access, and (3) reservation, which manages the |
---|
| 14 | +one device has finished access, and (3) reservation, which manages the |
---|
15 | 15 | shared or exclusive fence(s) associated with the buffer. |
---|
16 | 16 | |
---|
17 | 17 | Shared DMA Buffers |
---|
.. | .. |
---|
31 | 31 | - implements and manages operations in :c:type:`struct dma_buf_ops |
---|
32 | 32 | <dma_buf_ops>` for the buffer, |
---|
33 | 33 | - allows other users to share the buffer by using dma_buf sharing APIs, |
---|
34 | | - - manages the details of buffer allocation, wrapped int a :c:type:`struct |
---|
| 34 | + - manages the details of buffer allocation, wrapped in a :c:type:`struct |
---|
35 | 35 | dma_buf <dma_buf>`, |
---|
36 | 36 | - decides about the actual backing storage where this allocation happens, |
---|
37 | 37 | - and takes care of any migration of scatterlist - for all (shared) users of |
---|
.. | .. |
---|
85 | 85 | - Memory mapping the contents of the DMA buffer is also supported. See the |
---|
86 | 86 | discussion below on `CPU Access to DMA Buffer Objects`_ for the full details. |
---|
87 | 87 | |
---|
88 | | -- The DMA buffer FD is also pollable, see `Fence Poll Support`_ below for |
---|
| 88 | +- The DMA buffer FD is also pollable, see `Implicit Fence Poll Support`_ below for |
---|
89 | 89 | details. |
---|
90 | 90 | |
---|
91 | 91 | Basic Operation and Device DMA Access |
---|
.. | .. |
---|
100 | 100 | .. kernel-doc:: drivers/dma-buf/dma-buf.c |
---|
101 | 101 | :doc: cpu access |
---|
102 | 102 | |
---|
103 | | -Fence Poll Support |
---|
104 | | -~~~~~~~~~~~~~~~~~~ |
---|
| 103 | +Implicit Fence Poll Support |
---|
| 104 | +~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
---|
105 | 105 | |
---|
106 | 106 | .. kernel-doc:: drivers/dma-buf/dma-buf.c |
---|
107 | | - :doc: fence polling |
---|
| 107 | + :doc: implicit fence polling |
---|
108 | 108 | |
---|
109 | 109 | Kernel Functions and Structures Reference |
---|
110 | 110 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
---|
.. | .. |
---|
118 | 118 | Reservation Objects |
---|
119 | 119 | ------------------- |
---|
120 | 120 | |
---|
121 | | -.. kernel-doc:: drivers/dma-buf/reservation.c |
---|
| 121 | +.. kernel-doc:: drivers/dma-buf/dma-resv.c |
---|
122 | 122 | :doc: Reservation Object Overview |
---|
123 | 123 | |
---|
124 | | -.. kernel-doc:: drivers/dma-buf/reservation.c |
---|
| 124 | +.. kernel-doc:: drivers/dma-buf/dma-resv.c |
---|
125 | 125 | :export: |
---|
126 | 126 | |
---|
127 | | -.. kernel-doc:: include/linux/reservation.h |
---|
| 127 | +.. kernel-doc:: include/linux/dma-resv.h |
---|
128 | 128 | :internal: |
---|
129 | 129 | |
---|
130 | 130 | DMA Fences |
---|
.. | .. |
---|
132 | 132 | |
---|
133 | 133 | .. kernel-doc:: drivers/dma-buf/dma-fence.c |
---|
134 | 134 | :doc: DMA fences overview |
---|
| 135 | + |
---|
| 136 | +DMA Fence Cross-Driver Contract |
---|
| 137 | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
---|
| 138 | + |
---|
| 139 | +.. kernel-doc:: drivers/dma-buf/dma-fence.c |
---|
| 140 | + :doc: fence cross-driver contract |
---|
| 141 | + |
---|
| 142 | +DMA Fence Signalling Annotations |
---|
| 143 | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
---|
| 144 | + |
---|
| 145 | +.. kernel-doc:: drivers/dma-buf/dma-fence.c |
---|
| 146 | + :doc: fence signalling annotation |
---|
135 | 147 | |
---|
136 | 148 | DMA Fences Functions Reference |
---|
137 | 149 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
---|
.. | .. |
---|
166 | 178 | .. kernel-doc:: include/linux/sync_file.h |
---|
167 | 179 | :internal: |
---|
168 | 180 | |
---|
| 181 | +Indefinite DMA Fences |
---|
| 182 | +~~~~~~~~~~~~~~~~~~~~~ |
---|
| 183 | + |
---|
| 184 | +At various times &dma_fence with an indefinite time until dma_fence_wait() |
---|
| 185 | +finishes have been proposed. Examples include: |
---|
| 186 | + |
---|
| 187 | +* Future fences, used in HWC1 to signal when a buffer isn't used by the display |
---|
| 188 | + any longer, and created with the screen update that makes the buffer visible. |
---|
| 189 | + The time this fence completes is entirely under userspace's control. |
---|
| 190 | + |
---|
| 191 | +* Proxy fences, proposed to handle &drm_syncobj for which the fence has not yet |
---|
| 192 | + been set. Used to asynchronously delay command submission. |
---|
| 193 | + |
---|
| 194 | +* Userspace fences or gpu futexes, fine-grained locking within a command buffer |
---|
| 195 | + that userspace uses for synchronization across engines or with the CPU, which |
---|
| 196 | + are then imported as a DMA fence for integration into existing winsys |
---|
| 197 | + protocols. |
---|
| 198 | + |
---|
| 199 | +* Long-running compute command buffers, while still using traditional end of |
---|
| 200 | + batch DMA fences for memory management instead of context preemption DMA |
---|
| 201 | + fences which get reattached when the compute job is rescheduled. |
---|
| 202 | + |
---|
| 203 | +Common to all these schemes is that userspace controls the dependencies of these |
---|
| 204 | +fences and controls when they fire. Mixing indefinite fences with normal |
---|
| 205 | +in-kernel DMA fences does not work, even when a fallback timeout is included to |
---|
| 206 | +protect against malicious userspace: |
---|
| 207 | + |
---|
| 208 | +* Only the kernel knows about all DMA fence dependencies, userspace is not aware |
---|
| 209 | + of dependencies injected due to memory management or scheduler decisions. |
---|
| 210 | + |
---|
| 211 | +* Only userspace knows about all dependencies in indefinite fences and when |
---|
| 212 | + exactly they will complete, the kernel has no visibility. |
---|
| 213 | + |
---|
| 214 | +Furthermore the kernel has to be able to hold up userspace command submission |
---|
| 215 | +for memory management needs, which means we must support indefinite fences being |
---|
| 216 | +dependent upon DMA fences. If the kernel also support indefinite fences in the |
---|
| 217 | +kernel like a DMA fence, like any of the above proposal would, there is the |
---|
| 218 | +potential for deadlocks. |
---|
| 219 | + |
---|
| 220 | +.. kernel-render:: DOT |
---|
| 221 | + :alt: Indefinite Fencing Dependency Cycle |
---|
| 222 | + :caption: Indefinite Fencing Dependency Cycle |
---|
| 223 | + |
---|
| 224 | + digraph "Fencing Cycle" { |
---|
| 225 | + node [shape=box bgcolor=grey style=filled] |
---|
| 226 | + kernel [label="Kernel DMA Fences"] |
---|
| 227 | + userspace [label="userspace controlled fences"] |
---|
| 228 | + kernel -> userspace [label="memory management"] |
---|
| 229 | + userspace -> kernel [label="Future fence, fence proxy, ..."] |
---|
| 230 | + |
---|
| 231 | + { rank=same; kernel userspace } |
---|
| 232 | + } |
---|
| 233 | + |
---|
| 234 | +This means that the kernel might accidentally create deadlocks |
---|
| 235 | +through memory management dependencies which userspace is unaware of, which |
---|
| 236 | +randomly hangs workloads until the timeout kicks in. Workloads, which from |
---|
| 237 | +userspace's perspective, do not contain a deadlock. In such a mixed fencing |
---|
| 238 | +architecture there is no single entity with knowledge of all dependencies. |
---|
| 239 | +Thefore preventing such deadlocks from within the kernel is not possible. |
---|
| 240 | + |
---|
| 241 | +The only solution to avoid dependencies loops is by not allowing indefinite |
---|
| 242 | +fences in the kernel. This means: |
---|
| 243 | + |
---|
| 244 | +* No future fences, proxy fences or userspace fences imported as DMA fences, |
---|
| 245 | + with or without a timeout. |
---|
| 246 | + |
---|
| 247 | +* No DMA fences that signal end of batchbuffer for command submission where |
---|
| 248 | + userspace is allowed to use userspace fencing or long running compute |
---|
| 249 | + workloads. This also means no implicit fencing for shared buffers in these |
---|
| 250 | + cases. |
---|