[PATCH 0/9] drm/syncobj: Add full-featured wait support (v2)

Jason Ekstrand jason at jlekstrand.net
Mon Aug 14 05:49:26 UTC 2017


On August 13, 2017 4:14:45 PM Jason Ekstrand <jason at jlekstrand.net> wrote:

> On August 13, 2017 8:52:21 AM Christian König <christian.koenig at amd.com> wrote:
>
>> Am 13.08.2017 um 17:26 schrieb Jason Ekstrand:
>>> On August 13, 2017 6:19:53 AM Christian König
>>> <christian.koenig at amd.com> wrote:
>>>
>>>> Patches #1-#4 are Acked-by: Christian König <christian.koenig at amd.com>.
>>>>
>>>> Patch #5: NAK, that will break radeon.
>>>>
>>>> On radeon we need the non-default wait or otherwise we can run into a
>>>> situation where we never signal a fence.
>>>>
>>>> The general question is why do you need this?
>>>
>>> Because i915 sets a non-default wait function so calling wait_any just
>>> bails with fences from i915 immediately bails with -EINVAL. This makes
>>> it work even with non-default waits.
>>
>> Ok well, let me refine the question: Why does i915 sets a non-default
>> wait function?
>
> I have no idea.
>
>> In radeon we have it because we need to handle 10+ years of different
>> hardware generation, each which a bunch of separate bugs in their fence
>> handling (and some even not solved by today).
>
> So how does wait_any returning -EINVAL for non-default waits help radeon?
>
>>>> Patch #6: Yes, please. Patch is Reviewed-by: Christian König
>>>> <christian.koenig at amd.com>.
>>>>
>>>> Patch #7: Already gave my rb on the patch Chris send out earlier.
>>>>
>>>> Patch #8: NAK to the whole approach.
>>>>
>>>> IIRC we discussed a very similar thing during the initial fence bringup
>>>> and also during the fence_array development.
>>>>
>>>> The problem is that you can easily build ring dependencies and so
>>>> deadlocks with it.
>>>>
>>>> I would really prefer an approach which is completely contained inside
>>>> the syncobj code base.
>>>
>>> Are you use to the approach of internally making a proxy so long as
>>> all the proxy code is inside syncobj?
>> Yes, that would be a start.
>>
>> In general if possible I would rather like to avoid the whole handling
>> with the proxy/callback altogether, but that possible only works with
>> wait for any if the waitqueue is global and that wouldn't be ideal either.
>
> I'm happy to get rid of the proxies.  They did work nicely but I'm not
> really attached to them
>
>>> Is also be happy to go back to the original approach with v3 of the
>>> last patch.
>> v3 looked like it should work as well, I would just drop abusing the
>> fence callback structure for the signaling.
>>
>> Ideally we would finally come up with an interface to wait for multiple
>> waitqueue at the same time, but that probably goes a bit to far.
>>
>> For now just use a single linked list to start all processes waiting for
>> a fence to arrive or something like this.
>
> I don't really know what you're suggesting.  Patch v3 has a single
> waitqueue per process.  Are you suggesting one per fence?

I apologize for my plethora of questions.  I'm still very new to this stuff 
and don't know what all is out there.

> --Jason
>
>> Regards,
>> Christian.
>>
>>>
>>>> Regards,
>>>> Christian.
>>>>
>>>> Am 12.08.2017 um 00:39 schrieb Jason Ekstrand:
>>>>> This series does the same thing as my earlier series in that it adds
>>>>> a sync
>>>>> object wait interface complete with WAIT_FOR_SUBMIT flag. While the
>>>>> uapi
>>>>> remains unchanged, the guts look a bit different.  Instead of adding a
>>>>> callback mechanism to drm_syncobj that fired whenever replace_fence was
>>>>> called, it's now using proxy fences.  The drm_syncobj_fence_get still
>>>>> returns NULL whenever the sync object is in an unsubmitted state but
>>>>> there
>>>>> is a new drm_syncobj_fence_proxy_get which returns either the real
>>>>> fence or
>>>>> a proxy fence that will be triggered the next time replace_fence is
>>>>> called
>>>>> with a non-NULL replacement.  This does make both
>>>>> drm_syncobj_fence_get and
>>>>> drm_syncobj_replace_fence a tiny bit more expensive, but it lets us
>>>>> do it
>>>>> all without locking.
>>>>>
>>>>> This series can be found as a branch here:
>>>>>
>>>>> https://cgit.freedesktop.org/~jekstrand/linux/log/?h=drm-syncobj-wait-submit-v4
>>>>>
>>>>>
>>>>> IGT tests for DRM_IOCTL_SYNCOBJ_WAIT and DRM_IOCTL_SYNCOBJ_RESET can be
>>>>> found on patchwork here:
>>>>>
>>>>> https://patchwork.freedesktop.org/series/28666/
>>>>>
>>>>> Patches to the Intel Vulkan driver to implement
>>>>> VK_KHR_external_fence on
>>>>> top of this kernel interface can be found here:
>>>>>
>>>>> https://cgit.freedesktop.org/~jekstrand/mesa/log/?h=wip/anv-external-fence
>>>>>
>>>>>
>>>>> Cc: Dave Airlie <airlied at redhat.com>
>>>>> Cc: Chris Wilson <chris at chris-wilson.co.uk>
>>>>> Cc: Christian König <christian.koenig at amd.com>
>>>>>
>>>>> Chris Wilson (2):
>>>>>    dma-buf/dma-fence: Signal all callbacks from dma_fence_release()
>>>>>    dma-buf/dma-fence: Add a mechanism for proxy fences
>>>>>
>>>>> Dave Airlie (1):
>>>>>    drm/syncobj: add sync obj wait interface. (v8)
>>>>>
>>>>> Jason Ekstrand (6):
>>>>>    drm/syncobj: Rename fence_get to find_fence
>>>>>    drm/syncobj: Add a race-free drm_syncobj_fence_get helper
>>>>>    i915: Add support for drm syncobjs
>>>>>    dma-buf/dma-fence: Allow wait_any_timeout without default_wait (v2)
>>>>>    drm/syncobj: Add a reset ioctl
>>>>>    drm/syncobj: Allow wait for submit and signal behavior (v4)
>>>>>
>>>>>   drivers/dma-buf/Makefile                   |   4 +-
>>>>>   drivers/dma-buf/dma-fence-proxy.c          | 186 +++++++++++++++++++
>>>>>   drivers/dma-buf/dma-fence.c                |  34 ++--
>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c     |   2 +-
>>>>>   drivers/gpu/drm/drm_internal.h             |   4 +
>>>>>   drivers/gpu/drm/drm_ioctl.c                |   4 +
>>>>>   drivers/gpu/drm/drm_syncobj.c              | 275
>>>>> +++++++++++++++++++++++++++--
>>>>>   drivers/gpu/drm/i915/i915_drv.c            |   3 +-
>>>>>   drivers/gpu/drm/i915/i915_gem_execbuffer.c | 146 ++++++++++++++-
>>>>>   include/drm/drm_syncobj.h                  |  15 +-
>>>>>   include/linux/dma-fence-proxy.h            |  25 +++
>>>>>   include/uapi/drm/drm.h                     |  19 ++
>>>>>   include/uapi/drm/i915_drm.h                |  30 +++-
>>>>>   13 files changed, 710 insertions(+), 37 deletions(-)
>>>>>   create mode 100644 drivers/dma-buf/dma-fence-proxy.c
>>>>>   create mode 100644 include/linux/dma-fence-proxy.h
>>>>>
>>>>
>>>
>>>
>>
>
>




More information about the dri-devel mailing list