diff options
Diffstat (limited to 'kernel/kthread.c')
| -rw-r--r-- | kernel/kthread.c | 17 | 
1 files changed, 15 insertions, 2 deletions
diff --git a/kernel/kthread.c b/kernel/kthread.c index b262f47046ca..bfbfa481be3a 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -199,8 +199,15 @@ static void __kthread_parkme(struct kthread *self)  		if (!test_bit(KTHREAD_SHOULD_PARK, &self->flags))  			break; +		/* +		 * Thread is going to call schedule(), do not preempt it, +		 * or the caller of kthread_park() may spend more time in +		 * wait_task_inactive(). +		 */ +		preempt_disable();  		complete(&self->parked); -		schedule(); +		schedule_preempt_disabled(); +		preempt_enable();  	}  	__set_current_state(TASK_RUNNING);  } @@ -245,8 +252,14 @@ static int kthread(void *_create)  	/* OK, tell user we're spawned, wait for stop or wakeup */  	__set_current_state(TASK_UNINTERRUPTIBLE);  	create->result = current; +	/* +	 * Thread is going to call schedule(), do not preempt it, +	 * or the creator may spend more time in wait_task_inactive(). +	 */ +	preempt_disable();  	complete(done); -	schedule(); +	schedule_preempt_disabled(); +	preempt_enable();  	ret = -EINTR;  	if (!test_bit(KTHREAD_SHOULD_STOP, &self->flags)) {  |