]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.19-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 24 Aug 2020 07:23:00 +0000 (09:23 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 24 Aug 2020 07:23:00 +0000 (09:23 +0200)
added patches:
kthread-do-not-preempt-current-task-if-it-is-going-to-call-schedule.patch

queue-4.19/kthread-do-not-preempt-current-task-if-it-is-going-to-call-schedule.patch [new file with mode: 0644]
queue-4.19/series

diff --git a/queue-4.19/kthread-do-not-preempt-current-task-if-it-is-going-to-call-schedule.patch b/queue-4.19/kthread-do-not-preempt-current-task-if-it-is-going-to-call-schedule.patch
new file mode 100644 (file)
index 0000000..df2d435
--- /dev/null
@@ -0,0 +1,76 @@
+From 26c7295be0c5e6da3fa45970e9748be983175b1b Mon Sep 17 00:00:00 2001
+From: Liang Chen <cl@rock-chips.com>
+Date: Fri, 6 Mar 2020 15:01:33 +0800
+Subject: kthread: Do not preempt current task if it is going to call schedule()
+
+From: Liang Chen <cl@rock-chips.com>
+
+commit 26c7295be0c5e6da3fa45970e9748be983175b1b upstream.
+
+when we create a kthread with ktrhead_create_on_cpu(),the child thread
+entry is ktread.c:ktrhead() which will be preempted by the parent after
+call complete(done) while schedule() is not called yet,then the parent
+will call wait_task_inactive(child) but the child is still on the runqueue,
+so the parent will schedule_hrtimeout() for 1 jiffy,it will waste a lot of
+time,especially on startup.
+
+  parent                             child
+ktrhead_create_on_cpu()
+  wait_fo_completion(&done) -----> ktread.c:ktrhead()
+                             |----- complete(done);--wakeup and preempted by parent
+ kthread_bind() <------------|  |-> schedule();--dequeue here
+  wait_task_inactive(child)     |
+   schedule_hrtimeout(1 jiffy) -|
+
+So we hope the child just wakeup parent but not preempted by parent, and the
+child is going to call schedule() soon,then the parent will not call
+schedule_hrtimeout(1 jiffy) as the child is already dequeue.
+
+The same issue for ktrhead_park()&&kthread_parkme().
+This patch can save 120ms on rk312x startup with CONFIG_HZ=300.
+
+Signed-off-by: Liang Chen <cl@rock-chips.com>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
+Link: https://lkml.kernel.org/r/20200306070133.18335-2-cl@rock-chips.com
+Signed-off-by: Chanho Park <chanho61.park@samsung.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ kernel/kthread.c |   17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+--- a/kernel/kthread.c
++++ b/kernel/kthread.c
+@@ -190,8 +190,15 @@ static void __kthread_parkme(struct kthr
+               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);
+ }
+@@ -236,8 +243,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)) {
index 5d82a9fe163dde7d1ffca9616515d228da15f76c..78a28c57a9cb8ac26ea5967735a0012769e9de87 100644 (file)
@@ -16,6 +16,7 @@ jbd2-add-the-missing-unlock_buffer-in-the-error-path-of-jbd2_write_superblock.pa
 scsi-zfcp-fix-use-after-free-in-request-timeout-handlers.patch
 mm-memory.c-skip-spurious-tlb-flush-for-retried-page-fault.patch
 drm-amd-display-fix-pow-crashing-when-given-base-0.patch
+kthread-do-not-preempt-current-task-if-it-is-going-to-call-schedule.patch
 spi-prevent-adding-devices-below-an-unregistering-co.patch
 scsi-ufs-add-delay_before_lpm-quirk-for-micron-devic.patch
 scsi-target-tcmu-fix-crash-in-tcmu_flush_dcache_rang.patch