diff options
author | Chris Wilson <[email protected]> | 2010-12-01 19:41:31 +0000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2010-12-08 09:31:52 +1000 |
commit | ea5d552c73707645c53d42e8a71c9a4d9cbb85c1 (patch) | |
tree | 566a4e3dc33eb9bcee23c5930d8f44844565d4be | |
parent | e516c7df4cfe335a2ea220480cfac558dc738ae4 (diff) |
drm: Add missing drm_vblank_put() along queue vblank error path
Signed-off-by: Chris Wilson <[email protected]>
Cc: Kristian Høgsberg <[email protected]>
Acked-by: Jesse Barnes <[email protected]>
Signed-off-by: Dave Airlie <[email protected]>
-rw-r--r-- | drivers/gpu/drm/drm_irq.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 9d3a5030b6e1..722700d5d73e 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, struct timeval now; unsigned long flags; unsigned int seq; + int ret; e = kzalloc(sizeof *e, GFP_KERNEL); - if (e == NULL) - return -ENOMEM; + if (e == NULL) { + ret = -ENOMEM; + goto err_put; + } e->pipe = pipe; e->base.pid = current->pid; @@ -603,9 +606,8 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe, spin_lock_irqsave(&dev->event_lock, flags); if (file_priv->event_space < sizeof e->event) { - spin_unlock_irqrestore(&dev->event_lock, flags); - kfree(e); - return -ENOMEM; + ret = -EBUSY; + goto err_unlock; } file_priv->event_space -= sizeof e->event; @@ -638,6 +640,13 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe, spin_unlock_irqrestore(&dev->event_lock, flags); return 0; + +err_unlock: + spin_unlock_irqrestore(&dev->event_lock, flags); + kfree(e); +err_put: + drm_vblank_put(dev, e->pipe); + return ret; } /** |