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)  				dev->sigdata.lock = NULL;  			master->lock.hw_lock = NULL;   /* SHM removed */  			master->lock.file_priv = NULL; -			wake_up_interruptible(&master->lock.lock_queue); +			wake_up_interruptible_all(&master->lock.lock_queue);  		}  		break;  	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)  	mutex_lock(&dev->struct_mutex);  	if (file_priv->is_master) { +		struct drm_master *master = file_priv->master;  		struct drm_file *temp;  		list_for_each_entry(temp, &dev->filelist, lhead) {  			if ((temp->master == file_priv->master) && @@ -491,6 +492,19 @@ int drm_release(struct inode *inode, struct file *filp)  				temp->authenticated = 0;  		} +		/** +		 * Since the master is disappearing, so is the +		 * possibility to lock. +		 */ + +		if (master->lock.hw_lock) { +			if (dev->sigdata.lock == master->lock.hw_lock) +				dev->sigdata.lock = NULL; +			master->lock.hw_lock = NULL; +			master->lock.file_priv = NULL; +			wake_up_interruptible_all(&master->lock.lock_queue); +		} +  		if (file_priv->minor->master == file_priv->master) {  			/* drop the reference held my the minor */  			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)  		__set_current_state(TASK_INTERRUPTIBLE);  		if (!master->lock.hw_lock) {  			/* Device has been unregistered */ +			send_sig(SIGTERM, current, 0);  			ret = -EINTR;  			break;  		} @@ -93,7 +94,7 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv)  		/* Contention */  		schedule();  		if (signal_pending(current)) { -			ret = -ERESTARTSYS; +			ret = -EINTR;  			break;  		}  	} 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)  	drm_ht_remove(&master->magiclist); -	if (master->lock.hw_lock) { -		if (dev->sigdata.lock == master->lock.hw_lock) -			dev->sigdata.lock = NULL; -		master->lock.hw_lock = NULL; -		master->lock.file_priv = NULL; -		wake_up_interruptible(&master->lock.lock_queue); -	} -  	drm_free(master, sizeof(*master), DRM_MEM_DRIVER);  } 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,  	drm_i915_irq_emit_t *emit = data;  	int result; -	RING_LOCK_TEST_WITH_RETURN(dev, file_priv); -  	if (!dev_priv) {  		DRM_ERROR("called with no initialization\n");  		return -EINVAL;  	} + +	RING_LOCK_TEST_WITH_RETURN(dev, file_priv); +  	mutex_lock(&dev->struct_mutex);  	result = i915_emit_irq(dev);  	mutex_unlock(&dev->struct_mutex); | 
