Skip to content

Commit 73511ed

Browse files
dma-buf: specify usage while adding fences to dma_resv obj v7
Instead of distingting between shared and exclusive fences specify the fence usage while adding fences. Rework all drivers to use this interface instead and deprecate the old one. v2: some kerneldoc comments suggested by Daniel v3: fix a missing case in radeon v4: rebase on nouveau changes, fix lockdep and temporary disable warning v5: more documentation updates v6: separate internal dma_resv changes from this patch, avoids to disable warning temporary, rebase on upstream changes v7: fix missed case in lima driver, minimize changes to i915_gem_busy_ioctl Signed-off-by: Christian König <[email protected]> Reviewed-by: Daniel Vetter <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 7bc80a5 commit 73511ed

30 files changed

+149
-166
lines changed

drivers/dma-buf/dma-resv.c

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -234,14 +234,14 @@ EXPORT_SYMBOL(dma_resv_reserve_fences);
234234

235235
#ifdef CONFIG_DEBUG_MUTEXES
236236
/**
237-
* dma_resv_reset_shared_max - reset shared fences for debugging
237+
* dma_resv_reset_max_fences - reset shared fences for debugging
238238
* @obj: the dma_resv object to reset
239239
*
240240
* Reset the number of pre-reserved shared slots to test that drivers do
241241
* correct slot allocation using dma_resv_reserve_fences(). See also
242242
* &dma_resv_list.shared_max.
243243
*/
244-
void dma_resv_reset_shared_max(struct dma_resv *obj)
244+
void dma_resv_reset_max_fences(struct dma_resv *obj)
245245
{
246246
struct dma_resv_list *fences = dma_resv_shared_list(obj);
247247

@@ -251,7 +251,7 @@ void dma_resv_reset_shared_max(struct dma_resv *obj)
251251
if (fences)
252252
fences->shared_max = fences->shared_count;
253253
}
254-
EXPORT_SYMBOL(dma_resv_reset_shared_max);
254+
EXPORT_SYMBOL(dma_resv_reset_max_fences);
255255
#endif
256256

257257
/**
@@ -264,7 +264,8 @@ EXPORT_SYMBOL(dma_resv_reset_shared_max);
264264
*
265265
* See also &dma_resv.fence for a discussion of the semantics.
266266
*/
267-
void dma_resv_add_shared_fence(struct dma_resv *obj, struct dma_fence *fence)
267+
static void dma_resv_add_shared_fence(struct dma_resv *obj,
268+
struct dma_fence *fence)
268269
{
269270
struct dma_resv_list *fobj;
270271
struct dma_fence *old;
@@ -305,13 +306,13 @@ void dma_resv_add_shared_fence(struct dma_resv *obj, struct dma_fence *fence)
305306
write_seqcount_end(&obj->seq);
306307
dma_fence_put(old);
307308
}
308-
EXPORT_SYMBOL(dma_resv_add_shared_fence);
309309

310310
/**
311311
* dma_resv_replace_fences - replace fences in the dma_resv obj
312312
* @obj: the reservation object
313313
* @context: the context of the fences to replace
314314
* @replacement: the new fence to use instead
315+
* @usage: how the new fence is used, see enum dma_resv_usage
315316
*
316317
* Replace fences with a specified context with a new fence. Only valid if the
317318
* operation represented by the original fence has no longer access to the
@@ -321,12 +322,16 @@ EXPORT_SYMBOL(dma_resv_add_shared_fence);
321322
* update fence which makes the resource inaccessible.
322323
*/
323324
void dma_resv_replace_fences(struct dma_resv *obj, uint64_t context,
324-
struct dma_fence *replacement)
325+
struct dma_fence *replacement,
326+
enum dma_resv_usage usage)
325327
{
326328
struct dma_resv_list *list;
327329
struct dma_fence *old;
328330
unsigned int i;
329331

332+
/* Only readers supported for now */
333+
WARN_ON(usage != DMA_RESV_USAGE_READ);
334+
330335
dma_resv_assert_held(obj);
331336

332337
write_seqcount_begin(&obj->seq);
@@ -360,7 +365,8 @@ EXPORT_SYMBOL(dma_resv_replace_fences);
360365
* Add a fence to the exclusive slot. @obj must be locked with dma_resv_lock().
361366
* See also &dma_resv.fence_excl for a discussion of the semantics.
362367
*/
363-
void dma_resv_add_excl_fence(struct dma_resv *obj, struct dma_fence *fence)
368+
static void dma_resv_add_excl_fence(struct dma_resv *obj,
369+
struct dma_fence *fence)
364370
{
365371
struct dma_fence *old_fence = dma_resv_excl_fence(obj);
366372

@@ -375,7 +381,27 @@ void dma_resv_add_excl_fence(struct dma_resv *obj, struct dma_fence *fence)
375381

376382
dma_fence_put(old_fence);
377383
}
378-
EXPORT_SYMBOL(dma_resv_add_excl_fence);
384+
385+
/**
386+
* dma_resv_add_fence - Add a fence to the dma_resv obj
387+
* @obj: the reservation object
388+
* @fence: the fence to add
389+
* @usage: how the fence is used, see enum dma_resv_usage
390+
*
391+
* Add a fence to a slot, @obj must be locked with dma_resv_lock(), and
392+
* dma_resv_reserve_fences() has been called.
393+
*
394+
* See also &dma_resv.fence for a discussion of the semantics.
395+
*/
396+
void dma_resv_add_fence(struct dma_resv *obj, struct dma_fence *fence,
397+
enum dma_resv_usage usage)
398+
{
399+
if (usage == DMA_RESV_USAGE_WRITE)
400+
dma_resv_add_excl_fence(obj, fence);
401+
else
402+
dma_resv_add_shared_fence(obj, fence);
403+
}
404+
EXPORT_SYMBOL(dma_resv_add_fence);
379405

380406
/* Restart the iterator by initializing all the necessary fields, but not the
381407
* relation to the dma_resv object. */
@@ -574,7 +600,7 @@ int dma_resv_copy_fences(struct dma_resv *dst, struct dma_resv *src)
574600
}
575601

