<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p><br>
    </p>
    <br>
    <div class="moz-cite-prefix">On 2018年08月22日 17:05, Christian König
      wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:a586e4f3-0fbb-e530-6a20-fe6d32302771@gmail.com">Am
      22.08.2018 um 11:02 schrieb zhoucm1:
      <br>
      <blockquote type="cite">
        <br>
        <br>
        On 2018年08月22日 16:52, Christian König wrote:
        <br>
        <blockquote type="cite">Am 22.08.2018 um 10:38 schrieb Chunming
          Zhou:
          <br>
          <blockquote type="cite">stub fence will be used by timeline
            syncobj as well.
            <br>
            <br>
            Change-Id: Ia4252f03c07a8105491d2791dc7c8c6976682285
            <br>
            Signed-off-by: Chunming Zhou <a class="moz-txt-link-rfc2396E" href="mailto:david1.zhou@amd.com"><david1.zhou@amd.com></a>
            <br>
            Cc: Jason Ekstrand <a class="moz-txt-link-rfc2396E" href="mailto:jason@jlekstrand.net"><jason@jlekstrand.net></a>
            <br>
            ---
            <br>
              drivers/gpu/drm/drm_syncobj.c | 28
            ++--------------------------
            <br>
              include/drm/drm_syncobj.h     | 24
            ++++++++++++++++++++++++
            <br>
              2 files changed, 26 insertions(+), 26 deletions(-)
            <br>
            <br>
            diff --git a/drivers/gpu/drm/drm_syncobj.c
            b/drivers/gpu/drm/drm_syncobj.c
            <br>
            index d4f4ce484529..70af32d0def1 100644
            <br>
            --- a/drivers/gpu/drm/drm_syncobj.c
            <br>
            +++ b/drivers/gpu/drm/drm_syncobj.c
            <br>
            @@ -187,39 +187,15 @@ void drm_syncobj_replace_fence(struct
            drm_syncobj *syncobj,
            <br>
              }
            <br>
              EXPORT_SYMBOL(drm_syncobj_replace_fence);
            <br>
              -struct drm_syncobj_null_fence {
            <br>
            -    struct dma_fence base;
            <br>
            -    spinlock_t lock;
            <br>
            -};
            <br>
            -
            <br>
            -static const char *drm_syncobj_null_fence_get_name(struct
            dma_fence *fence)
            <br>
            -{
            <br>
            -        return "syncobjnull";
            <br>
            -}
            <br>
            -
            <br>
            -static bool drm_syncobj_null_fence_enable_signaling(struct
            dma_fence *fence)
            <br>
            -{
            <br>
            -    dma_fence_enable_sw_signaling(fence);
            <br>
            -    return !dma_fence_is_signaled(fence);
            <br>
            -}
            <br>
            -
            <br>
            -static const struct dma_fence_ops
            drm_syncobj_null_fence_ops = {
            <br>
            -    .get_driver_name = drm_syncobj_null_fence_get_name,
            <br>
            -    .get_timeline_name = drm_syncobj_null_fence_get_name,
            <br>
            -    .enable_signaling =
            drm_syncobj_null_fence_enable_signaling,
            <br>
            -    .wait = dma_fence_default_wait,
            <br>
            -    .release = NULL,
            <br>
            -};
            <br>
            -
            <br>
              static int drm_syncobj_assign_null_handle(struct
            drm_syncobj *syncobj)
            <br>
              {
            <br>
            -    struct drm_syncobj_null_fence *fence;
            <br>
            +    struct drm_syncobj_stub_fence *fence;
            <br>
                  fence = kzalloc(sizeof(*fence), GFP_KERNEL);
            <br>
                  if (fence == NULL)
            <br>
                      return -ENOMEM;
            <br>
                    spin_lock_init(&fence->lock);
            <br>
            -    dma_fence_init(&fence->base,
            &drm_syncobj_null_fence_ops,
            <br>
            +    dma_fence_init(&fence->base,
            &drm_syncobj_stub_fence_ops,
            <br>
                             &fence->lock, 0, 0);
            <br>
                  dma_fence_signal(&fence->base);
            <br>
              diff --git a/include/drm/drm_syncobj.h
            b/include/drm/drm_syncobj.h
            <br>
            index 3980602472c0..b04c492ddbb5 100644
            <br>
            --- a/include/drm/drm_syncobj.h
            <br>
            +++ b/include/drm/drm_syncobj.h
            <br>
            @@ -30,6 +30,30 @@
            <br>
                struct drm_syncobj_cb;
            <br>
              +struct drm_syncobj_stub_fence {
            <br>
            +    struct dma_fence base;
            <br>
            +    spinlock_t lock;
            <br>
            +};
            <br>
            +
            <br>
            +const char *drm_syncobj_stub_fence_get_name(struct
            dma_fence *fence)
            <br>
            +{
            <br>
            +        return "syncobjstub";
            <br>
            +}
            <br>
            +
            <br>
            +bool drm_syncobj_stub_fence_enable_signaling(struct
            dma_fence *fence)
            <br>
            +{
            <br>
            +    dma_fence_enable_sw_signaling(fence);
            <br>
          </blockquote>
          <br>
          Copy&pasted from the old implementation, but that is
          certainly totally nonsense.
          <br>
          <br>
          dma_fence_enable_sw_signaling() is the function who is calling
          this callback.
          <br>
        </blockquote>
        indeed, will fix.
        <br>
        <blockquote type="cite">
          <br>
          <blockquote type="cite">+    return
            !dma_fence_is_signaled(fence);
            <br>
            +}
            <br>
            +
            <br>
            +const struct dma_fence_ops drm_syncobj_stub_fence_ops = {
            <br>
            +    .get_driver_name = drm_syncobj_stub_fence_get_name,
            <br>
            +    .get_timeline_name = drm_syncobj_stub_fence_get_name,
            <br>
            +    .enable_signaling =
            drm_syncobj_stub_fence_enable_signaling,
            <br>
            +    .wait = dma_fence_default_wait,
            <br>
          </blockquote>
          <br>
          The .wait callback should be dropped.
          <br>
        </blockquote>
        why?
        <br>
        <br>
        fence->ops->wait(fence, intr, timeout) is called by
        dma_fence_wait(). If dropped, how does dma_fence_wait() work?
        <br>
      </blockquote>
      <br>
      You are working on an older code base, fence->ops->wait is
      optional by now.
      <br>
    </blockquote>
    Sorry, I still don't get it. My code is synced today from
    amd-staging-drm-next, and it's 4.18-rc1.<br>
    I still see the dma_fence_wait_timeout is :<br>
    signed long<br>
    dma_fence_wait_timeout(struct dma_fence *fence, bool intr, signed
    long timeout)<br>
    {<br>
            signed long ret;<br>
    <br>
            if (WARN_ON(timeout < 0))<br>
                    return -EINVAL;<br>
    <br>
            trace_dma_fence_wait_start(fence);<br>
    <font color="#ff0000">        ret = fence->ops->wait(fence,
      intr, timeout);</font><br>
            trace_dma_fence_wait_end(fence);<br>
            return ret;<br>
    }<br>
    <br>
    .wait callback seems still a must have?<br>
    <br>
    Thanks,<br>
    David Zhou<br>
    <br>
    <br>
    <blockquote type="cite"
      cite="mid:a586e4f3-0fbb-e530-6a20-fe6d32302771@gmail.com">
      <br>
      Christian.
      <br>
      <br>
      <blockquote type="cite">
        <br>
        Thanks,
        <br>
        David
        <br>
        <blockquote type="cite">
          <br>
          Apart from that looks good to me.
          <br>
          <br>
          Christian.
          <br>
          <br>
          <blockquote type="cite">+    .release = NULL,
            <br>
            +};
            <br>
            +
            <br>
              /**
            <br>
               * struct drm_syncobj - sync object.
            <br>
               *
            <br>
          </blockquote>
          <br>
        </blockquote>
        <br>
        _______________________________________________
        <br>
        amd-gfx mailing list
        <br>
        <a class="moz-txt-link-abbreviated" href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a>
        <br>
        <a class="moz-txt-link-freetext" href="https://lists.freedesktop.org/mailman/listinfo/amd-gfx">https://lists.freedesktop.org/mailman/listinfo/amd-gfx</a>
        <br>
      </blockquote>
      <br>
    </blockquote>
    <br>
  </body>
</html>