From: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
To: Daniel Vetter <daniel@ffwll.ch>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>,
Haneen Mohammed <hamohammed.sa@gmail.com>,
DRI Development <dri-devel@lists.freedesktop.org>,
Daniel Vetter <daniel.vetter@intel.com>
Subject: Re: [PATCH 06/10] drm/vkms: flush crc workers earlier in commit flow
Date: Mon, 17 Jun 2019 23:31:28 -0300 [thread overview]
Message-ID: <20190618023128.lryjlim2nndnt2mz@smtp.gmail.com> (raw)
In-Reply-To: <20190613075354.GB23020@phenom.ffwll.local>
On 06/13, Daniel Vetter wrote:
> On Wed, Jun 12, 2019 at 10:42:42AM -0300, Rodrigo Siqueira wrote:
> > On Thu, Jun 6, 2019 at 7:28 PM Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
> > >
> > > Currently we flush pending crc workers very late in the commit flow,
> > > when we destry all the old crtc states. Unfortunately at that point
> >
> > destry -> destroy
> >
> > > the framebuffers are already unpinned (and our vaddr possible gone),
> > > so this isn't good. Also, the plane_states we need might also already
> > > be cleaned up, since cleanup order of state structures isn't well
> > > defined.
> > >
> > > Fix this by waiting for all crc workers of the old state to complete
> > > before we start any of the cleanup work.
> > >
> > > Note that this is not yet race-free, because the hrtimer and crc
> > > worker look at the wrong state pointers, but that will be fixed in
> > > subsequent patches.
> > >
> > > Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
> > > Cc: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
> > > Cc: Haneen Mohammed <hamohammed.sa@gmail.com>
> > > Cc: Daniel Vetter <daniel@ffwll.ch>
> > > ---
> > > drivers/gpu/drm/vkms/vkms_crtc.c | 2 +-
> > > drivers/gpu/drm/vkms/vkms_drv.c | 10 ++++++++++
> > > 2 files changed, 11 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c
> > > index 55b16d545fe7..b6987d90805f 100644
> > > --- a/drivers/gpu/drm/vkms/vkms_crtc.c
> > > +++ b/drivers/gpu/drm/vkms/vkms_crtc.c
> > > @@ -125,7 +125,7 @@ static void vkms_atomic_crtc_destroy_state(struct drm_crtc *crtc,
> > > __drm_atomic_helper_crtc_destroy_state(state);
> > >
> > > if (vkms_state) {
> > > - flush_work(&vkms_state->crc_work);
> > > + WARN_ON(work_pending(&vkms_state->crc_work));
> > > kfree(vkms_state);
> > > }
> > > }
> > > diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
> > > index f677ab1d0094..cc53ef88a331 100644
> > > --- a/drivers/gpu/drm/vkms/vkms_drv.c
> > > +++ b/drivers/gpu/drm/vkms/vkms_drv.c
> > > @@ -62,6 +62,9 @@ static void vkms_release(struct drm_device *dev)
> > > static void vkms_atomic_commit_tail(struct drm_atomic_state *old_state)
> > > {
> > > struct drm_device *dev = old_state->dev;
> > > + struct drm_crtc *crtc;
I forgot to point that crtc is set but not used, which make gcc
complain.
And thanks for the explanation below.
> > > + struct drm_crtc_state *old_crtc_state;
> > > + int i;
> > >
> > > drm_atomic_helper_commit_modeset_disables(dev, old_state);
> > >
> > > @@ -75,6 +78,13 @@ static void vkms_atomic_commit_tail(struct drm_atomic_state *old_state)
> > >
> > > drm_atomic_helper_wait_for_vblanks(dev, old_state);
> > >
> > > + for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
> > > + struct vkms_crtc_state *vkms_state =
> > > + to_vkms_crtc_state(old_crtc_state);
> > > +
> > > + flush_work(&vkms_state->crc_work);
> > > + }
> > > +
> > > drm_atomic_helper_cleanup_planes(dev, old_state);
> > > }
> >
> > why not use drm_atomic_helper_commit_tail() here? I mean:
> >
> > for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
> > …
> > }
> >
> > drm_atomic_helper_commit_tail(old_state);
> >
> > After looking at drm_atomic_helper_cleanup_planes() it sounds safe for
> > me to use the above code; I just test it with two tests from
> > crc_cursor. Maybe I missed something, could you help me here?
> >
> > Finally, IMHO, I think that Patch 05, 06 and 07 could be squashed in a
> > single patch to make it easier to understand the change.
>
> I wanted to highlight all the bits a bit more, because this is a lot more
> tricky than it looks. For correct ordering and avoiding races we can't do
> what you suggested. Only after
>
> drm_atomic_helper_wait_for_vblanks()
>
> do we know that all subsequent queue_work will be for the _new_ state.
> Only once that's done is flush_work() actually useful, before that we
> might flush the work, and then right after the hrtimer that simulates
> vblank queues it again. Every time you have a flush_work before cleaning
> up the work structure the folling sequence must be obeyed, or it can go
> wrong:
>
> 1. Make sure no one else can requeue the work anymore (in our case that's
> done by a combination of first updating output->crc_state and then waiting
> for the vblank to pass to make sure the hrtimer has noticed that change).
>
> 2. flush_work()
>
> 3. Actually clean up stuff (which isn't done here).
>
> Doing the flush_work before we even completed the output->state update,
> much less waited for the vblank to make sure that's happened, missed the
> point.
> -Daniel
>
> >
> > > --
> > > 2.20.1
> > >
> >
> >
> > --
> >
> > Rodrigo Siqueira
> > https://siqueira.tech
>
> --
> Daniel Vetter
> Software Engineer, Intel Corporation
> http://blog.ffwll.ch
--
Rodrigo Siqueira
https://siqueira.tech
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2019-06-18 2:31 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-06 22:27 [PATCH 00/10] drm/vkms: rework crc worker Daniel Vetter
2019-06-06 22:27 ` [PATCH 01/10] drm/vkms: Fix crc worker races Daniel Vetter
2019-06-12 13:33 ` Rodrigo Siqueira
2019-06-12 14:48 ` Daniel Vetter
2019-06-18 2:39 ` Rodrigo Siqueira
2019-06-18 8:49 ` Daniel Vetter
2019-06-06 22:27 ` [PATCH 02/10] drm/vkms: Use spin_lock_irq in process context Daniel Vetter
2019-06-12 13:34 ` Rodrigo Siqueira
2019-06-12 14:54 ` Daniel Vetter
2019-06-06 22:27 ` [PATCH 03/10] drm/vkms: Rename vkms_output.state_lock to crc_lock Daniel Vetter
2019-06-12 13:38 ` Rodrigo Siqueira
2019-06-13 7:48 ` Daniel Vetter
2019-06-06 22:27 ` [PATCH 04/10] drm/vkms: Move format arrays to vkms_plane.c Daniel Vetter
2019-06-12 13:39 ` Rodrigo Siqueira
2019-06-19 2:12 ` Rodrigo Siqueira
2019-06-06 22:27 ` [PATCH 05/10] drm/vkms: Add our own commit_tail Daniel Vetter
2019-06-06 22:27 ` [PATCH 06/10] drm/vkms: flush crc workers earlier in commit flow Daniel Vetter
2019-06-12 13:42 ` Rodrigo Siqueira
2019-06-13 7:53 ` Daniel Vetter
2019-06-13 7:55 ` Daniel Vetter
2019-06-18 2:31 ` Rodrigo Siqueira [this message]
2019-06-06 22:27 ` [PATCH 07/10] drm/vkms: Dont flush crc worker when we change crc status Daniel Vetter
2019-06-19 2:17 ` Rodrigo Siqueira
2019-06-19 7:47 ` Daniel Vetter
2019-06-06 22:27 ` [PATCH 08/10] drm/vkms: No _irqsave within spin_lock_irq needed Daniel Vetter
2019-06-12 13:43 ` Rodrigo Siqueira
2019-06-06 22:27 ` [PATCH 09/10] drm/vkms: totally reworked crc data tracking Daniel Vetter
2019-06-12 13:46 ` Rodrigo Siqueira
2019-06-13 7:59 ` Daniel Vetter
2019-06-06 22:27 ` [PATCH 10/10] drm/vkms: No need for ->pages_lock in crc work anymore Daniel Vetter
2019-06-12 13:47 ` Rodrigo Siqueira
2019-06-12 13:28 ` [PATCH 00/10] drm/vkms: rework crc worker Rodrigo Siqueira
2019-06-12 14:42 ` Daniel Vetter
2019-06-18 2:49 ` Rodrigo Siqueira
2019-06-18 8:56 ` Daniel Vetter
2019-06-18 21:54 ` Rodrigo Siqueira
2019-06-18 22:06 ` Daniel Vetter
2019-06-18 22:07 ` Daniel Vetter
2019-06-18 22:25 ` Rodrigo Siqueira
2019-06-18 22:39 ` Daniel Vetter
2019-06-26 1:44 ` Rodrigo Siqueira
2019-06-26 7:54 ` Daniel Vetter
2019-06-26 13:46 ` Rodrigo Siqueira
2019-07-01 3:30 ` Rodrigo Siqueira
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=20190618023128.lryjlim2nndnt2mz@smtp.gmail.com \
--to=rodrigosiqueiramelo@gmail.com \
--cc=daniel.vetter@ffwll.ch \
--cc=daniel.vetter@intel.com \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=hamohammed.sa@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox