diff options
Diffstat (limited to 'drivers/gpu/drm/drm_irq.c')
| -rw-r--r-- | drivers/gpu/drm/drm_irq.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 9d3a5030b6e1..16d5155edad1 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
| @@ -585,10 +585,13 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe, | |||
| 585 | struct timeval now; | 585 | struct timeval now; |
| 586 | unsigned long flags; | 586 | unsigned long flags; |
| 587 | unsigned int seq; | 587 | unsigned int seq; |
| 588 | int ret; | ||
| 588 | 589 | ||
| 589 | e = kzalloc(sizeof *e, GFP_KERNEL); | 590 | e = kzalloc(sizeof *e, GFP_KERNEL); |
| 590 | if (e == NULL) | 591 | if (e == NULL) { |
| 591 | return -ENOMEM; | 592 | ret = -ENOMEM; |
| 593 | goto err_put; | ||
| 594 | } | ||
| 592 | 595 | ||
| 593 | e->pipe = pipe; | 596 | e->pipe = pipe; |
| 594 | e->base.pid = current->pid; | 597 | e->base.pid = current->pid; |
| @@ -603,9 +606,8 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe, | |||
| 603 | spin_lock_irqsave(&dev->event_lock, flags); | 606 | spin_lock_irqsave(&dev->event_lock, flags); |
| 604 | 607 | ||
| 605 | if (file_priv->event_space < sizeof e->event) { | 608 | if (file_priv->event_space < sizeof e->event) { |
| 606 | spin_unlock_irqrestore(&dev->event_lock, flags); | 609 | ret = -EBUSY; |
| 607 | kfree(e); | 610 | goto err_unlock; |
| 608 | return -ENOMEM; | ||
| 609 | } | 611 | } |
| 610 | 612 | ||
| 611 | file_priv->event_space -= sizeof e->event; | 613 | file_priv->event_space -= sizeof e->event; |
| @@ -626,7 +628,7 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe, | |||
| 626 | if ((seq - vblwait->request.sequence) <= (1 << 23)) { | 628 | if ((seq - vblwait->request.sequence) <= (1 << 23)) { |
| 627 | e->event.tv_sec = now.tv_sec; | 629 | e->event.tv_sec = now.tv_sec; |
| 628 | e->event.tv_usec = now.tv_usec; | 630 | e->event.tv_usec = now.tv_usec; |
| 629 | drm_vblank_put(dev, e->pipe); | 631 | drm_vblank_put(dev, pipe); |
| 630 | list_add_tail(&e->base.link, &e->base.file_priv->event_list); | 632 | list_add_tail(&e->base.link, &e->base.file_priv->event_list); |
| 631 | wake_up_interruptible(&e->base.file_priv->event_wait); | 633 | wake_up_interruptible(&e->base.file_priv->event_wait); |
| 632 | trace_drm_vblank_event_delivered(current->pid, pipe, | 634 | trace_drm_vblank_event_delivered(current->pid, pipe, |
| @@ -638,6 +640,13 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe, | |||
| 638 | spin_unlock_irqrestore(&dev->event_lock, flags); | 640 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| 639 | 641 | ||
| 640 | return 0; | 642 | return 0; |
| 643 | |||
| 644 | err_unlock: | ||
| 645 | spin_unlock_irqrestore(&dev->event_lock, flags); | ||
| 646 | kfree(e); | ||
| 647 | err_put: | ||
| 648 | drm_vblank_put(dev, pipe); | ||
| 649 | return ret; | ||
| 641 | } | 650 | } |
| 642 | 651 | ||
| 643 | /** | 652 | /** |
