Hi Laurent, On Mon, Feb 13, 2017 at 11:05 AM, Geert Uytterhoeven <geert@xxxxxxxxxxxxxx> wrote: > On Sun, Feb 12, 2017 at 2:13 PM, Laurent Pinchart > <laurent.pinchart@xxxxxxxxxxxxxxxx> wrote: >> The following changes since commit 5685cab84a6dc376a8d0e4534ae4b973546158b4: >> >> Merge remote-tracking branch 'drm-misc/drm-misc-next' into drm/next/base >> (2017-02-12 13:18:50 +0200) >> >> are available in the git repository at: >> >> git://linuxtv.org/pinchartl/media.git drm/next/du >> >> for you to fetch changes up to a194138cd82dff52d4c39895fd89dc6f26eafc97: >> >> drm: rcar-du: Use DRM core's atomic commit helper (2017-02-12 14:15:36 >> +0200) > > Thank you, scheduled for inclusion in next renesas-drivers release > (probably renesas-drivers-2017-02-21-v4.10). Hit send too soon... Note that it already fails to merge cleanly into today's linux-next (holding wood, rabbit ears and tails, ... for next week). My untested resolution: diff --cc drivers/gpu/drm/drm_atomic.c index a5673107db26c403,428743efc031e717..0000000000000000 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@@ -1938,8 -1949,8 +1949,8 @@@ static int prepare_crtc_signaling(struc if (arg->flags & DRM_MODE_ATOMIC_TEST_ONLY) return 0; - for_each_crtc_in_state(state, crtc, crtc_state, i) { + for_each_new_crtc_in_state(state, crtc, crtc_state, i) { - u64 __user *fence_ptr; + s32 __user *fence_ptr; fence_ptr = get_out_fence_for_crtc(crtc_state->state, crtc); @@@ -2018,17 -2029,14 +2029,17 @@@ static void complete_crtc_signaling(str return; } - for_each_crtc_in_state(state, crtc, crtc_state, i) { + for_each_new_crtc_in_state(state, crtc, crtc_state, i) { + struct drm_pending_vblank_event *event = crtc_state->event; /* - * TEST_ONLY and PAGE_FLIP_EVENT are mutually - * exclusive, if they weren't, this code should be - * called on success for TEST_ONLY too. + * Free the allocated event. drm_atomic_helper_setup_commit + * can allocate an event too, so only free it if it's ours + * to prevent a double free in drm_atomic_state_clear. */ - if (crtc_state->event) - drm_event_cancel_free(dev, &crtc_state->event->base); + if (event && (event->base.fence || event->base.file_priv)) { + drm_event_cancel_free(dev, &event->base); + crtc_state->event = NULL; + } } if (!fence_state) Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds