diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2018-05-03 06:31:38 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2018-05-03 06:38:39 -0400 |
commit | 51f170a544bdb06d93316d8ff0814a52daa24a6c (patch) | |
tree | 658467e218931c8661b37373346ca76029fa4fc5 | |
parent | bf3012ada1b2222e770de5c35c1bb16f73b3a01d (diff) |
Revert 190c462d5be19ba622a82f5fd0625087c870a1e6..bf3012ada1b2222e770de5c35c1bb16f73b3a01d"
I shouldn't have pushed this, CI was right - I failed to remove the
BUG_ON(!ops->wait);
Reported-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
-rw-r--r-- | drivers/dma-buf/dma-fence-array.c | 1 | ||||
-rw-r--r-- | drivers/dma-buf/dma-fence.c | 23 | ||||
-rw-r--r-- | drivers/dma-buf/sw_sync.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_syncobj.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_release.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/scheduler/sched_fence.c | 11 | ||||
-rw-r--r-- | include/linux/dma-fence.h | 32 |
8 files changed, 54 insertions, 29 deletions
diff --git a/drivers/dma-buf/dma-fence-array.c b/drivers/dma-buf/dma-fence-array.c index a8c254497251..dd1edfb27b61 100644 --- a/drivers/dma-buf/dma-fence-array.c +++ b/drivers/dma-buf/dma-fence-array.c | |||
@@ -104,6 +104,7 @@ const struct dma_fence_ops dma_fence_array_ops = { | |||
104 | .get_timeline_name = dma_fence_array_get_timeline_name, | 104 | .get_timeline_name = dma_fence_array_get_timeline_name, |
105 | .enable_signaling = dma_fence_array_enable_signaling, | 105 | .enable_signaling = dma_fence_array_enable_signaling, |
106 | .signaled = dma_fence_array_signaled, | 106 | .signaled = dma_fence_array_signaled, |
107 | .wait = dma_fence_default_wait, | ||
107 | .release = dma_fence_array_release, | 108 | .release = dma_fence_array_release, |
108 | }; | 109 | }; |
109 | EXPORT_SYMBOL(dma_fence_array_ops); | 110 | EXPORT_SYMBOL(dma_fence_array_ops); |
diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c index 30fcbe415ff4..4edb9fd3cf47 100644 --- a/drivers/dma-buf/dma-fence.c +++ b/drivers/dma-buf/dma-fence.c | |||
@@ -158,10 +158,7 @@ dma_fence_wait_timeout(struct dma_fence *fence, bool intr, signed long timeout) | |||
158 | return -EINVAL; | 158 | return -EINVAL; |
159 | 159 | ||
160 | trace_dma_fence_wait_start(fence); | 160 | trace_dma_fence_wait_start(fence); |
161 | if (fence->ops->wait) | 161 | ret = fence->ops->wait(fence, intr, timeout); |
162 | ret = fence->ops->wait(fence, intr, timeout); | ||
163 | else | ||
164 | ret = dma_fence_default_wait(fence, intr, timeout); | ||
165 | trace_dma_fence_wait_end(fence); | 162 | trace_dma_fence_wait_end(fence); |
166 | return ret; | 163 | return ret; |
167 | } | 164 | } |
@@ -184,13 +181,6 @@ void dma_fence_release(struct kref *kref) | |||
184 | } | 181 | } |
185 | EXPORT_SYMBOL(dma_fence_release); | 182 | EXPORT_SYMBOL(dma_fence_release); |
186 | 183 | ||
187 | /** | ||
188 | * dma_fence_free - default release function for &dma_fence. | ||
189 | * @fence: fence to release | ||
190 | * | ||
191 | * This is the default implementation for &dma_fence_ops.release. It calls | ||
192 | * kfree_rcu() on @fence. | ||
193 | */ | ||
194 | void dma_fence_free(struct dma_fence *fence) | 184 | void dma_fence_free(struct dma_fence *fence) |
195 | { | 185 | { |
196 | kfree_rcu(fence, rcu); | 186 | kfree_rcu(fence, rcu); |
@@ -506,6 +496,11 @@ dma_fence_wait_any_timeout(struct dma_fence **fences, uint32_t count, | |||
506 | for (i = 0; i < count; ++i) { | 496 | for (i = 0; i < count; ++i) { |
507 | struct dma_fence *fence = fences[i]; | 497 | struct dma_fence *fence = fences[i]; |
508 | 498 | ||
499 | if (fence->ops->wait != dma_fence_default_wait) { | ||
500 | ret = -EINVAL; | ||
501 | goto fence_rm_cb; | ||
502 | } | ||
503 | |||
509 | cb[i].task = current; | 504 | cb[i].task = current; |
510 | if (dma_fence_add_callback(fence, &cb[i].base, | 505 | if (dma_fence_add_callback(fence, &cb[i].base, |
511 | dma_fence_default_wait_cb)) { | 506 | dma_fence_default_wait_cb)) { |
@@ -565,7 +560,7 @@ dma_fence_init(struct dma_fence *fence, const struct dma_fence_ops *ops, | |||
565 | spinlock_t *lock, u64 context, unsigned seqno) | 560 | spinlock_t *lock, u64 context, unsigned seqno) |
566 | { | 561 | { |
567 | BUG_ON(!lock); | 562 | BUG_ON(!lock); |
568 | BUG_ON(!ops || !ops->wait || | 563 | BUG_ON(!ops || !ops->wait || !ops->enable_signaling || |
569 | !ops->get_driver_name || !ops->get_timeline_name); | 564 | !ops->get_driver_name || !ops->get_timeline_name); |
570 | 565 | ||
571 | kref_init(&fence->refcount); | 566 | kref_init(&fence->refcount); |
@@ -577,10 +572,6 @@ dma_fence_init(struct dma_fence *fence, const struct dma_fence_ops *ops, | |||
577 | fence->flags = 0UL; | 572 | fence->flags = 0UL; |
578 | fence->error = 0; | 573 | fence->error = 0; |
579 | 574 | ||
580 | if (!ops->enable_signaling) | ||
581 | set_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, | ||
582 | &fence->flags); | ||
583 | |||
584 | trace_dma_fence_init(fence); | 575 | trace_dma_fence_init(fence); |
585 | } | 576 | } |
586 | EXPORT_SYMBOL(dma_fence_init); | 577 | EXPORT_SYMBOL(dma_fence_init); |
diff --git a/drivers/dma-buf/sw_sync.c b/drivers/dma-buf/sw_sync.c index 53c1d6d36a64..3d78ca89a605 100644 --- a/drivers/dma-buf/sw_sync.c +++ b/drivers/dma-buf/sw_sync.c | |||
@@ -188,6 +188,7 @@ static const struct dma_fence_ops timeline_fence_ops = { | |||
188 | .get_timeline_name = timeline_fence_get_timeline_name, | 188 | .get_timeline_name = timeline_fence_get_timeline_name, |
189 | .enable_signaling = timeline_fence_enable_signaling, | 189 | .enable_signaling = timeline_fence_enable_signaling, |
190 | .signaled = timeline_fence_signaled, | 190 | .signaled = timeline_fence_signaled, |
191 | .wait = dma_fence_default_wait, | ||
191 | .release = timeline_fence_release, | 192 | .release = timeline_fence_release, |
192 | .fence_value_str = timeline_fence_value_str, | 193 | .fence_value_str = timeline_fence_value_str, |
193 | .timeline_value_str = timeline_fence_timeline_value_str, | 194 | .timeline_value_str = timeline_fence_timeline_value_str, |
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index e4d3285f4191..a231dd5dce16 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
@@ -225,9 +225,16 @@ static const char *drm_crtc_fence_get_timeline_name(struct dma_fence *fence) | |||
225 | return crtc->timeline_name; | 225 | return crtc->timeline_name; |
226 | } | 226 | } |
227 | 227 | ||
228 | static bool drm_crtc_fence_enable_signaling(struct dma_fence *fence) | ||
229 | { | ||
230 | return true; | ||
231 | } | ||
232 | |||
228 | static const struct dma_fence_ops drm_crtc_fence_ops = { | 233 | static const struct dma_fence_ops drm_crtc_fence_ops = { |
229 | .get_driver_name = drm_crtc_fence_get_driver_name, | 234 | .get_driver_name = drm_crtc_fence_get_driver_name, |
230 | .get_timeline_name = drm_crtc_fence_get_timeline_name, | 235 | .get_timeline_name = drm_crtc_fence_get_timeline_name, |
236 | .enable_signaling = drm_crtc_fence_enable_signaling, | ||
237 | .wait = dma_fence_default_wait, | ||
231 | }; | 238 | }; |
232 | 239 | ||
233 | struct dma_fence *drm_crtc_create_fence(struct drm_crtc *crtc) | 240 | struct dma_fence *drm_crtc_create_fence(struct drm_crtc *crtc) |
diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index adb3cb27d31e..d4f4ce484529 100644 --- a/drivers/gpu/drm/drm_syncobj.c +++ b/drivers/gpu/drm/drm_syncobj.c | |||
@@ -207,6 +207,7 @@ static const struct dma_fence_ops drm_syncobj_null_fence_ops = { | |||
207 | .get_driver_name = drm_syncobj_null_fence_get_name, | 207 | .get_driver_name = drm_syncobj_null_fence_get_name, |
208 | .get_timeline_name = drm_syncobj_null_fence_get_name, | 208 | .get_timeline_name = drm_syncobj_null_fence_get_name, |
209 | .enable_signaling = drm_syncobj_null_fence_enable_signaling, | 209 | .enable_signaling = drm_syncobj_null_fence_enable_signaling, |
210 | .wait = dma_fence_default_wait, | ||
210 | .release = NULL, | 211 | .release = NULL, |
211 | }; | 212 | }; |
212 | 213 | ||
diff --git a/drivers/gpu/drm/qxl/qxl_release.c b/drivers/gpu/drm/qxl/qxl_release.c index 04f3605ac42a..5d84a66fed36 100644 --- a/drivers/gpu/drm/qxl/qxl_release.c +++ b/drivers/gpu/drm/qxl/qxl_release.c | |||
@@ -50,6 +50,12 @@ static const char *qxl_get_timeline_name(struct dma_fence *fence) | |||
50 | return "release"; | 50 | return "release"; |
51 | } | 51 | } |
52 | 52 | ||
53 | static bool qxl_nop_signaling(struct dma_fence *fence) | ||
54 | { | ||
55 | /* fences are always automatically signaled, so just pretend we did this.. */ | ||
56 | return true; | ||
57 | } | ||
58 | |||
53 | static long qxl_fence_wait(struct dma_fence *fence, bool intr, | 59 | static long qxl_fence_wait(struct dma_fence *fence, bool intr, |
54 | signed long timeout) | 60 | signed long timeout) |
55 | { | 61 | { |
@@ -113,6 +119,7 @@ signaled: | |||
113 | static const struct dma_fence_ops qxl_fence_ops = { | 119 | static const struct dma_fence_ops qxl_fence_ops = { |
114 | .get_driver_name = qxl_get_driver_name, | 120 | .get_driver_name = qxl_get_driver_name, |
115 | .get_timeline_name = qxl_get_timeline_name, | 121 | .get_timeline_name = qxl_get_timeline_name, |
122 | .enable_signaling = qxl_nop_signaling, | ||
116 | .wait = qxl_fence_wait, | 123 | .wait = qxl_fence_wait, |
117 | }; | 124 | }; |
118 | 125 | ||
diff --git a/drivers/gpu/drm/scheduler/sched_fence.c b/drivers/gpu/drm/scheduler/sched_fence.c index 4843289cc8f0..69aab086b913 100644 --- a/drivers/gpu/drm/scheduler/sched_fence.c +++ b/drivers/gpu/drm/scheduler/sched_fence.c | |||
@@ -81,6 +81,11 @@ static const char *drm_sched_fence_get_timeline_name(struct dma_fence *f) | |||
81 | return (const char *)fence->sched->name; | 81 | return (const char *)fence->sched->name; |
82 | } | 82 | } |
83 | 83 | ||
84 | static bool drm_sched_fence_enable_signaling(struct dma_fence *f) | ||
85 | { | ||
86 | return true; | ||
87 | } | ||
88 | |||
84 | /** | 89 | /** |
85 | * amd_sched_fence_free - free up the fence memory | 90 | * amd_sched_fence_free - free up the fence memory |
86 | * | 91 | * |
@@ -129,12 +134,18 @@ static void drm_sched_fence_release_finished(struct dma_fence *f) | |||
129 | const struct dma_fence_ops drm_sched_fence_ops_scheduled = { | 134 | const struct dma_fence_ops drm_sched_fence_ops_scheduled = { |
130 | .get_driver_name = drm_sched_fence_get_driver_name, | 135 | .get_driver_name = drm_sched_fence_get_driver_name, |
131 | .get_timeline_name = drm_sched_fence_get_timeline_name, | 136 | .get_timeline_name = drm_sched_fence_get_timeline_name, |
137 | .enable_signaling = drm_sched_fence_enable_signaling, | ||
138 | .signaled = NULL, | ||
139 | .wait = dma_fence_default_wait, | ||
132 | .release = drm_sched_fence_release_scheduled, | 140 | .release = drm_sched_fence_release_scheduled, |
133 | }; | 141 | }; |
134 | 142 | ||
135 | const struct dma_fence_ops drm_sched_fence_ops_finished = { | 143 | const struct dma_fence_ops drm_sched_fence_ops_finished = { |
136 | .get_driver_name = drm_sched_fence_get_driver_name, | 144 | .get_driver_name = drm_sched_fence_get_driver_name, |
137 | .get_timeline_name = drm_sched_fence_get_timeline_name, | 145 | .get_timeline_name = drm_sched_fence_get_timeline_name, |
146 | .enable_signaling = drm_sched_fence_enable_signaling, | ||
147 | .signaled = NULL, | ||
148 | .wait = dma_fence_default_wait, | ||
138 | .release = drm_sched_fence_release_finished, | 149 | .release = drm_sched_fence_release_finished, |
139 | }; | 150 | }; |
140 | 151 | ||
diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h index 02dba8cd033d..eb9b05aa5aea 100644 --- a/include/linux/dma-fence.h +++ b/include/linux/dma-fence.h | |||
@@ -166,8 +166,7 @@ struct dma_fence_ops { | |||
166 | * released when the fence is signalled (through e.g. the interrupt | 166 | * released when the fence is signalled (through e.g. the interrupt |
167 | * handler). | 167 | * handler). |
168 | * | 168 | * |
169 | * This callback is optional. If this callback is not present, then the | 169 | * This callback is mandatory. |
170 | * driver must always have signaling enabled. | ||
171 | */ | 170 | */ |
172 | bool (*enable_signaling)(struct dma_fence *fence); | 171 | bool (*enable_signaling)(struct dma_fence *fence); |
173 | 172 | ||
@@ -191,14 +190,11 @@ struct dma_fence_ops { | |||
191 | /** | 190 | /** |
192 | * @wait: | 191 | * @wait: |
193 | * | 192 | * |
194 | * Custom wait implementation, defaults to dma_fence_default_wait() if | 193 | * Custom wait implementation, or dma_fence_default_wait. |
195 | * not set. | ||
196 | * | 194 | * |
197 | * The dma_fence_default_wait implementation should work for any fence, as long | 195 | * Must not be NULL, set to dma_fence_default_wait for default implementation. |
198 | * as @enable_signaling works correctly. This hook allows drivers to | 196 | * the dma_fence_default_wait implementation should work for any fence, as long |
199 | * have an optimized version for the case where a process context is | 197 | * as enable_signaling works correctly. |
200 | * already available, e.g. if @enable_signaling for the general case | ||
201 | * needs to set up a worker thread. | ||
202 | * | 198 | * |
203 | * Must return -ERESTARTSYS if the wait is intr = true and the wait was | 199 | * Must return -ERESTARTSYS if the wait is intr = true and the wait was |
204 | * interrupted, and remaining jiffies if fence has signaled, or 0 if wait | 200 | * interrupted, and remaining jiffies if fence has signaled, or 0 if wait |
@@ -206,7 +202,7 @@ struct dma_fence_ops { | |||
206 | * which should be treated as if the fence is signaled. For example a hardware | 202 | * which should be treated as if the fence is signaled. For example a hardware |
207 | * lockup could be reported like that. | 203 | * lockup could be reported like that. |
208 | * | 204 | * |
209 | * This callback is optional. | 205 | * This callback is mandatory. |
210 | */ | 206 | */ |
211 | signed long (*wait)(struct dma_fence *fence, | 207 | signed long (*wait)(struct dma_fence *fence, |
212 | bool intr, signed long timeout); | 208 | bool intr, signed long timeout); |
@@ -222,6 +218,17 @@ struct dma_fence_ops { | |||
222 | void (*release)(struct dma_fence *fence); | 218 | void (*release)(struct dma_fence *fence); |
223 | 219 | ||
224 | /** | 220 | /** |
221 | * @fill_driver_data: | ||
222 | * | ||
223 | * Callback to fill in free-form debug info. | ||
224 | * | ||
225 | * Returns amount of bytes filled, or negative error on failure. | ||
226 | * | ||
227 | * This callback is optional. | ||
228 | */ | ||
229 | int (*fill_driver_data)(struct dma_fence *fence, void *data, int size); | ||
230 | |||
231 | /** | ||
225 | * @fence_value_str: | 232 | * @fence_value_str: |
226 | * | 233 | * |
227 | * Callback to fill in free-form debug info specific to this fence, like | 234 | * Callback to fill in free-form debug info specific to this fence, like |
@@ -235,9 +242,8 @@ struct dma_fence_ops { | |||
235 | * @timeline_value_str: | 242 | * @timeline_value_str: |
236 | * | 243 | * |
237 | * Fills in the current value of the timeline as a string, like the | 244 | * Fills in the current value of the timeline as a string, like the |
238 | * sequence number. Note that the specific fence passed to this function | 245 | * sequence number. This should match what @fill_driver_data prints for |
239 | * should not matter, drivers should only use it to look up the | 246 | * the most recently signalled fence (assuming no delayed signalling). |
240 | * corresponding timeline structures. | ||
241 | */ | 247 | */ |
242 | void (*timeline_value_str)(struct dma_fence *fence, | 248 | void (*timeline_value_str)(struct dma_fence *fence, |
243 | char *str, int size); | 249 | char *str, int size); |