Skip to content

Commit

Permalink
dma-buf: explicitely note that dma-fence-chains use 64bit seqno
Browse files Browse the repository at this point in the history
Instead of checking the upper values of the sequence number use an explicit
field in the dma_fence_ops structure to note if a sequence should be 32bit
or 64bit.

Signed-off-by: Christian König <[email protected]>
Reviewed-by: Lionel Landwerlin <[email protected]>
Link: https://patchwork.freedesktop.org/patch/299655/
  • Loading branch information
ChristianKoenigAMD committed Apr 16, 2019
1 parent 4dff47c commit 5e498ab
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 9 deletions.
3 changes: 2 additions & 1 deletion drivers/dma-buf/dma-fence-chain.c
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ static void dma_fence_chain_release(struct dma_fence *fence)
}

const struct dma_fence_ops dma_fence_chain_ops = {
.use_64bit_seqno = true,
.get_driver_name = dma_fence_chain_get_driver_name,
.get_timeline_name = dma_fence_chain_get_timeline_name,
.enable_signaling = dma_fence_chain_enable_signaling,
Expand Down Expand Up @@ -225,7 +226,7 @@ void dma_fence_chain_init(struct dma_fence_chain *chain,
init_irq_work(&chain->work, dma_fence_chain_irq_work);

/* Try to reuse the context of the previous chain node. */
if (prev_chain && __dma_fence_is_later(seqno, prev->seqno)) {
if (prev_chain && __dma_fence_is_later(seqno, prev->seqno, prev->ops)) {
context = prev->context;
chain->prev_seqno = prev->seqno;
} else {
Expand Down
2 changes: 1 addition & 1 deletion drivers/dma-buf/sw_sync.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ static bool timeline_fence_signaled(struct dma_fence *fence)
{
struct sync_timeline *parent = dma_fence_parent(fence);

return !__dma_fence_is_later(fence->seqno, parent->value);
return !__dma_fence_is_later(fence->seqno, parent->value, fence->ops);
}

static bool timeline_fence_enable_signaling(struct dma_fence *fence)
Expand Down
3 changes: 2 additions & 1 deletion drivers/dma-buf/sync_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,8 @@ static struct sync_file *sync_file_merge(const char *name, struct sync_file *a,

i_b++;
} else {
if (__dma_fence_is_later(pt_a->seqno, pt_b->seqno))
if (__dma_fence_is_later(pt_a->seqno, pt_b->seqno,
pt_a->ops))
add_fence(fences, &i, pt_a);
else
add_fence(fences, &i, pt_b);
Expand Down
21 changes: 15 additions & 6 deletions include/linux/dma-fence.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,14 @@ struct dma_fence_cb {
*
*/
struct dma_fence_ops {
/**
* @use_64bit_seqno:
*
* True if this dma_fence implementation uses 64bit seqno, false
* otherwise.
*/
bool use_64bit_seqno;

/**
* @get_driver_name:
*
Expand Down Expand Up @@ -410,18 +418,19 @@ dma_fence_is_signaled(struct dma_fence *fence)
* __dma_fence_is_later - return if f1 is chronologically later than f2
* @f1: the first fence's seqno
* @f2: the second fence's seqno from the same context
* @ops: dma_fence_ops associated with the seqno
*
* Returns true if f1 is chronologically later than f2. Both fences must be
* from the same context, since a seqno is not common across contexts.
*/
static inline bool __dma_fence_is_later(u64 f1, u64 f2)
static inline bool __dma_fence_is_later(u64 f1, u64 f2,
const struct dma_fence_ops *ops)
{
/* This is for backward compatibility with drivers which can only handle
* 32bit sequence numbers. Use a 64bit compare when any of the higher
* bits are none zero, otherwise use a 32bit compare with wrap around
* handling.
* 32bit sequence numbers. Use a 64bit compare when the driver says to
* do so.
*/
if (upper_32_bits(f1) || upper_32_bits(f2))
if (ops->use_64bit_seqno)
return f1 > f2;

return (int)(lower_32_bits(f1) - lower_32_bits(f2)) > 0;
Expand All @@ -441,7 +450,7 @@ static inline bool dma_fence_is_later(struct dma_fence *f1,
if (WARN_ON(f1->context != f2->context))
return false;

return __dma_fence_is_later(f1->seqno, f2->seqno);
return __dma_fence_is_later(f1->seqno, f2->seqno, f1->ops);
}

/**
Expand Down

0 comments on commit 5e498ab

Please sign in to comment.