576602
dma_fence_get(f);
577-
if (dma_resv_iter_is_exclusive(&cursor))
603+
if (dma_resv_iter_usage(&cursor) == DMA_RESV_USAGE_WRITE)
578604
excl = f;
579605
else
580606
RCU_INIT_POINTER(list->shared[list->shared_count++], f);
@@ -771,13 +797,13 @@ EXPORT_SYMBOL_GPL(dma_resv_test_signaled);
771797
*/
772798
void dma_resv_describe(struct dma_resv *obj, struct seq_file *seq)
773799
{
800+
static const char *usage[] = { "write", "read" };
774801
struct dma_resv_iter cursor;
775802
struct dma_fence *fence;
776803

777804
dma_resv_for_each_fence(&cursor, obj, DMA_RESV_USAGE_READ, fence) {
778805
seq_printf(seq, "\t%s fence:",
779-
dma_resv_iter_is_exclusive(&cursor) ?
780-
"Exclusive" : "Shared");
806+
usage[dma_resv_iter_usage(&cursor)]);
781807
dma_fence_describe(fence, seq);
782808
}
783809
}

drivers/dma-buf/st-dma-resv.c

Lines changed: 27 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@ static int sanitycheck(void *arg)
5858
return r;
5959
}
6060

61-
static int test_signaling(void *arg, enum dma_resv_usage usage)
61+
static int test_signaling(void *arg)
6262
{
63+
enum dma_resv_usage usage = (unsigned long)arg;
6364
struct dma_resv resv;
6465
struct dma_fence *f;
6566
int r;
@@ -81,11 +82,7 @@ static int test_signaling(void *arg, enum dma_resv_usage usage)
8182
goto err_unlock;
8283
}
8384

84-
if (usage >= DMA_RESV_USAGE_READ)
85-
dma_resv_add_shared_fence(&resv, f);
86-
else
87-
dma_resv_add_excl_fence(&resv, f);
88-
85+
dma_resv_add_fence(&resv, f, usage);
8986
if (dma_resv_test_signaled(&resv, usage)) {
9087
pr_err("Resv unexpectedly signaled\n");
9188
r = -EINVAL;
@@ -105,18 +102,9 @@ static int test_signaling(void *arg, enum dma_resv_usage usage)
105102
return r;
106103
}
107104

108-
static int test_excl_signaling(void *arg)
109-
{
110-
return test_signaling(arg, DMA_RESV_USAGE_WRITE);
111-
}
112-
113-
static int test_shared_signaling(void *arg)
114-
{
115-
return test_signaling(arg, DMA_RESV_USAGE_READ);
116-
}
117-
118-
static int test_for_each(void *arg, enum dma_resv_usage usage)
105+
static int test_for_each(void *arg)
119106
{
107+
enum dma_resv_usage usage = (unsigned long)arg;
120108
struct dma_resv_iter cursor;
121109
struct dma_fence *f, *fence;
122110
struct dma_resv resv;
@@ -139,10 +127,7 @@ static int test_for_each(void *arg, enum dma_resv_usage usage)
139127
goto err_unlock;
140128
}
141129

142-
if (usage >= DMA_RESV_USAGE_READ)
143-
dma_resv_add_shared_fence(&resv, f);
144-
else
145-
dma_resv_add_excl_fence(&resv, f);
130+
dma_resv_add_fence(&resv, f, usage);
146131

