diff options
Diffstat (limited to 'drivers/gpu/drm/drm_atomic.c')
| -rw-r--r-- | drivers/gpu/drm/drm_atomic.c | 13 | 
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 50f5cf7b69d1..fdfb1ec17e66 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -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)  | 
