aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2018-05-03 06:31:38 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2018-05-03 06:38:39 -0400
commit51f170a544bdb06d93316d8ff0814a52daa24a6c (patch)
tree658467e218931c8661b37373346ca76029fa4fc5
parentbf3012ada1b2222e770de5c35c1bb16f73b3a01d (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.c1
-rw-r--r--drivers/dma-buf/dma-fence.c23
-rw-r--r--drivers/dma-buf/sw_sync.c1
-rw-r--r--drivers/gpu/drm/drm_crtc.c7
-rw-r--r--drivers/gpu/drm/drm_syncobj.c1
-rw-r--r--drivers/gpu/drm/qxl/qxl_release.c7
-rw-r--r--drivers/gpu/drm/scheduler/sched_fence.c11
-rw-r--r--include/linux/dma-fence.h32
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};
109EXPORT_SYMBOL(dma_fence_array_ops); 110EXPORT_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}
185EXPORT_SYMBOL(dma_fence_release); 182EXPORT_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 */
194void dma_fence_free(struct dma_fence *fence) 184void 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}
586EXPORT_SYMBOL(dma_fence_init); 577EXPORT_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
228static bool drm_crtc_fence_enable_signaling(struct dma_fence *fence)
229{
230 return true;
231}
232
228static const struct dma_fence_ops drm_crtc_fence_ops = { 233static 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
233struct dma_fence *drm_crtc_create_fence(struct drm_crtc *crtc) 240struct 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
53static 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
53static long qxl_fence_wait(struct dma_fence *fence, bool intr, 59static 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:
113static const struct dma_fence_ops qxl_fence_ops = { 119static 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
84static 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)
129const struct dma_fence_ops drm_sched_fence_ops_scheduled = { 134const 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
135const struct dma_fence_ops drm_sched_fence_ops_finished = { 143const 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);