aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/kthread.c
diff options
context:
space:
mode:
authorTony Lindgren <tony@atomide.com>2020-04-21 09:36:03 -0700
committerTony Lindgren <tony@atomide.com>2020-04-21 09:36:03 -0700
commit175ae3ad59ab3459652bd2ae3bbc1785aeba1bf3 (patch)
treec7fd682de61e3c2a6cc3ba0e8881b99fafdf969c /kernel/kthread.c
parentARM: dts: OMAP3: disable RNG on N950/N9 (diff)
parentARM: dts: dra7: Fix bus_dma_limit for PCIe (diff)
Merge branch 'fixes-v5.7' into fixes
Diffstat (limited to 'kernel/kthread.c')
-rw-r--r--kernel/kthread.c17
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)) {