147132
r = -ENOENT;
148133
dma_resv_for_each_fence(&cursor, &resv, usage, fence) {
@@ -156,8 +141,7 @@ static int test_for_each(void *arg, enum dma_resv_usage usage)
156141
r = -EINVAL;
157142
goto err_unlock;
158143
}
159-
if (dma_resv_iter_is_exclusive(&cursor) !=
160-
(usage >= DMA_RESV_USAGE_READ)) {
144+
if (dma_resv_iter_usage(&cursor) != usage) {
161145
pr_err("Unexpected fence usage\n");
162146
r = -EINVAL;
163147
goto err_unlock;
@@ -177,18 +161,9 @@ static int test_for_each(void *arg, enum dma_resv_usage usage)
177161
return r;
178162
}
179163

180-
static int test_excl_for_each(void *arg)
181-
{
182-
return test_for_each(arg, DMA_RESV_USAGE_WRITE);
183-
}
184-
185-
static int test_shared_for_each(void *arg)
186-
{
187-
return test_for_each(arg, DMA_RESV_USAGE_READ);
188-
}
189-
190-
static int test_for_each_unlocked(void *arg, enum dma_resv_usage usage)
164+
static int test_for_each_unlocked(void *arg)
191165
{
166+
enum dma_resv_usage usage = (unsigned long)arg;
192167
struct dma_resv_iter cursor;
193168
struct dma_fence *f, *fence;
194169
struct dma_resv resv;
@@ -212,10 +187,7 @@ static int test_for_each_unlocked(void *arg, enum dma_resv_usage usage)
212187
goto err_free;
213188
}
214189

215-
if (usage >= DMA_RESV_USAGE_READ)
216-
dma_resv_add_shared_fence(&resv, f);
217-
else
218-
dma_resv_add_excl_fence(&resv, f);
190+
dma_resv_add_fence(&resv, f, usage);
219191
dma_resv_unlock(&resv);
220192

221193
r = -ENOENT;
@@ -235,8 +207,7 @@ static int test_for_each_unlocked(void *arg, enum dma_resv_usage usage)
235207
r = -EINVAL;
236208
goto err_iter_end;
237209
}
238-
if (dma_resv_iter_is_exclusive(&cursor) !=
239-
(usage >= DMA_RESV_USAGE_READ)) {
210+
if (dma_resv_iter_usage(&cursor) != usage) {
240211
pr_err("Unexpected fence usage\n");
241212
r = -EINVAL;
242213
goto err_iter_end;
@@ -262,18 +233,9 @@ static int test_for_each_unlocked(void *arg, enum dma_resv_usage usage)
262233
return r;
263234
}
264235

265-
static int test_excl_for_each_unlocked(void *arg)
266-
{
267-
return test_for_each_unlocked(arg, DMA_RESV_USAGE_WRITE);
268-
}
269-
270-
static int test_shared_for_each_unlocked(void *arg)
271-
{
272-
return test_for_each_unlocked(arg, DMA_RESV_USAGE_READ);
273-
}
274-
275-
static int test_get_fences(void *arg, enum dma_resv_usage usage)
236+
static int test_get_fences(void *arg)
276237
{
238+
enum dma_resv_usage usage = (unsigned long)arg;
277239
struct dma_fence *f, **fences = NULL;
278240
struct dma_resv resv;
279241
int r, i;
@@ -296,10 +258,7 @@ static int test_get_fences(void *arg, enum dma_resv_usage usage)
296258
goto err_resv;
297259
}
298260

299-
if (usage >= DMA_RESV_USAGE_READ)
300-
dma_resv_add_shared_fence(&resv, f);
301-
else
302-
dma_resv_add_excl_fence(&resv, f);
261+
dma_resv_add_fence(&resv, f, usage);
303262
dma_resv_unlock(&resv);
304263

305264
r = dma_resv_get_fences(&resv, usage, &i, &fences);
@@ -324,30 +283,24 @@ static int test_get_fences(void *arg, enum dma_resv_usage usage)
324283
return r;
325284
}
326285

