diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/mutex.c | 5 | ||||
| -rw-r--r-- | kernel/sched.c | 10 | 
2 files changed, 11 insertions, 4 deletions
diff --git a/kernel/mutex.c b/kernel/mutex.c index 357c6d221ef..524ffc33dc0 100644 --- a/kernel/mutex.c +++ b/kernel/mutex.c @@ -131,6 +131,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,  	struct mutex_waiter waiter;  	unsigned long flags; +	preempt_disable();  	spin_lock_mutex(&lock->wait_lock, flags);  	debug_mutex_lock_common(lock, &waiter); @@ -170,13 +171,14 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,  			spin_unlock_mutex(&lock->wait_lock, flags);  			debug_mutex_free_waiter(&waiter); +			preempt_enable();  			return -EINTR;  		}  		__set_task_state(task, state);  		/* didnt get the lock, go to sleep: */  		spin_unlock_mutex(&lock->wait_lock, flags); -		schedule(); +		__schedule();  		spin_lock_mutex(&lock->wait_lock, flags);  	} @@ -193,6 +195,7 @@ done:  	spin_unlock_mutex(&lock->wait_lock, flags);  	debug_mutex_free_waiter(&waiter); +	preempt_enable();  	return 0;  } diff --git a/kernel/sched.c b/kernel/sched.c index 8be2c13b50d..b001c133c35 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -4538,15 +4538,13 @@ pick_next_task(struct rq *rq, struct task_struct *prev)  /*   * schedule() is the main scheduler function.   */ -asmlinkage void __sched schedule(void) +asmlinkage void __sched __schedule(void)  {  	struct task_struct *prev, *next;  	unsigned long *switch_count;  	struct rq *rq;  	int cpu; -need_resched: -	preempt_disable();  	cpu = smp_processor_id();  	rq = cpu_rq(cpu);  	rcu_qsctr_inc(cpu); @@ -4603,7 +4601,13 @@ need_resched_nonpreemptible:  	if (unlikely(reacquire_kernel_lock(current) < 0))  		goto need_resched_nonpreemptible; +} +asmlinkage void __sched schedule(void) +{ +need_resched: +	preempt_disable(); +	__schedule();  	preempt_enable_no_resched();  	if (unlikely(test_thread_flag(TIF_NEED_RESCHED)))  		goto need_resched;  |