diff options
Diffstat (limited to 'drivers/gpu/drm/drm_irq.c')
| -rw-r--r-- | drivers/gpu/drm/drm_irq.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 089c015c01d1..53f0e5af1cc8 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
| @@ -400,27 +400,31 @@ static void drm_locked_tasklet_func(unsigned long data) | |||
| 400 | { | 400 | { |
| 401 | struct drm_device *dev = (struct drm_device *)data; | 401 | struct drm_device *dev = (struct drm_device *)data; |
| 402 | unsigned long irqflags; | 402 | unsigned long irqflags; |
| 403 | 403 | void (*tasklet_func)(struct drm_device *); | |
| 404 | |||
| 404 | spin_lock_irqsave(&dev->tasklet_lock, irqflags); | 405 | spin_lock_irqsave(&dev->tasklet_lock, irqflags); |
| 406 | tasklet_func = dev->locked_tasklet_func; | ||
| 407 | spin_unlock_irqrestore(&dev->tasklet_lock, irqflags); | ||
| 405 | 408 | ||
| 406 | if (!dev->locked_tasklet_func || | 409 | if (!tasklet_func || |
| 407 | !drm_lock_take(&dev->lock, | 410 | !drm_lock_take(&dev->lock, |
| 408 | DRM_KERNEL_CONTEXT)) { | 411 | DRM_KERNEL_CONTEXT)) { |
| 409 | spin_unlock_irqrestore(&dev->tasklet_lock, irqflags); | ||
| 410 | return; | 412 | return; |
| 411 | } | 413 | } |
| 412 | 414 | ||
| 413 | dev->lock.lock_time = jiffies; | 415 | dev->lock.lock_time = jiffies; |
| 414 | atomic_inc(&dev->counts[_DRM_STAT_LOCKS]); | 416 | atomic_inc(&dev->counts[_DRM_STAT_LOCKS]); |
| 415 | 417 | ||
| 416 | dev->locked_tasklet_func(dev); | 418 | spin_lock_irqsave(&dev->tasklet_lock, irqflags); |
| 419 | tasklet_func = dev->locked_tasklet_func; | ||
| 420 | dev->locked_tasklet_func = NULL; | ||
| 421 | spin_unlock_irqrestore(&dev->tasklet_lock, irqflags); | ||
| 422 | |||
| 423 | if (tasklet_func != NULL) | ||
| 424 | tasklet_func(dev); | ||
| 417 | 425 | ||
| 418 | drm_lock_free(&dev->lock, | 426 | drm_lock_free(&dev->lock, |
| 419 | DRM_KERNEL_CONTEXT); | 427 | DRM_KERNEL_CONTEXT); |
| 420 | |||
| 421 | dev->locked_tasklet_func = NULL; | ||
| 422 | |||
| 423 | spin_unlock_irqrestore(&dev->tasklet_lock, irqflags); | ||
| 424 | } | 428 | } |
| 425 | 429 | ||
| 426 | /** | 430 | /** |
