All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rodrigo Vivi <rodrigo.vivi@gmail.com>
To: Chris Wilson <chris@chris-wilson.co.uk>
Cc: intel-gfx <intel-gfx@lists.freedesktop.org>
Subject: Re: [PATCH] drm/i915: Fix __wait_seqno to use true infinite timeouts
Date: Tue, 13 Aug 2013 10:36:04 -0300	[thread overview]
Message-ID: <CABVU7+vTtO=m4uM86eJ=A-Ooc3wSNu7z3xLgvm7vxmkEM0mSHw@mail.gmail.com> (raw)
In-Reply-To: <1375837422-2959-1-git-send-email-chris@chris-wilson.co.uk>

applied to experimental drm-intel-collector.

drivers/gpu/drm/i915/i915_gem.c: In function ‘__wait_seqno’:
drivers/gpu/drm/i915/i915_gem.c:1033:20: warning: ‘timeout_jiffies’ may be used
+uninitialized in this function



On Tue, Aug 6, 2013 at 10:03 PM, Chris Wilson <chris@chris-wilson.co.uk> wrote:
> Rather than continue to fix up the timeouts to work around the interface
> impedence in wait_event_*(), open code the combination of
> wait_event[_interruptible][_timeout]. And note the code size reduction,
> and dare say readability?, in doing so..
>
> Food for thought.
> ---
>  drivers/gpu/drm/i915/i915_gem.c | 82 ++++++++++++++++++++---------------------
>  1 file changed, 39 insertions(+), 43 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 99ba622..8adbce9 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -1088,23 +1088,18 @@ static int __wait_seqno(struct intel_ring_buffer *ring, u32 seqno,
>                         bool interruptible, struct timespec *timeout)
>  {
>         drm_i915_private_t *dev_priv = ring->dev->dev_private;
> -       struct timespec before, now, wait_time={1,0};
> -       unsigned long timeout_jiffies;
> -       long end;
> -       bool wait_forever = true;
> +       struct timespec before, now;
> +       DEFINE_WAIT(__wait);
> +       long timeout_jiffies;
>         int ret;
>
>         if (i915_seqno_passed(ring->get_seqno(ring, true), seqno))
>                 return 0;
>
> -       trace_i915_gem_request_wait_begin(ring, seqno);
> -
> -       if (timeout != NULL) {
> -               wait_time = *timeout;
> -               wait_forever = false;
> -       }
> +       if (timeout)
> +               timeout_jiffies = timespec_to_jiffies_timeout(timeout);
>
> -       timeout_jiffies = timespec_to_jiffies_timeout(&wait_time);
> +       trace_i915_gem_request_wait_begin(ring, seqno);
>
>         if (WARN_ON(!ring->irq_get(ring)))
>                 return -ENODEV;
> @@ -1112,36 +1107,47 @@ static int __wait_seqno(struct intel_ring_buffer *ring, u32 seqno,
>         /* Record current time in case interrupted by signal, or wedged * */
>         getrawmonotonic(&before);
>
> -#define EXIT_COND \
> -       (i915_seqno_passed(ring->get_seqno(ring, false), seqno) || \
> -        i915_reset_in_progress(&dev_priv->gpu_error) || \
> -        reset_counter != atomic_read(&dev_priv->gpu_error.reset_counter))
> -       do {
> -               if (interruptible)
> -                       end = wait_event_interruptible_timeout(ring->irq_queue,
> -                                                              EXIT_COND,
> -                                                              timeout_jiffies);
> -               else
> -                       end = wait_event_timeout(ring->irq_queue, EXIT_COND,
> -                                                timeout_jiffies);
> +       for (;;) {
> +               prepare_to_wait(&ring->irq_queue, &__wait,
> +                               interruptible ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE);
>
>                 /* We need to check whether any gpu reset happened in between
>                  * the caller grabbing the seqno and now ... */
> -               if (reset_counter != atomic_read(&dev_priv->gpu_error.reset_counter))
> -                       end = -EAGAIN;
> +               if (reset_counter != atomic_read(&dev_priv->gpu_error.reset_counter)) {
> +                       /* ... but upgrade the -EGAIN to an -EIO if the gpu
> +                        * is truely gone. */
> +                       ret = i915_gem_check_wedge(&dev_priv->gpu_error, interruptible);
> +                       if (ret == 0)
> +                               ret = -EAGAIN;
> +                       break;
> +               }
>
> -               /* ... but upgrade the -EGAIN to an -EIO if the gpu is truely
> -                * gone. */
> -               ret = i915_gem_check_wedge(&dev_priv->gpu_error, interruptible);
> -               if (ret)
> -                       end = ret;
> -       } while (end == 0 && wait_forever);
> +               if (i915_seqno_passed(ring->get_seqno(ring, false), seqno)) {
> +                       ret = 0;
> +                       break;
> +               }
> +
> +               if (interruptible && signal_pending(current)) {
> +                       ret = -ERESTARTSYS;
> +                       break;
> +               }
> +
> +               if (timeout) {
> +                       if (timeout_jiffies == 0) {
> +                               ret = -ETIME;
> +                               break;
> +                       }
> +
> +                       timeout_jiffies = schedule_timeout(timeout_jiffies);
> +               } else
> +                       schedule();
> +       }
> +       finish_wait(&ring->irq_queue, &__wait);
>
>         getrawmonotonic(&now);
>
>         ring->irq_put(ring);
>         trace_i915_gem_request_wait_end(ring, seqno);
> -#undef EXIT_COND
>
>         if (timeout) {
>                 struct timespec sleep_time = timespec_sub(now, before);
> @@ -1150,17 +1156,7 @@ static int __wait_seqno(struct intel_ring_buffer *ring, u32 seqno,
>                         set_normalized_timespec(timeout, 0, 0);
>         }
>
> -       switch (end) {
> -       case -EIO:
> -       case -EAGAIN: /* Wedged */
> -       case -ERESTARTSYS: /* Signal */
> -               return (int)end;
> -       case 0: /* Timeout */
> -               return -ETIME;
> -       default: /* Completed */
> -               WARN_ON(end < 0); /* We're not aware of other errors */
> -               return 0;
> -       }
> +       return ret;
>  }
>
>  /**
> --
> 1.8.4.rc1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br

  reply	other threads:[~2013-08-13 13:36 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-07  1:03 [PATCH] drm/i915: Fix __wait_seqno to use true infinite timeouts Chris Wilson
2013-08-13 13:36 ` Rodrigo Vivi [this message]
2013-08-13 13:39   ` Chris Wilson
2013-08-13 14:04     ` Daniel Vetter
2013-08-23  1:05 Chris Wilson
2013-08-23  7:27 ` Daniel Vetter
2013-08-23  8:06   ` Chris Wilson
2013-08-23  8:37     ` Daniel Vetter
2013-08-23 11:12 Chris Wilson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CABVU7+vTtO=m4uM86eJ=A-Ooc3wSNu7z3xLgvm7vxmkEM0mSHw@mail.gmail.com' \
    --to=rodrigo.vivi@gmail.com \
    --cc=chris@chris-wilson.co.uk \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.