在 2018/12/4 19:59, Christian König 写道: > Use the dma_fence_chain object to create a timeline of fence objects > instead of just replacing the existing fence. > > v2: rebase and cleanup > > Signed-off-by: Christian König <christian.koe...@amd.com>
Reviewed-by: Chunming Zhou <david1.z...@amd.com> > --- > drivers/gpu/drm/drm_syncobj.c | 37 +++++++++++++++++++++++++++++++++++++ > include/drm/drm_syncobj.h | 5 +++++ > 2 files changed, 42 insertions(+) > > diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c > index e19525af0cce..64fcfea1c39f 100644 > --- a/drivers/gpu/drm/drm_syncobj.c > +++ b/drivers/gpu/drm/drm_syncobj.c > @@ -122,6 +122,43 @@ static void drm_syncobj_remove_wait(struct drm_syncobj > *syncobj, > spin_unlock(&syncobj->lock); > } > > +/** > + * drm_syncobj_add_point - add new timeline point to the syncobj > + * @syncobj: sync object to add timeline point do > + * @chain: chain node to use to add the point > + * @fence: fence to encapsulate in the chain node > + * @point: sequence number to use for the point > + * > + * Add the chain node as new timeline point to the syncobj. > + */ > +void drm_syncobj_add_point(struct drm_syncobj *syncobj, > + struct dma_fence_chain *chain, > + struct dma_fence *fence, > + uint64_t point) > +{ > + struct syncobj_wait_entry *cur, *tmp; > + struct dma_fence *prev; > + > + dma_fence_get(fence); > + > + spin_lock(&syncobj->lock); > + > + prev = rcu_dereference_protected(syncobj->fence, > + lockdep_is_held(&syncobj->lock)); > + dma_fence_chain_init(chain, prev, fence, point); > + rcu_assign_pointer(syncobj->fence, &chain->base); > + > + list_for_each_entry_safe(cur, tmp, &syncobj->cb_list, node) { > + list_del_init(&cur->node); > + syncobj_wait_syncobj_func(syncobj, cur); > + } > + spin_unlock(&syncobj->lock); > + > + /* Walk the chain once to trigger garbage collection */ > + dma_fence_chain_for_each(fence); > +} > +EXPORT_SYMBOL(drm_syncobj_add_point); > + > /** > * drm_syncobj_replace_fence - replace fence in a sync object. > * @syncobj: Sync object to replace fence in > diff --git a/include/drm/drm_syncobj.h b/include/drm/drm_syncobj.h > index 7c6ed845c70d..8acb4ae4f311 100644 > --- a/include/drm/drm_syncobj.h > +++ b/include/drm/drm_syncobj.h > @@ -27,6 +27,7 @@ > #define __DRM_SYNCOBJ_H__ > > #include "linux/dma-fence.h" > +#include "linux/dma-fence-chain.h" > > /** > * struct drm_syncobj - sync object. > @@ -110,6 +111,10 @@ drm_syncobj_fence_get(struct drm_syncobj *syncobj) > > struct drm_syncobj *drm_syncobj_find(struct drm_file *file_private, > u32 handle); > +void drm_syncobj_add_point(struct drm_syncobj *syncobj, > + struct dma_fence_chain *chain, > + struct dma_fence *fence, > + uint64_t point); > void drm_syncobj_replace_fence(struct drm_syncobj *syncobj, > struct dma_fence *fence); > int drm_syncobj_find_fence(struct drm_file *file_private, _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx