diff options
author | Michel Dänzer <michel@tungstengraphics.com> | 2006-08-16 15:47:22 +0200 |
---|---|---|
committer | Michel Dänzer <michel@tungstengraphics.com> | 2006-09-29 12:55:08 +0200 |
commit | a7b8c8d523d7f726b8fb74cb37f807d2316cf5dd (patch) | |
tree | f5a51341055bd6898cbff5f79af04c39449e17b8 /linux-core/drm_lock.c | |
parent | 596d7e998403f565a796c431dbbcaf9e0c49908b (diff) |
Add support for interrupt triggered driver callback with lock held to DRM core.
(cherry picked from d817cc1f30060fcc4a85a05b2de8a2a1687421b5 commit)
Diffstat (limited to 'linux-core/drm_lock.c')
-rw-r--r-- | linux-core/drm_lock.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/linux-core/drm_lock.c b/linux-core/drm_lock.c index 86ee25cb..04c145a6 100644 --- a/linux-core/drm_lock.c +++ b/linux-core/drm_lock.c @@ -155,6 +155,7 @@ int drm_unlock(struct inode *inode, struct file *filp, drm_file_t *priv = filp->private_data; drm_device_t *dev = priv->head->dev; drm_lock_t lock; + unsigned int irqflags; if (copy_from_user(&lock, (drm_lock_t __user *) arg, sizeof(lock))) return -EFAULT; @@ -165,6 +166,16 @@ int drm_unlock(struct inode *inode, struct file *filp, return -EINVAL; } + spin_lock_irqsave(&dev->tasklet_lock, irqflags); + + if (dev->locked_tasklet_func) { + dev->locked_tasklet_func(dev); + + dev->locked_tasklet_func = NULL; + } + + spin_unlock_irqrestore(&dev->tasklet_lock, irqflags); + atomic_inc(&dev->counts[_DRM_STAT_UNLOCKS]); /* kernel_context_switch isn't used by any of the x86 drm |