All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Zanoni, Paulo R" <paulo.r.zanoni@intel.com>
To: "intel-gfx@lists.freedesktop.org"
	<intel-gfx@lists.freedesktop.org>,
	"rodrigo.vivi@gmail.com" <rodrigo.vivi@gmail.com>
Subject: Re: [PATCH 01/25] drm/i915/fbc: wait for a vblank instead of 50ms when enabling
Date: Tue, 26 Jan 2016 18:08:25 +0000	[thread overview]
Message-ID: <1453831704.12148.43.camel@intel.com> (raw)
In-Reply-To: <CABVU7+ui9iExfa7kg5ASFp8CiWBZL77Y3GRfCiHPoarsvMf6yA@mail.gmail.com>

Em Ter, 2016-01-26 às 17:44 +0000, Rodrigo Vivi escreveu:
> 
> 
> On Thu, Jan 21, 2016 at 12:03 PM Paulo Zanoni <paulo.r.zanoni@intel.c
> om> wrote:
> > Instead of waiting for 50ms, just wait until the next vblank, since
> > it's the minimum requirement. The whole infrastructure of FBC is
> > based
> > on vblanks, so waiting for X vblanks instead of X milliseconds
> > sounds
> > like the correct way to go. Besides, 50ms may be less than a vblank
> > on
> > super slow modes that may or may not exist.
> > 
> > There are some small improvements in PC state residency (due to the
> > fact that we're now using 16ms for the common modes instead of
> > 50ms),
> > but the biggest advantage is still the correctness of being
> > vblank-based instead of time-based.
> > 
> > v2:
> >   - Rebase after changing the patch order.
> >   - Update the commit message.
> > v3:
> >   - Fix bogus vblank_get() instead of vblank_count() (Ville).
> >   - Don't forget to call drm_crtc_vblank_{get,put} (Chris, Ville)
> >   - Adjust the performance details on the commit message.
> > v4:
> >   - Don't grab the FBC mutex just to grab the vblank (Maarten)
> > 
> > Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
> > ---
> >  drivers/gpu/drm/i915/i915_drv.h  |  2 +-
> >  drivers/gpu/drm/i915/intel_fbc.c | 39
> > +++++++++++++++++++++++++++++----------
> >  2 files changed, 30 insertions(+), 11 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/i915_drv.h
> > b/drivers/gpu/drm/i915/i915_drv.h
> > index 204661f..d8f21f0 100644
> > --- a/drivers/gpu/drm/i915/i915_drv.h
> > +++ b/drivers/gpu/drm/i915/i915_drv.h
> > @@ -921,9 +921,9 @@ struct i915_fbc {
> > 
> >         struct intel_fbc_work {
> >                 bool scheduled;
> > +               u32 scheduled_vblank;
> >                 struct work_struct work;
> >                 struct drm_framebuffer *fb;
> > -               unsigned long enable_jiffies;
> >         } work;
> > 
> >         const char *no_fbc_reason;
> > diff --git a/drivers/gpu/drm/i915/intel_fbc.c
> > b/drivers/gpu/drm/i915/intel_fbc.c
> > index a1988a4..3993b43 100644
> > --- a/drivers/gpu/drm/i915/intel_fbc.c
> > +++ b/drivers/gpu/drm/i915/intel_fbc.c
> > @@ -381,7 +381,17 @@ static void intel_fbc_work_fn(struct
> > work_struct *__work)
> >                 container_of(__work, struct drm_i915_private,
> > fbc.work.work);
> >         struct intel_fbc_work *work = &dev_priv->fbc.work;
> >         struct intel_crtc *crtc = dev_priv->fbc.crtc;
> > -       int delay_ms = 50;
> > +       struct drm_vblank_crtc *vblank = &dev_priv->dev-
> > >vblank[crtc->pipe];
> > +
> > +       if (drm_crtc_vblank_get(&crtc->base)) {
> > +               DRM_ERROR("vblank not available for FBC on pipe
> > %c\n",
> > +                         pipe_name(crtc->pipe));
> > +
> > +               mutex_lock(&dev_priv->fbc.lock);
> > +               work->scheduled = false;
> I couldn't understand this here... doesn't look related to
> s/time/vblank...
> could you please explain?

Previously we were just dealing with "wait a certain amount of
time/jiffies", and for that we can just call the delay/sleep/wait/etc
calls without needing any get/put calls.

Now we'll wait for a certain number of vblanks, and we need to have the
vblank interrupts enabled before we can wait for them. That's why we
have the vblank get/put calls. And since get() can fail, we need an
error path.

Under normal FBC operation, every vblank get/put call should succeed
because the pipe's supposed to be running.  But in case we actually
fail to get vblanks, we just exit from the work function. The way we
signal "the work function is not running" is by setting work->scheduled 
to false.

> 
> >  +               mutex_unlock(&dev_priv->fbc.lock);
> > +               return;
> > +       }
> > 
> >  retry:
> >         /* Delay the actual enabling to let pageflipping cease and
> > the
> > @@ -390,14 +400,16 @@ retry:
> >          * vblank to pass after disabling the FBC before we attempt
> >          * to modify the control registers.
> >          *
> > -        * A more complicated solution would involve tracking
> > vblanks
> > -        * following the termination of the page-flipping sequence
> > -        * and indeed performing the enable as a co-routine and not
> > -        * waiting synchronously upon the vblank.
> > -        *
> >          * WaFbcWaitForVBlankBeforeEnable:ilk,snb
> hm... is it still valid for newer platforms or we should put a if gen
> <=6 on these checks?

I tested this on BDW some time ago, and it seems we don't actually need
the vblank wait anymore (although I didn't check the docs if we still
need the wait). But I wanted to convert the code to use vblanks before
optimizing it more. And the residency impact won't be big.

>  
> >  +        *
> > +        * It is also worth mentioning that since work-
> > >scheduled_vblank can be
> > +        * updated multiple times by the other threads, hitting the
> > timeout is
> > +        * not an error condition. We'll just end up hitting the
> > "goto retry"
> > +        * case below.
> >          */
> > -       wait_remaining_ms_from_jiffies(work->enable_jiffies,
> > delay_ms);
> > +       wait_event_timeout(vblank->queue,
> > +               drm_crtc_vblank_count(&crtc->base) != work-
> > >scheduled_vblank,
> > +               msecs_to_jiffies(50));
> > 
> >         mutex_lock(&dev_priv->fbc.lock);
> > 
> > @@ -406,8 +418,7 @@ retry:
> >                 goto out;
> > 
> >         /* Were we delayed again while this function was sleeping?
> > */
> > -       if (time_after(work->enable_jiffies +
> > msecs_to_jiffies(delay_ms),
> > -                      jiffies)) {
> > +       if (drm_crtc_vblank_count(&crtc->base) == work-
> > >scheduled_vblank) {
> >                 mutex_unlock(&dev_priv->fbc.lock);
> >                 goto retry;
> >         }
> > @@ -419,6 +430,7 @@ retry:
> > 
> >  out:
> >         mutex_unlock(&dev_priv->fbc.lock);
> > +       drm_crtc_vblank_put(&crtc->base);
> >  }
> > 
> >  static void intel_fbc_cancel_work(struct drm_i915_private
> > *dev_priv)
> > @@ -434,13 +446,20 @@ static void
> > intel_fbc_schedule_activation(struct intel_crtc *crtc)
> > 
> >         WARN_ON(!mutex_is_locked(&dev_priv->fbc.lock));
> > 
> > +       if (drm_crtc_vblank_get(&crtc->base)) {
> > +               DRM_ERROR("vblank not available for FBC on pipe
> > %c\n",
> > +                         pipe_name(crtc->pipe));
> > +               return;
> > +       }
> > +
> >         /* It is useless to call intel_fbc_cancel_work() in this
> > function since
> >          * we're not releasing fbc.lock, so it won't have an
> > opportunity to grab
> >          * it to discover that it was cancelled. So we just update
> > the expected
> >          * jiffy count. */
> >         work->fb = crtc->base.primary->fb;
> >         work->scheduled = true;
> > -       work->enable_jiffies = jiffies;
> > +       work->scheduled_vblank = drm_crtc_vblank_count(&crtc-
> > >base);
> > +       drm_crtc_vblank_put(&crtc->base);
> > 
> >         schedule_work(&work->work);
> >  }
> > --
> > 2.6.4
> > 
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> > 
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2016-01-26 18:08 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-19 13:35 [PATCH 00/25] FBC crtc/fb locking + smaller fixes Paulo Zanoni
2016-01-19 13:35 ` [PATCH 01/25] drm/i915/fbc: wait for a vblank instead of 50ms when enabling Paulo Zanoni
2016-01-21 14:17   ` Maarten Lankhorst
2016-01-21 16:56     ` Zanoni, Paulo R
2016-01-21 20:03       ` Paulo Zanoni
2016-01-25 13:32         ` Zanoni, Paulo R
2016-01-26 17:44         ` Rodrigo Vivi
2016-01-26 18:08           ` Zanoni, Paulo R [this message]
2016-01-29  0:07             ` Rodrigo Vivi
2016-01-29 20:42               ` Zanoni, Paulo R
2016-01-19 13:35 ` [PATCH 02/25] drm/i915/fbc: extract intel_fbc_can_activate() Paulo Zanoni
2016-01-21 11:35   ` Maarten Lankhorst
2016-01-21 12:06     ` Zanoni, Paulo R
2016-01-19 13:35 ` [PATCH 03/25] drm/i915/fbc: extract intel_fbc_can_enable() Paulo Zanoni
2016-01-19 13:35 ` [PATCH 04/25] drm/i915/fbc: introduce struct intel_fbc_reg_params Paulo Zanoni
2016-01-21 12:48   ` Maarten Lankhorst
2016-01-21 12:54     ` Zanoni, Paulo R
2016-01-19 13:35 ` [PATCH 05/25] drm/i915/fbc: replace frequent dev_priv->fbc.x with fbc->x Paulo Zanoni
2016-01-19 13:35 ` [PATCH 06/25] drm/i915/fbc: don't use the frontbuffer tracking subsystem for flips Paulo Zanoni
2016-01-19 13:35 ` [PATCH 07/25] drm/i915/fbc: don't flush for operations on the wrong frontbuffer Paulo Zanoni
2016-01-19 13:35 ` [PATCH 08/25] drm/i915/fbc: unconditionally update FBC during atomic commits Paulo Zanoni
2016-01-19 14:09   ` kbuild test robot
2016-01-21 13:04   ` Maarten Lankhorst
2016-01-21 13:27     ` Zanoni, Paulo R
2016-01-21 13:32       ` Maarten Lankhorst
2016-01-21 20:07   ` Paulo Zanoni
2016-01-19 13:35 ` [PATCH 09/25] drm/i915/fbc: introduce struct intel_fbc_state_cache Paulo Zanoni
2016-01-19 13:35 ` [PATCH 10/25] drm/i915/fbc: split intel_fbc_update into pre and post update Paulo Zanoni
2016-01-19 13:35 ` [PATCH 11/25] drm/i915/fbc: fix the FBC state checking code Paulo Zanoni
2016-08-15 20:55   ` Chris Wilson
2016-08-15 22:47     ` Zanoni, Paulo R
2016-08-16  7:36       ` chris
2016-01-19 13:35 ` [PATCH 12/25] drm/i915/fbc: unexport intel_fbc_deactivate Paulo Zanoni
2016-01-19 13:35 ` [PATCH 13/25] drm/i915/fbc: rename the FBC disable functions Paulo Zanoni
2016-01-19 13:35 ` [PATCH 14/25] drm/i915/fbc: make sure we cancel the work function at fbc_disable Paulo Zanoni
2016-01-19 13:35 ` [PATCH 15/25] drm/i915/fbc: rewrite the multiple_pipes_ok() code for locking Paulo Zanoni
2016-01-21 13:29   ` Maarten Lankhorst
2016-01-19 13:35 ` [PATCH 16/25] drm/i915: simplify struct drm_device access at intel_atomic_check() Paulo Zanoni
2016-01-19 13:35 ` [PATCH 17/25] drm/i915/fbc: choose the new FBC CRTC during atomic check Paulo Zanoni
2016-01-19 13:35 ` [PATCH 18/25] drm/i915/fbc: move intel_fbc_{enable, disable} call one level up Paulo Zanoni
2016-01-19 13:35 ` [PATCH 19/25] drm/i915/fbc: make FBC work with fastboot Paulo Zanoni
2016-01-19 13:35 ` [PATCH 20/25] drm/i915/fbc: don't try to deactivate FBC if it's not enabled Paulo Zanoni
2016-01-19 13:35 ` [PATCH 21/25] drm/i915/fbc: don't print no_fbc_reason to dmesg Paulo Zanoni
2016-01-19 13:35 ` [PATCH 22/25] drm/i915/fbc: don't store the fb_id on reg_params Paulo Zanoni
2016-01-19 13:35 ` [PATCH 23/25] drm/i915/fbc: call intel_fbc_pre_update earlier during page flips Paulo Zanoni
2016-01-19 13:35 ` [PATCH 24/25] drm/i915/fbc: don't store/check a pointer to the FB Paulo Zanoni
2016-01-19 13:35 ` [PATCH 25/25] drm/i915/fbc: refactor some small functions called only once Paulo Zanoni
2016-01-19 14:50 ` ✗ Fi.CI.BAT: warning for FBC crtc/fb locking + smaller fixes Patchwork
2016-01-21 20:14   ` Zanoni, Paulo R
2016-01-22 11:28     ` Damien Lespiau
2016-01-25 16:26       ` Daniel Vetter
2016-01-21 14:17 ` [PATCH 00/25] " Maarten Lankhorst
2016-01-22  8:01 ` ✗ Fi.CI.BAT: failure for FBC crtc/fb locking + smaller fixes (rev3) Patchwork

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=1453831704.12148.43.camel@intel.com \
    --to=paulo.r.zanoni@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=rodrigo.vivi@gmail.com \
    /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.