327-
static int test_excl_get_fences(void *arg)
328-
{
329-
return test_get_fences(arg, DMA_RESV_USAGE_WRITE);
330-
}
331-
332-
static int test_shared_get_fences(void *arg)
333-
{
334-
return test_get_fences(arg, DMA_RESV_USAGE_READ);
335-
}
336-
337286
int dma_resv(void)
338287
{
339288
static const struct subtest tests[] = {
340289
SUBTEST(sanitycheck),
341-
SUBTEST(test_excl_signaling),
342-
SUBTEST(test_shared_signaling),
343-
SUBTEST(test_excl_for_each),
344-
SUBTEST(test_shared_for_each),
345-
SUBTEST(test_excl_for_each_unlocked),
346-
SUBTEST(test_shared_for_each_unlocked),
347-
SUBTEST(test_excl_get_fences),
348-
SUBTEST(test_shared_get_fences),
290+
SUBTEST(test_signaling),
291+
SUBTEST(test_for_each),
292+
SUBTEST(test_for_each_unlocked),
293+
SUBTEST(test_get_fences),
349294
};
295+
enum dma_resv_usage usage;
296+
int r;
350297

351298
spin_lock_init(&fence_lock);
352-
return subtests(tests, NULL);
299+
for (usage = DMA_RESV_USAGE_WRITE; usage <= DMA_RESV_USAGE_READ;
300+
++usage) {
301+
r = subtests(tests, (void *)(unsigned long)usage);
302+
if (r)
303+
return r;
304+
}
305+
return 0;
353306
}

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ static int amdgpu_amdkfd_remove_eviction_fence(struct amdgpu_bo *bo,
263263
*/
264264
replacement = dma_fence_get_stub();
265265
dma_resv_replace_fences(bo->tbo.base.resv, ef->base.context,
266-
replacement);
266+
replacement, DMA_RESV_USAGE_READ);
267267
dma_fence_put(replacement);
268268
return 0;
269269
}

drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ static int amdgpu_cs_user_fence_chunk(struct amdgpu_cs_parser *p,
5555
bo = amdgpu_bo_ref(gem_to_amdgpu_bo(gobj));
5656
p->uf_entry.priority = 0;
5757
p->uf_entry.tv.bo = &bo->tbo;
58-
/* One for TTM and one for the CS job */
59-
p->uf_entry.tv.num_shared = 2;
58+
/* One for TTM and two for the CS job */
59+
p->uf_entry.tv.num_shared = 3;
6060

6161
drm_gem_object_put(gobj);
6262

drivers/gpu/drm/amd/amdgpu/amdgpu_object.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1397,10 +1397,8 @@ void amdgpu_bo_fence(struct amdgpu_bo *bo, struct dma_fence *fence,
13971397
return;
13981398
}
13991399

1400-
if (shared)
1401-
dma_resv_add_shared_fence(resv, fence);
1402-
else
1403-
dma_resv_add_excl_fence(resv, fence);
1400+
dma_resv_add_fence(resv, fence, shared ? DMA_RESV_USAGE_READ :
1401+
DMA_RESV_USAGE_WRITE);
14041402
}
14051403

14061404
/**

drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -202,14 +202,10 @@ static void submit_attach_object_fences(struct etnaviv_gem_submit *submit)
202202

203203
for (i = 0; i < submit->nr_bos; i++) {
204204
struct drm_gem_object *obj = &submit->bos[i].obj->base;
205+
bool write = submit->bos[i].flags & ETNA_SUBMIT_BO_WRITE;
205206

206-
if (submit->bos[i].flags & ETNA_SUBMIT_BO_WRITE)
207-
dma_resv_add_excl_fence(obj->resv,
208-
submit->out_fence);
209-
else
210-
dma_resv_add_shared_fence(obj->resv,
211-
submit->out_fence);
212-
207+
dma_resv_add_fence(obj->resv, submit->out_fence, write ?
208+
DMA_RESV_USAGE_WRITE : DMA_RESV_USAGE_READ);
213209
submit_unlock_object(submit, i);
214210
}
215211
}

drivers/gpu/drm/i915/gem/i915_gem_busy.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,11 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data,
148148
if (dma_resv_iter_is_restarted(&cursor))
149149
args->busy = 0;
150150

151-
if (dma_resv_iter_is_exclusive(&cursor))
152-
/* Translate the exclusive fence to the READ *and* WRITE engine */
151+
if (dma_resv_iter_usage(&cursor) <= DMA_RESV_USAGE_WRITE)
152+
/* Translate the write fences to the READ *and* WRITE engine */
153153
args->busy |= busy_check_writer(fence);
154154
else
155-
/* Translate shared fences to READ set of engines */
155+
/* Translate read fences to READ set of engines */
156156
args->busy |= busy_check_reader(fence);
157157
}
158158
dma_resv_iter_end(&cursor);

drivers/gpu/drm/i915/gem/i915_gem_clflush.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,8 @@ bool i915_gem_clflush_object(struct drm_i915_gem_object *obj,
116116
obj->base.resv, NULL, true,
117117
i915_fence_timeout(i915),
118118
I915_FENCE_GFP);
119-
dma_resv_add_excl_fence(obj->base.resv, &clflush->base.dma);
119+
dma_resv_add_fence(obj->base.resv, &clflush->base.dma,
120+
DMA_RESV_USAGE_WRITE);
120121
dma_fence_work_commit(&clflush->base);
121122
/*
122123
* We must have successfully populated the pages(since we are

0 commit comments

Comments
 (0)