diff options
author | Imre Deak <imre.deak@intel.com> | 2012-11-02 07:30:48 -0400 |
---|---|---|
committer | Inki Dae <daeinki@gmail.com> | 2012-11-29 06:30:33 -0500 |
commit | e1f48ee58a90ddf84f514334b5d395a358596492 (patch) | |
tree | fe122bc62387c70c075a8a7e53a384878edfe4a6 | |
parent | 85473328bac6170aabb5e13d2542d11d1fc4cc76 (diff) |
drm/exynos: call drm_vblank_put for each queued flip event
It's guaranteed that for each event on pageflip_event_list we have
called drm_vblank_get() - see exynos_drm_crtc_page_flip() - so checking
for this is redundant.
Also we need to call drm_vblank_put() for each event on the list, not
only once, otherwise we'd leak vblank references if there are multiple
events on the list.
Signed-off-by: Imre Deak <imre.deak@intel.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_fimd.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_vidi.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_mixer.c | 11 |
3 files changed, 3 insertions, 24 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index e08478f19f1a..23a57f4da478 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c | |||
@@ -642,17 +642,11 @@ static void fimd_finish_pageflip(struct drm_device *drm_dev, int crtc) | |||
642 | 642 | ||
643 | list_move_tail(&e->base.link, &e->base.file_priv->event_list); | 643 | list_move_tail(&e->base.link, &e->base.file_priv->event_list); |
644 | wake_up_interruptible(&e->base.file_priv->event_wait); | 644 | wake_up_interruptible(&e->base.file_priv->event_wait); |
645 | drm_vblank_put(drm_dev, crtc); | ||
645 | } | 646 | } |
646 | 647 | ||
647 | if (is_checked) { | 648 | if (is_checked) { |
648 | /* | 649 | /* |
649 | * call drm_vblank_put only in case that drm_vblank_get was | ||
650 | * called. | ||
651 | */ | ||
652 | if (atomic_read(&drm_dev->vblank_refcount[crtc]) > 0) | ||
653 | drm_vblank_put(drm_dev, crtc); | ||
654 | |||
655 | /* | ||
656 | * don't off vblank if vblank_disable_allowed is 1, | 650 | * don't off vblank if vblank_disable_allowed is 1, |
657 | * because vblank would be off by timer handler. | 651 | * because vblank would be off by timer handler. |
658 | */ | 652 | */ |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c index e4b8a8f741f7..e26d45577551 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c | |||
@@ -401,17 +401,11 @@ static void vidi_finish_pageflip(struct drm_device *drm_dev, int crtc) | |||
401 | 401 | ||
402 | list_move_tail(&e->base.link, &e->base.file_priv->event_list); | 402 | list_move_tail(&e->base.link, &e->base.file_priv->event_list); |
403 | wake_up_interruptible(&e->base.file_priv->event_wait); | 403 | wake_up_interruptible(&e->base.file_priv->event_wait); |
404 | drm_vblank_put(drm_dev, crtc); | ||
404 | } | 405 | } |
405 | 406 | ||
406 | if (is_checked) { | 407 | if (is_checked) { |
407 | /* | 408 | /* |
408 | * call drm_vblank_put only in case that drm_vblank_get was | ||
409 | * called. | ||
410 | */ | ||
411 | if (atomic_read(&drm_dev->vblank_refcount[crtc]) > 0) | ||
412 | drm_vblank_put(drm_dev, crtc); | ||
413 | |||
414 | /* | ||
415 | * don't off vblank if vblank_disable_allowed is 1, | 409 | * don't off vblank if vblank_disable_allowed is 1, |
416 | * because vblank would be off by timer handler. | 410 | * because vblank would be off by timer handler. |
417 | */ | 411 | */ |
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index e7fbb823fd8e..0d3ed282376c 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c | |||
@@ -884,7 +884,6 @@ static void mixer_finish_pageflip(struct drm_device *drm_dev, int crtc) | |||
884 | struct drm_pending_vblank_event *e, *t; | 884 | struct drm_pending_vblank_event *e, *t; |
885 | struct timeval now; | 885 | struct timeval now; |
886 | unsigned long flags; | 886 | unsigned long flags; |
887 | bool is_checked = false; | ||
888 | 887 | ||
889 | spin_lock_irqsave(&drm_dev->event_lock, flags); | 888 | spin_lock_irqsave(&drm_dev->event_lock, flags); |
890 | 889 | ||
@@ -894,7 +893,6 @@ static void mixer_finish_pageflip(struct drm_device *drm_dev, int crtc) | |||
894 | if (crtc != e->pipe) | 893 | if (crtc != e->pipe) |
895 | continue; | 894 | continue; |
896 | 895 | ||
897 | is_checked = true; | ||
898 | do_gettimeofday(&now); | 896 | do_gettimeofday(&now); |
899 | e->event.sequence = 0; | 897 | e->event.sequence = 0; |
900 | e->event.tv_sec = now.tv_sec; | 898 | e->event.tv_sec = now.tv_sec; |
@@ -902,16 +900,9 @@ static void mixer_finish_pageflip(struct drm_device *drm_dev, int crtc) | |||
902 | 900 | ||
903 | list_move_tail(&e->base.link, &e->base.file_priv->event_list); | 901 | list_move_tail(&e->base.link, &e->base.file_priv->event_list); |
904 | wake_up_interruptible(&e->base.file_priv->event_wait); | 902 | wake_up_interruptible(&e->base.file_priv->event_wait); |
903 | drm_vblank_put(drm_dev, crtc); | ||
905 | } | 904 | } |
906 | 905 | ||
907 | if (is_checked) | ||
908 | /* | ||
909 | * call drm_vblank_put only in case that drm_vblank_get was | ||
910 | * called. | ||
911 | */ | ||
912 | if (atomic_read(&drm_dev->vblank_refcount[crtc]) > 0) | ||
913 | drm_vblank_put(drm_dev, crtc); | ||
914 | |||
915 | spin_unlock_irqrestore(&drm_dev->event_lock, flags); | 906 | spin_unlock_irqrestore(&drm_dev->event_lock, flags); |
916 | } | 907 | } |
917 | 908 | ||