diff options
Diffstat (limited to 'lib/rwsem-spinlock.c')
| -rw-r--r-- | lib/rwsem-spinlock.c | 14 | 
1 files changed, 8 insertions, 6 deletions
diff --git a/lib/rwsem-spinlock.c b/lib/rwsem-spinlock.c index ccf95bff798..ffc9fc7f3b0 100644 --- a/lib/rwsem-spinlock.c +++ b/lib/rwsem-spinlock.c @@ -143,13 +143,14 @@ void __sched __down_read(struct rw_semaphore *sem)  {  	struct rwsem_waiter waiter;  	struct task_struct *tsk; +	unsigned long flags; -	spin_lock_irq(&sem->wait_lock); +	spin_lock_irqsave(&sem->wait_lock, flags);  	if (sem->activity >= 0 && list_empty(&sem->wait_list)) {  		/* granted */  		sem->activity++; -		spin_unlock_irq(&sem->wait_lock); +		spin_unlock_irqrestore(&sem->wait_lock, flags);  		goto out;  	} @@ -164,7 +165,7 @@ void __sched __down_read(struct rw_semaphore *sem)  	list_add_tail(&waiter.list, &sem->wait_list);  	/* we don't need to touch the semaphore struct anymore */ -	spin_unlock_irq(&sem->wait_lock); +	spin_unlock_irqrestore(&sem->wait_lock, flags);  	/* wait to be given the lock */  	for (;;) { @@ -209,13 +210,14 @@ void __sched __down_write_nested(struct rw_semaphore *sem, int subclass)  {  	struct rwsem_waiter waiter;  	struct task_struct *tsk; +	unsigned long flags; -	spin_lock_irq(&sem->wait_lock); +	spin_lock_irqsave(&sem->wait_lock, flags);  	if (sem->activity == 0 && list_empty(&sem->wait_list)) {  		/* granted */  		sem->activity = -1; -		spin_unlock_irq(&sem->wait_lock); +		spin_unlock_irqrestore(&sem->wait_lock, flags);  		goto out;  	} @@ -230,7 +232,7 @@ void __sched __down_write_nested(struct rw_semaphore *sem, int subclass)  	list_add_tail(&waiter.list, &sem->wait_list);  	/* we don't need to touch the semaphore struct anymore */ -	spin_unlock_irq(&sem->wait_lock); +	spin_unlock_irqrestore(&sem->wait_lock, flags);  	/* wait to be given the lock */  	for (;;) {  |