diff options
| -rw-r--r-- | drivers/gpu/drm/drm_bufs.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_fops.c | 14 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_lock.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_stub.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 5 |
5 files changed, 20 insertions, 12 deletions
diff --git a/drivers/gpu/drm/drm_bufs.c b/drivers/gpu/drm/drm_bufs.c index 72c667f9bee1..12715d3c078d 100644 --- a/drivers/gpu/drm/drm_bufs.c +++ b/drivers/gpu/drm/drm_bufs.c | |||
| @@ -420,7 +420,7 @@ int drm_rmmap_locked(struct drm_device *dev, drm_local_map_t *map) | |||
| 420 | dev->sigdata.lock = NULL; | 420 | dev->sigdata.lock = NULL; |
| 421 | master->lock.hw_lock = NULL; /* SHM removed */ | 421 | master->lock.hw_lock = NULL; /* SHM removed */ |
| 422 | master->lock.file_priv = NULL; | 422 | master->lock.file_priv = NULL; |
| 423 | wake_up_interruptible(&master->lock.lock_queue); | 423 | wake_up_interruptible_all(&master->lock.lock_queue); |
| 424 | } | 424 | } |
| 425 | break; | 425 | break; |
| 426 | case _DRM_AGP: | 426 | case _DRM_AGP: |
diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c index 6c020fe5431c..f52663ebe016 100644 --- a/drivers/gpu/drm/drm_fops.c +++ b/drivers/gpu/drm/drm_fops.c | |||
| @@ -484,6 +484,7 @@ int drm_release(struct inode *inode, struct file *filp) | |||
| 484 | mutex_lock(&dev->struct_mutex); | 484 | mutex_lock(&dev->struct_mutex); |
| 485 | 485 | ||
| 486 | if (file_priv->is_master) { | 486 | if (file_priv->is_master) { |
| 487 | struct drm_master *master = file_priv->master; | ||
| 487 | struct drm_file *temp; | 488 | struct drm_file *temp; |
| 488 | list_for_each_entry(temp, &dev->filelist, lhead) { | 489 | list_for_each_entry(temp, &dev->filelist, lhead) { |
| 489 | if ((temp->master == file_priv->master) && | 490 | if ((temp->master == file_priv->master) && |
| @@ -491,6 +492,19 @@ int drm_release(struct inode *inode, struct file *filp) | |||
| 491 | temp->authenticated = 0; | 492 | temp->authenticated = 0; |
| 492 | } | 493 | } |
| 493 | 494 | ||
| 495 | /** | ||
| 496 | * Since the master is disappearing, so is the | ||
| 497 | * possibility to lock. | ||
| 498 | */ | ||
| 499 | |||
| 500 | if (master->lock.hw_lock) { | ||
| 501 | if (dev->sigdata.lock == master->lock.hw_lock) | ||
| 502 | dev->sigdata.lock = NULL; | ||
| 503 | master->lock.hw_lock = NULL; | ||
| 504 | master->lock.file_priv = NULL; | ||
| 505 | wake_up_interruptible_all(&master->lock.lock_queue); | ||
| 506 | } | ||
| 507 | |||
| 494 | if (file_priv->minor->master == file_priv->master) { | 508 | if (file_priv->minor->master == file_priv->master) { |
| 495 | /* drop the reference held my the minor */ | 509 | /* drop the reference held my the minor */ |
| 496 | drm_master_put(&file_priv->minor->master); | 510 | drm_master_put(&file_priv->minor->master); |
diff --git a/drivers/gpu/drm/drm_lock.c b/drivers/gpu/drm/drm_lock.c index 46e7b28f0707..e2f70a516c34 100644 --- a/drivers/gpu/drm/drm_lock.c +++ b/drivers/gpu/drm/drm_lock.c | |||
| @@ -80,6 +80,7 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv) | |||
| 80 | __set_current_state(TASK_INTERRUPTIBLE); | 80 | __set_current_state(TASK_INTERRUPTIBLE); |
| 81 | if (!master->lock.hw_lock) { | 81 | if (!master->lock.hw_lock) { |
| 82 | /* Device has been unregistered */ | 82 | /* Device has been unregistered */ |
| 83 | send_sig(SIGTERM, current, 0); | ||
| 83 | ret = -EINTR; | 84 | ret = -EINTR; |
| 84 | break; | 85 | break; |
| 85 | } | 86 | } |
| @@ -93,7 +94,7 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv) | |||
| 93 | /* Contention */ | 94 | /* Contention */ |
| 94 | schedule(); | 95 | schedule(); |
| 95 | if (signal_pending(current)) { | 96 | if (signal_pending(current)) { |
| 96 | ret = -ERESTARTSYS; | 97 | ret = -EINTR; |
| 97 | break; | 98 | break; |
| 98 | } | 99 | } |
| 99 | } | 100 | } |
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c index 46bb923b097c..096e2a37446d 100644 --- a/drivers/gpu/drm/drm_stub.c +++ b/drivers/gpu/drm/drm_stub.c | |||
| @@ -146,14 +146,6 @@ static void drm_master_destroy(struct kref *kref) | |||
| 146 | 146 | ||
| 147 | drm_ht_remove(&master->magiclist); | 147 | drm_ht_remove(&master->magiclist); |
| 148 | 148 | ||
| 149 | if (master->lock.hw_lock) { | ||
| 150 | if (dev->sigdata.lock == master->lock.hw_lock) | ||
| 151 | dev->sigdata.lock = NULL; | ||
| 152 | master->lock.hw_lock = NULL; | ||
| 153 | master->lock.file_priv = NULL; | ||
| 154 | wake_up_interruptible(&master->lock.lock_queue); | ||
| 155 | } | ||
| 156 | |||
| 157 | drm_free(master, sizeof(*master), DRM_MEM_DRIVER); | 149 | drm_free(master, sizeof(*master), DRM_MEM_DRIVER); |
| 158 | } | 150 | } |
| 159 | 151 | ||
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 548ff2c66431..87b6b603469e 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -383,12 +383,13 @@ int i915_irq_emit(struct drm_device *dev, void *data, | |||
| 383 | drm_i915_irq_emit_t *emit = data; | 383 | drm_i915_irq_emit_t *emit = data; |
| 384 | int result; | 384 | int result; |
| 385 | 385 | ||
| 386 | RING_LOCK_TEST_WITH_RETURN(dev, file_priv); | ||
| 387 | |||
| 388 | if (!dev_priv) { | 386 | if (!dev_priv) { |
| 389 | DRM_ERROR("called with no initialization\n"); | 387 | DRM_ERROR("called with no initialization\n"); |
| 390 | return -EINVAL; | 388 | return -EINVAL; |
| 391 | } | 389 | } |
| 390 | |||
| 391 | RING_LOCK_TEST_WITH_RETURN(dev, file_priv); | ||
| 392 | |||
| 392 | mutex_lock(&dev->struct_mutex); | 393 | mutex_lock(&dev->struct_mutex); |
| 393 | result = i915_emit_irq(dev); | 394 | result = i915_emit_irq(dev); |
| 394 | mutex_unlock(&dev->struct_mutex); | 395 | mutex_unlock(&dev->struct_mutex); |
