On Tue, Apr 11, 2017 at 01:22:17PM +1000, Dave Airlie wrote: > From: Dave Airlie <airlied@xxxxxxxxxx> > > This object can be used to implement the Vulkan semaphores. > > The object behaviour differs from fence, in that you can > replace the underlying fence, and you cannot merge semaphores. > > Signed-off-by: Dave Airlie <airlied@xxxxxxxxxx> > --- > +/** > + * sync_file_replace_fence - replace the fence related to the sync_file > + * @sync_file: sync file to replace fence in > + * @fence: fence to replace with (or NULL for no fence). > + * Returns previous fence. > + */ > +struct dma_fence *sync_file_replace_fence(struct sync_file *sync_file, > + struct dma_fence *fence) > +{ > + struct dma_fence *ret_fence = NULL; > + > + if (sync_file->type != SYNC_FILE_TYPE_SEMAPHORE) > + return NULL; > + > + if (fence) > + dma_fence_get(fence); > + > + mutex_lock(&sync_file->lock); > + > + ret_fence = sync_file_get_fence_locked(sync_file); > + if (ret_fence) { > + if (test_bit(POLL_ENABLED, &ret_fence->flags)) > + dma_fence_remove_callback(ret_fence, &sync_file->cb); > + } Fails when sync_file_replace_fence is passed sync_file->fence. if (test_and_clear_bit(POLL_ENABLED, &ret_fence->flags)) { dma_fence_remove_callback(ret_fence, &sync_file->cb); wake_up(&sync_file->wq); /* only needs the first to redo the add */ } will get the waiter to reset the callback on a new fence, or the old fence replacing itself. Otherwise the waiter will never be woken over the change in fence, not even when the old or new fence is signaled. -Chris -- Chris Wilson, Intel Open Source Technology Centre _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel