|
@@ -2032,13 +2032,16 @@ static void complete_crtc_signaling(struct drm_device *dev,
|
|
|
}
|
|
|
|
|
|
for_each_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)
|